一 、 定义顺序表结构体
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_size 10 // 顺序表最多能存放MAX_size个Data_type类型的数据
typedef int Data_type;
typedef struct seqlist
{
Data_type arr [MAX_size];
int size;
}Seqlist;
enum VALUE
{
empty_error=-7,
create_error,
full_error ,
pos_error ,
malloc_error ,
NULL_error ,
error,
ok
};
二 、结构体的创建
在定义了结构体之后,我们需要使用malloc函数对结构体进行创建。
int My_malloc(Seqlist **pplist) //申请一片大小为顺序表大小的地址空间 参数为二级指针接受指针plist的地址
{
if ( NULL == pplist)
{
return NULL_error;
}
*pplist = (Seqlist *)malloc(sizeof(Seqlist));
if (NULL == *pplist)
{
return malloc_error;
}
memset (*pplist ,'\0',sizeof(Seqlist)); // 将创建的顺序表的值置为空
return ok;
}
三 、顺序表的插入
实现顺序表的插入,需要将pos作为参数传入。这里值得注意的是,顺序表的插入需要指针从最后一个位置开始,从后向前遍历到pos位置。这样可以避免移动元素的过程中,前值将后值覆盖掉。
int Addlist(Seqlist *plist ,int pos ,Data_type data) // 在pos位置插入新值data
{
if (NULL == plist)
{
printf("create error");
return create_error;
}
if (pos < 0 || pos >plist->size)
{
printf("pos_error");
return pos_error;
}
else if (plist->size >= MAX_size)
{
printf("full error");
return full_error;
}
else
{
for (int i=plist->size-1 ;i>=pos ;i--) //plist->size-1 指向顺序表的最后一个元素
{
plist->arr[i+1] = plist->arr[i];
}
plist->arr[pos] = data;
plist->size++;
}
return ok;
}
四、顺序表的删除
先将要删除的元素保存到deldata中,指针再从pos位置开始从前向后遍历,遍历的过程中将后面的元素前移一个位置,实现元素的覆盖。
int Delete( Seqlist *plist ,int pos, Data_type *deledata)//删除pos位置的数据用deledata接收
{
if ( NULL == plist)
{
printf("空指针");
return NULL_error;
}
if (pos <0 || pos >= plist->size)
{
printf("删除位置错误");
return pos_error;
}
if (plist->size ==0)
{
printf("顺序表以空");
return empty_error;
}
*deledata = plist->arr[pos];
for (int j=pos ;j<plist->size-1;j++)
{
plist->arr[j] = plist->arr[j+1];
}
plist->size--;
return ok;
}
五、顺序表的打印和销毁
在输入的pos非法的时候,证明操作失败,将申请好的结构体销毁,下次重新创建。操作完成后将现有的顺序表元素打印
int My_destory(Seqlist **pplist) // 销毁顺序表
{
if (NULL == pplist)
{
return NULL_error;
}
if(NULL == *pplist)
{
return create_error;
}
free(*pplist);
*pplist =NULL;
return ok;
}
void My_show( Seqlist *plist) // 打印顺序表
{
for (int i=0 ;i<plist->size;i++)
{
printf("%d",plist->arr[i]);
}
}
六 、主函数
先创建顺序表,然后进行插入操作。在插入阶段输入pos为-1时退出插入,开始删除操作。在删除阶段输入pos为-1时,退出删除操作,程序结束。
int main (int argc ,const char *argv[])
{
Seqlist *plist =NULL;
int ret = My_malloc(&plist);
if (ret<0)
{
return error;
}
printf("申请空间成功!");
// 增加顺序表的元素
int pos;
Data_type addata;
while(1)
{
printf("请输入要插入元素的位置:");
scanf("%d",&pos);
if (-1 ==pos)
{
break;
}
printf("请输入要插入的元素");
scanf("%d",&addata);
int ret =Addlist(plist ,pos ,addata);
if (ret<0)
{
int ret= My_destory(&plist);
if (ret <0)
{
printf("destory error");
}
printf("销毁成功!");
plist =NULL;
return error;
}
printf("插入新元素成功!");
printf("目前元素为:");
My_show(plist);
}
//删除元素
Data_type deldata;
while(1)
{
printf("输入删除元素的位置:");
scanf("%d",&pos);
if(-1 == pos)
{
break;
}
int ret = Delete(plist ,pos,&deldata);
if (ret < 0)
{
printf("删除失败");
return error;
My_destory(&plist);
plist =NULL;
}
printf("删除的元素为:%d",deldata);
printf("删除之后的元素为:");
My_show(plist);
}
return ok;
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_size 10 // 顺序表最多能存放MAX_size个Data_type类型的数据
typedef int Data_type;
typedef struct seqlist
{
Data_type arr [MAX_size];
int size;
}Seqlist;
enum VALUE
{
empty_error=-7,
create_error,
full_error ,
pos_error ,
malloc_error ,
NULL_error ,
error,
ok
};
int My_malloc(Seqlist **pplist) //申请一片大小为顺序表大小的地址空间 参数为二级指针接受指针plist的地址
{
if ( NULL == pplist)
{
return NULL_error;
}
*pplist = (Seqlist *)malloc(sizeof(Seqlist));
if (NULL == *pplist)
{
return malloc_error;
}
memset (*pplist ,'\0',sizeof(Seqlist)); // 将创建的顺序表的值置为空
return ok;
}
int My_destory(Seqlist **pplist) // 销毁顺序表
{
if (NULL == pplist)
{
return NULL_error;
}
if(NULL == *pplist)
{
return create_error;
}
free(*pplist);
*pplist =NULL;
return ok;
}
void My_show( Seqlist *plist) // 打印顺序表
{
for (int i=0 ;i<plist->size;i++)
{
printf("%d",plist->arr[i]);
}
}
int Addlist(Seqlist *plist ,int pos ,Data_type data) // 在pos位置插入新值data
{
if (NULL == plist)
{
printf("create error");
return create_error;
}
if (pos < 0 || pos >plist->size)
{
printf("pos_error");
return pos_error;
}
else if (plist->size >= MAX_size)
{
printf("full error");
return full_error;
}
else
{
for (int i=plist->size-1 ;i>=pos ;i--) //plist->size-1 指向顺序表的最后一个元素
{
plist->arr[i+1] = plist->arr[i];
}
plist->arr[pos] = data;
plist->size++;
}
return ok;
}
int Delete( Seqlist *plist ,int pos, Data_type *deledata)//删除pos位置的数据用deledata接收
{
if ( NULL == plist)
{
printf("空指针");
return NULL_error;
}
if (pos <0 || pos >= plist->size)
{
printf("删除位置错误");
return pos_error;
}
if (plist->size ==0)
{
printf("顺序表以空");
return empty_error;
}
*deledata = plist->arr[pos];
for (int j=pos ;j<plist->size-1;j++)
{
plist->arr[j] = plist->arr[j+1];
}
plist->size--;
return ok;
}
int main (int argc ,const char *argv[])
{
Seqlist *plist =NULL;
int ret = My_malloc(&plist);
if (ret<0)
{
return error;
}
printf("申请空间成功!");
// 增加顺序表的元素
int pos;
Data_type addata;
while(1)
{
printf("请输入要插入元素的位置:");
scanf("%d",&pos);
if (-1 ==pos)
{
break;
}
printf("请输入要插入的元素");
scanf("%d",&addata);
int ret =Addlist(plist ,pos ,addata);
if (ret<0)
{
int ret= My_destory(&plist);
if (ret <0)
{
printf("destory error");
}
printf("销毁成功!");
plist =NULL;
return error;
}
printf("插入新元素成功!");
printf("目前元素为:");
My_show(plist);
}
//删除元素
Data_type deldata;
while(1)
{
printf("输入删除元素的位置:");
scanf("%d",&pos);
if(-1 == pos)
{
break;
}
int ret = Delete(plist ,pos,&deldata);
if (ret < 0)
{
printf("删除失败");
return error;
My_destory(&plist);
plist =NULL;
}
printf("删除的元素为:%d",deldata);
printf("删除之后的元素为:");
My_show(plist);
}
return ok;
}