本文小编为大家详细介绍“C语言如何实现顺序表的插入删除”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言如何实现顺序表的插入删除”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
首先声明一个顺序表的结构 (数组的第一个元素是0,但是顺序表的第一个一般 从1(人为设定)开始)
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 #define OK 1 #define FALSE 0 typedef int Elemtype; typedef bool Status; typedef struct list { Elemtype *elem; int len; //数据个数 int listsize; //顺序表长度 }List;
listsize
代表这个顺序表的最大容量,可以随时扩容
len
代表在你创建的这个顺序表中有几个有效的数据,总是小于等于listsize
void list_init(List *L) { L->elem=(Elemtype *)malloc(MAXSIZE*sizeof(Elemtype));//开辟空间 if(L->elem==NULL)//判断空间是否开辟成功 { printf("malloc fail\n"); exit(0); } L->len=0; //初始化数据有效数据为0 L->listsize=MAXSIZE; //初始化数组长度为MAXSIZE }
Status list_insert(List *L,int i,Elemtype data) { Elemtype *base,*insert,*p; if(i<1 || i>L->len+1 || L==NULL) { printf("位置输入错误\n"); return FALSE; } if(L->len > L->listsize) { base=(Elemtype *)realloc(L->elem,(L->listsize+MAXSIZE)*sizeof(Elemtype));//动态扩容 L->elem=base; L->listsize+=MAXSIZE;//更新顺序表大小 } insert=&(L->elem[i-1]);//目标指针指向要插入的目标地址 //指向最后一个元素的地址 for(p=L->elem + L->len-1;p>=insert;p--) { *(p+1)=*p; } *insert=data; L->len++; return OK; }
Status delete_list(List *L,int i) { ElemType *q,*delete_i; if(L==NULL||i<0||i>L->len) return FALSE; delete_i=&(L->elem[i-1]);//用指针指向要删除位置的地址 q=L->elem + L->len-1; //q指针指向顺序表最后一个位置的地址 首地址加上数组长度就是最后一个元素地址 for(delete_i=delete_i+1;delete_i<=q;++delete_i)//从删除位置的地址的下一个元素开始,每个往前移动一位 { *(delete_i-1)=*delete_i; //前一个位置等于后一个 } L->len--; return OK; }
全部程序
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 #define OK 1 #define FALSE 0 typedef int Elemtype; typedef bool Status; typedef struct list { Elemtype *elem; int len; int listsize; }List; void list_init(List *L) { L->elem=(Elemtype *)malloc(MAXSIZE*sizeof(Elemtype));//开辟空间 if(L->elem==NULL)//判断空间是否开辟成功 { printf("malloc fail\n"); exit(0); } L->len=0; //初始化数据有效数据为0 L->listsize=MAXSIZE; //初始化数组长度为MAXSIZE } Status list_insert(List *L,int i,Elemtype data) { Elemtype *base,*insert,*p; if(i<1 || i>L->len+1 || L==NULL) { printf("位置输入错误\n"); return FALSE; } if(L->len > L->listsize) { base=(Elemtype *)realloc(L->elem,(L->listsize+MAXSIZE)*sizeof(Elemtype)); L->elem=base; L->listsize+=MAXSIZE; } insert=&(L->elem[i-1]);//目标指针指向要插入的目标地址 //指向最后一个元素的地址 for(p=L->elem + L->len-1;p>=insert;p--) { *(p+1)=*p; } *insert=data; L->len++; return OK; } Status list_delete(List *L,int i) { Elemtype *aim,*p; if(i<0 || i>L->len) { printf("位置输入错误\n"); return FALSE; } aim=&(L->elem[i-1]);//目标指针指向要删除的目标地址 p=(L->elem+L->len-1); //指向最后一个元素的地址 for(aim=aim+1;aim<=p;++aim) //目标地址滑动删除 { *(aim-1)=*aim; } L->len--; return OK; } void show_list(List *L) { int i; for(i=0;i<L->len;i++) { printf("elem[%d]=%d\n",i+1,L->elem[i]); } printf("\n"); } int main() { int i; List L; list_init(&L); for(i=0;i<10;i++) { list_insert(&L,i+1,i+1); } printf("插入前的顺序表\n"); show_list(&L); printf("插入后的顺序表 在5位置插入99\n"); list_insert(&L,5,99); show_list(&L); printf("删除后的顺序表 把5位置删除\n"); list_delete(&L,5); show_list(&L); return 0; }
运行结果如下
读到这里,这篇“C语言如何实现顺序表的插入删除”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。