1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 顺序表的基本操作(C语言实现 简单易懂!)

顺序表的基本操作(C语言实现 简单易懂!)

时间:2019-05-06 04:45:26

相关推荐

顺序表的基本操作(C语言实现 简单易懂!)

你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿

目录

一、学习内容二、准备工作三、顺序表的结构四、顺序表的基本操作1. 创建顺序表2. 按数值查找3. 按位置查找4. 插入一个数值5. 删除一个数值6. 销毁顺序表7. 求前驱算法8. 求后继算法五、总代码

这篇文章看的人还挺多,我顺便写了顺序栈的,不过只发了个总代码

顺序栈

一、学习内容

1、 创建顺序表

2、 按数值查找

3、 按位置查找

4、 插一个数值

5、 删一个数值

6、 销毁顺序表

7、 求前驱算法

8、 求后继算法

二、准备工作

#include<stdio.h>#include<stdlib.h>#include<time.h>#define LIST_MaxSize 1000//该顺序表最大的数量typedef int ElemType;//给int定义一个别名typedef enum Status{success,fail,NoCreate//success表示成功,fail表示失败,NoCreate表示顺序表还未创建}Status;Status status;//定义status这个枚举变量,status是表明顺序表基本操作的状态``

为什么要给int定义一个别名呢?因为顺序表的数据类型不一定是int,有可能是double等其他类型,采用宏定义的好处就是:若需要改变顺序表的数据类型,只需要在宏定义处改变int为其他的数据类型即可(理论上确实如此,但由于我的代码后面用到了随机数产生顺序表的元素,直接把宏定义中的int改double并不可行)。为什么要用枚举呢?实际上就是表明顺序表基本操作的一个状态。用bool逻辑值也可以,或者等等,只要能表示出顺序表的基本操作的状态即可。

三、顺序表的结构

typedef struct Sqlist{int *elem;//元素 int length;//元素个数,即长度 }Sqlist;

四、顺序表的基本操作

1. 创建顺序表

Status List_Init(Sqlist *L){int i;L->elem=(ElemType *)malloc(LIST_MaxSize*sizeof(ElemType));//要开辟多余的空间是为了后面的插入算法 /*我这里采用的是取0~100的随机数,方便检测程序的对错,也可以手动输入*/ srand(time(0)); //时间取种for(i=0;i<L->length;i++){L->elem[i]=rand()%101;}if(L->elem)//若成功申请内存{for(i=0;i<L->length;i++){printf("%d\n",L->elem[i]);}return success;}return fail;}

2. 按数值查找

Status List_Locate(Sqlist *L,ElemType elem,int *pos,int *count)//count是用于记录相同数值出现的次数{int len=L->length,i=0,flag=0;if(len==0)return NoCreate; while(i<len){if(L->elem[i]==elem){if(*count==0)flag=i;*count=(*count)+1;}i++;}if(*count!=0){*pos=flag;return success;}return fail;}

3. 按位置查找

Status List_Retrieve(Sqlist *L,ElemType *elem,int *pos){if(0<=*pos&&*pos<=L->length){*elem=L->elem[*pos-1];return success;}return fail; }

4. 插入一个数值

Status List_Insert(Sqlist *L,ElemType elem,int pos)//第pos个元素换为elem {int i;for(i=L->length-1;i>=pos-1;i--){L->elem[i+1]=L->elem[i];//数据元素后移一位}L->elem[pos-1]=elem;L->length++;return success;}

5. 删除一个数值

Status List_Remove(Sqlist *L,int pos){int i;for(i=pos-1;i<L->length-1;i++){L->elem[i]=L->elem[i+1];}L->length--;return success;}

6. 销毁顺序表

Status List_Destroy(Sqlist *L){if(status==NoCreate) {printf("您还没有创建顺序表!请先创建顺序表\n");}if(L->elem){free(L->elem);L->elem=NULL;L->length;return NoCreate; }}

7. 求前驱算法

Status List_Prior(Sqlist *L,int pos){ElemType elem;if(1<pos&&pos<=L->length){elem=L->elem[pos-1-1];printf("前驱数值为:%d\n",elem);return success;}return fail;}

8. 求后继算法

Status List_Next(Sqlist *L,int pos){ElemType elem;if(1<pos&&pos<=L->length-1){elem=L->elem[pos-1-1];printf("后继数值为:%d\n",elem);return success;}return fail;}

五、总代码

#include<stdio.h>#include<stdlib.h>#include<time.h>#define LIST_MaxSize 1000//顺序表的最大元素个数 /*可以自行修改宏定义*/ typedef int ElemType;typedef enum Status{success,fail,NoCreate}Status;Status status;//定义status这个枚举变量,status是表明顺序表基本操作的状态 typedef struct Sqlist{int *elem;//元素 int length;//元素个数,即长度 }Sqlist; /*1、创建顺序表*/Status List_Init(Sqlist *L){int i;L->elem=(ElemType *)malloc(LIST_MaxSize*sizeof(ElemType));//要开辟多余的空间是为了后面的插入 /*我这里采用的是取0~100的随机数,方便检测程序的对错*/ srand(time(0)); for(i=0;i<L->length;i++){L->elem[i]=rand()%101;}if(L->elem){for(i=0;i<L->length;i++){printf("%d\n",L->elem[i]);}return success;}return fail;}/*2、按按数值查找算法(加强一下,可以找到出现多次的数值)*/Status List_Locate(Sqlist *L,ElemType elem,int *pos,int *count){int len=L->length,i=0,flag=0;if(len==0)return NoCreate; while(i<len){if(L->elem[i]==elem){if(*count==0)flag=i;*count=(*count)+1;}i++;}if(*count!=0){*pos=flag;return success;}return fail;}/*3、按位置查找*/Status List_Retrieve(Sqlist *L,ElemType *elem,int *pos){if(0<=*pos&&*pos<=L->length){*elem=L->elem[*pos-1];return success;}return fail; }/*4、插入一个数值*/Status List_Insert(Sqlist *L,ElemType elem,int pos)//第pos个元素换为elem {int i;for(i=L->length-1;i>=pos-1;i--){L->elem[i+1]=L->elem[i];//数据元素后移一位}L->elem[pos-1]=elem;L->length++;return success;} /*5、删除一个数值*/ Status List_Remove(Sqlist *L,int pos){int i;for(i=pos-1;i<L->length-1;i++){L->elem[i]=L->elem[i+1];}L->length--;return success;} /*6、销毁顺序表*/Status List_Destroy(Sqlist *L){if(status==NoCreate) {printf("您还没有创建顺序表!请先创建顺序表\n");}if(L->elem){free(L->elem);//释放申请的空间L->elem=NULL;//置为空指针,保证使用安全 L->length=0;//长度变为0return NoCreate; }} /*7、求前驱算法*/ Status List_Prior(Sqlist *L,int pos){ElemType elem;if(1<pos&&pos<=L->length){elem=L->elem[pos-1-1];printf("前驱数值为:%d\n",elem);return success;}return fail;}/*8、求后继算法*/Status List_Next(Sqlist *L,int pos){ElemType elem;if(1<pos&&pos<=L->length-1){elem=L->elem[pos-1-1];printf("后继数值为:%d\n",elem);return success;}return fail;}int main(){printf("------------------提示:该顺序表最大能存1000个元素------------------\n\n"); int i,pos,count=0,n;status=NoCreate;Sqlist L;L.length=0;//空表,此时还未创建顺序表 ElemType elem;printf("****************1、 创建顺序表\t"); printf("2、 按数值查找****************\n");printf("****************3、 按位置查找\t"); printf("4、 插一个数值****************\n");printf("****************5、 删一个数值\t"); printf("6、 销毁顺序表****************\n"); printf("****************7、 求前驱算法\t");printf("8、 求后继算法****************\n");printf("****************9、 菜单的选项\t");printf("10、展示顺序表****************\n"); printf("****************11、顺序表个数\t");printf("12、结束该程序****************\n"); while(1){scanf("%d",&n);switch(n){case 1: {printf("您想初始化这个顺序表多少个元素呢?(随机数):");scanf("%d",&L.length);if(L.length>LIST_MaxSize){printf("元素个数超过了最大值!\n");break;}status=List_Init(&L);if(status==success){printf("顺序表初始化成功!\n");}if(status==fail)printf("顺序表初始化失败!\n");break;}case 2: {if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else{printf("请输入你想要查找的数值:"); scanf("%d",&elem);status=List_Locate(&L,elem,&pos,&count);if(status==success){printf("找到了!第一次出现在第%d个位置,共出现了%d次\n",pos+1,count);}else printf("您输入的数值不在顺序表之中!\n");} break;} case 3: {if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else{printf("按位置查找,你查的数字序号为:");scanf("%d",&pos);status=List_Retrieve(&L,&elem,&pos);if(status==success){printf("该数值为:%d\n",elem);}else printf("您输入的序号越界了!\n"); }break;}case 4: {if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else{printf("请输入您想插入的元素位置:");scanf("%d",&pos);if(pos>L.length||L.length==LIST_MaxSize){printf("您插入的元素超出了您创建顺序表的范围!\n");break;}printf("请输入您想插入的元素数值:");scanf("%d",&elem); status=List_Insert(&L,elem,pos);if(status==success)printf("插入成功!\n");else printf("插入不成功!\n");}break;} case 5: {if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else{printf("请输入您想删除的元素位置:");scanf("%d",&pos);if(pos>L.length||L.length==LIST_MaxSize){printf("您删除的元素超出了您创建顺序表的范围!\n");break;}status=List_Remove(&L,pos);if(status==success)printf("删除成功!\n"); }break;}case 6: {status=List_Destroy(&L);if(status==NoCreate)printf("销毁成功!\n");status=NoCreate;break;}case 7: {if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else{printf("请输入元素位置:");scanf("%d",&pos);status=List_Prior(&L,pos);if(status==fail)printf("该位置无前驱!\n"); }break;}case 8: {if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else{status=List_Next(&L,pos);if(status==fail)printf("该位置无后继!\n"); }break;}case 9: {printf("--------------------------------------------------------------\n");//分割线 printf("****************1、 创建顺序表\t"); printf("2、 按数值查找****************\n");printf("****************3、 按位置查找\t"); printf("4、 插一个数值****************\n");printf("****************5、 删一个数值\t"); printf("6、 销毁顺序表****************\n"); printf("****************7、 求前驱算法\t");printf("8、 求后继算法****************\n");printf("****************9、 菜单的选项\t");printf("10、展示顺序表****************\n"); printf("****************11、顺序表个数\t");printf("12、结束该程序****************\n"); printf("--------------------------------------------------------------\n");//分割线 break;}case 10:{if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else{printf("-----------------------------------\n");//分割线 for(i=0;i<L.length;i++){printf("%d\n",L.elem[i]);}printf("-----------------------------------\n");//分割线 }break;}case 11:{if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else printf("顺序表的元素个数为:%d\n",L.length);break;} case 12:{printf("再见,祝您生活幸福愉快!");return 0; }default:{printf("请输入1~12内的整数!\n");break;}}count=0;//用完一次后重置pos=0; //用完一次后重置 }}

主函数的设计由大家自己发挥即可,只要能够表明顺序表的基本操作的一个状态并对该状态作出一个提示信息,都是一个好程序。

我今天第一次做完这个顺序表,可能代码有很多啰嗦的地方,我水平有限,请朋友们谅解!写的不好的地方还请朋友们指出。

最后,如果这篇文章对你有帮助,就点个赞或者评论一下吧,谢谢!

你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。