kx-000007-顺序表-扩容()-其他
kx-000007-顺序表-扩容()
- 顺序表结构体定义。具体的结构体定义请查看头文件:https://www.cnblogs.com/kxwslmsps/p/16937235.html
typedef status int; // 定义函数结果状态
typedef int etype; // 元素数据类型
#define CAPACITY 10 // 定义初始容量typedef struct tag_seqList
{
etype* pbase; //< 表基址 int capacity; //< 表容量 int size; //< 表长度 }mySList;
typedef status int; // 定义函数结果状态
typedef int etype; // 元素数据类型
#define CAPACITY 10 // 定义初始容量
typedef struct tag_seqList
{
etype* pbase; //< 表基址
int capacity; //< 表容量
int size; //< 表长度
}mySList;
- 扩容函数
/**
* @brief 功能:扩容 \n
* @param[in] plist:表结构指针
* @param[in] inc:在表当前容量capacity上扩容inc,令total=capacity+inc,
* @param[in] inc:若totalpbase == NULL)
{
return ERROR;
}
int c = plist->capacity * DOUBLE;
int total = (plist->capacity + inc < c) ? c : (plist->capacity + inc);
etype* pNew = NULL;#if 1 // 用realloc,更方便
pNew = (etype*)realloc(plist->pbase, sizeof(etype) * total);
if (pNew == NULL)
{
return OVERFLOW;
}
#endif#if 0 // 用malloc与memmove,自己实现
pNew = (etype*)malloc(sizeof(etype) * total);
if (pNew == NULL)
{
return OVERFLOW;
}/*
for (int i = 0; i < plist->capacity; i++)
{
pNew[i] = plist->pbase[i];
}// 用malloc会发出缓冲区可能溢出的警告
*/
memmove(pNew, plist->pbase, sizeof(etype) * (plist->capacity));
free(plist->pbase);
#endif // 0plist->pbase = pNew;
plist->capacity = total;
return OK;
}//性能时高时低,性能低时是因为表满,需要扩容,将数据拷贝,导致的性能降低
/**
* @brief 功能:扩容 \n
* @param[in] plist:表结构指针
* @param[in] inc:在表当前容量capacity上扩容inc,令total=capacity+inc,
* @param[in] inc:若total<capacity*DOUBLE,则令total=capacity*DOUBLE
* @return status:返回初始化顺序表是否成功的结果状态标志
* @retval - OK(1):操作成功
* @retval - ERROR(-1):表结构不存在,不可操作
* @retval - OVERFLOW(-2):内存溢出
*/
status sList_expand(mySList* plist, int inc)
{
if (plist == NULL || plist->pbase == NULL)
{
return ERROR;
}
int c = plist->capacity * DOUBLE;
int total = (plist->capacity + inc < c) ? c : (plist->capacity + inc);
etype* pNew = NULL;
#if 1 // 用realloc,更方便
pNew = (etype*)realloc(plist->pbase, sizeof(etype) * total);
if (pNew == NULL)
{
return OVERFLOW;
}
#endif
#if 0 // 用malloc与memmove,自己实现
pNew = (etype*)malloc(sizeof(etype) * total);
if (pNew == NULL)
{
return OVERFLOW;
}
/*
for (int i = 0; i < plist->capacity; i++)
{
pNew[i] = plist->pbase[i];
}// 用malloc会发出缓冲区可能溢出的警告
*/
memmove(pNew, plist->pbase, sizeof(etype) * (plist->capacity));
free(plist->pbase);
#endif // 0
plist->pbase = pNew;
plist->capacity = total;
return OK;
}//性能时高时低,性能低时是因为表满,需要扩容,将数据拷贝,导致的性能降低
- 顺序表结构体定义。具体的结构体定义请查看头文件:https://www.cnblogs.com/kxwslmsps/p/16937235.html
typedef status int; // 定义函数结果状态
typedef int etype; // 元素数据类型
#define CAPACITY 10 // 定义初始容量typedef struct tag_seqList
{
etype* pbase; //< 表基址 int capacity; //< 表容量 int size; //< 表长度 }mySList;
typedef status int; // 定义函数结果状态
typedef int etype; // 元素数据类型
#define CAPACITY 10 // 定义初始容量
typedef struct tag_seqList
{
etype* pbase; //< 表基址
int capacity; //< 表容量
int size; //< 表长度
}mySList;
- 扩容函数
/**
* @brief 功能:扩容 \n
* @param[in] plist:表结构指针
* @param[in] inc:在表当前容量capacity上扩容inc,令total=capacity+inc,
* @param[in] inc:若totalpbase == NULL)
{
return ERROR;
}
int c = plist->capacity * DOUBLE;
int total = (plist->capacity + inc < c) ? c : (plist->capacity + inc);
etype* pNew = NULL;#if 1 // 用realloc,更方便
pNew = (etype*)realloc(plist->pbase, sizeof(etype) * total);
if (pNew == NULL)
{
return OVERFLOW;
}
#endif#if 0 // 用malloc与memmove,自己实现
pNew = (etype*)malloc(sizeof(etype) * total);
if (pNew == NULL)
{
return OVERFLOW;
}/*
for (int i = 0; i < plist->capacity; i++)
{
pNew[i] = plist->pbase[i];
}// 用malloc会发出缓冲区可能溢出的警告
*/
memmove(pNew, plist->pbase, sizeof(etype) * (plist->capacity));
free(plist->pbase);
#endif // 0plist->pbase = pNew;
plist->capacity = total;
return OK;
}//性能时高时低,性能低时是因为表满,需要扩容,将数据拷贝,导致的性能降低
/**
* @brief 功能:扩容 \n
* @param[in] plist:表结构指针
* @param[in] inc:在表当前容量capacity上扩容inc,令total=capacity+inc,
* @param[in] inc:若total<capacity*DOUBLE,则令total=capacity*DOUBLE
* @return status:返回初始化顺序表是否成功的结果状态标志
* @retval - OK(1):操作成功
* @retval - ERROR(-1):表结构不存在,不可操作
* @retval - OVERFLOW(-2):内存溢出
*/
status sList_expand(mySList* plist, int inc)
{
if (plist == NULL || plist->pbase == NULL)
{
return ERROR;
}
int c = plist->capacity * DOUBLE;
int total = (plist->capacity + inc < c) ? c : (plist->capacity + inc);
etype* pNew = NULL;
#if 1 // 用realloc,更方便
pNew = (etype*)realloc(plist->pbase, sizeof(etype) * total);
if (pNew == NULL)
{
return OVERFLOW;
}
#endif
#if 0 // 用malloc与memmove,自己实现
pNew = (etype*)malloc(sizeof(etype) * total);
if (pNew == NULL)
{
return OVERFLOW;
}
/*
for (int i = 0; i < plist->capacity; i++)
{
pNew[i] = plist->pbase[i];
}// 用malloc会发出缓冲区可能溢出的警告
*/
memmove(pNew, plist->pbase, sizeof(etype) * (plist->capacity));
free(plist->pbase);
#endif // 0
plist->pbase = pNew;
plist->capacity = total;
return OK;
}//性能时高时低,性能低时是因为表满,需要扩容,将数据拷贝,导致的性能降低