顺序表的创建、插入、更新、删除、显示、销毁
今天是第一次写博客,打算从数据结构最基础的顺序表做起,如有错误,忘多多批评指正。
本人写代码有个习惯就是把代码分模块来写,分为头文件和源文件。首先介绍顺序表头文件的书写:
1、创建顺序表节点;
2、枚举错误类型;
3、顺序表的增删改查;
首先第一步,创建顺序表节点,节点包括顺序表存储数据和数量:
typedef struct List
{
data_t data[SIZE];
int count;
}List;
第二部,枚举错误类型:
enum LIST_ERR_OP
{
LIST_NOT_FOUND = -3,
LIST_FULL_ERR,
LIST_ARG_ERR,
LIST_OK,
LIST_EMPTY_ERR
};
第三步,顺序表的创建、增删改查、销毁和显示:
List* createList();
int insertItemList(List* pList, int iIndex, data_t tData);
int deleteItemList(List* pList, int iIndex, data_t* pData);
int updateItemList(List* pList, data_t oldData, data_t newData);
int searchItemList(List* pList, data_t tData);
int sortList(List* pList);
void destroyList(List** pList);
void showList(List* pList);
如此,顺序表的头文件就写好了,接下来是源文件的书写。
第一步,创建顺序表:
List* createList()
{
List* pList = (List*)malloc(sizeof(List));//创建顺序表;
if (NULL == pList)//判断是否创建成功
{
return NULL;
}
memset(pList, 0, sizeof(List));//清空!注意有malloc的地方同时就要有memset!
return pList;
}
第二步,插入:
int insertItemList(List* pList, int iIndex, data_t tData)
{
if (NULL == pList || iIndex < 0 || iIndex > pList->count)//判断
{
return LIST_ARG_ERR;
}
if (SIZE == pList->count)//判断顺序表是否满
{
return LIST_FULL_ERR;
}
int i;
//这里选用的是尾插法
for (i = pList->count - 1; i >= iIndex; i--)
{
pList->data[i + 1] = pList->data[i];
}
pList->data[iIndex] = tData;
pList->count++;
return LIST_OK;
}
第三步,删除顺序表中的某个数据:
int deleteItemList(List* pList, int iIndex, data_t *pData)
{
if (NULL == pList || iIndex < 0 || iIndex >= pList->count || NULL == pData)
{
return LIST_ARG_ERR;
}
if (0 == pList->count)
{
return LIST_EMPTY_ERR;
}
//保存要删除的元素
*pData = pList->data[iIndex];
int i;
for (i = iIndex; i < pList->count - 1; i++)
{
pList->data[i] = pList->data[i + 1];
}
pList->count--;
return LIST_OK;
}
第三步,更新顺序表中的某一数据:
int updateItemList(List* pList, data_t oldData, data_t newData)
{
if (NULL == pList)
{
return LIST_ARG_ERR;
}
int i;
for (i = 0; i < pList->count; i++)
{
if (pList->data[i] == oldData)
{
pList->data[i] = newData;
}
}
return LIST_OK;
}
第四步,查找顺序表中的元素:
int searchItemList(List* pList, data_t tData)
{
if (NULL == pList)
{
return LIST_ARG_ERR;
}
int i;
for (i = 0; i < pList->count; i++)
{
if (pList->data[i] = tData)
{
printf("%d\n", pList->data[i]);
return i;
}
}
return LIST_NOT_FOUND;
}
第五步,排序,这里使用的是冒泡排序:
int sortList(List* pList)
{
if (NULL == pList)
{
return LIST_ARG_ERR;
}
int i, j;
for (i = 0; i < pList->count - 1; i++)
{
for (j = 0; j < pList->count - i - 1; j++)
{
if (pList->data[j] > pList->data[j + 1])
{
data_t temp = pList->data[j];
pList->data[j] = pList->data[j + 1];
pList->data[j + 1] = temp;
}
}
}
}
最后,销毁和显示过于简单,就一起放出来了:
//销毁顺序表
void destroyList(List** pList)
{
if (NULL == *pList)
{
return;
}
free(*pList);
*pList = NULL;
}
//显示
void showList(List* pList)
{
if (NULL == pList)
{
return ;
}
int i;
for (i = 0; i < pList->count; i++)
{
printf("%d", pList->data[i]);
}
printf("\n");
}
完成这些步骤以后,就可以入手写main函数了,通过调用这些封装好的函数,来实现顺序表的创建、增删改查,销毁和显示。