码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构-动态顺序表-C语言实现

时间:2020-05-19 14:32:17      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:大于   while   else   指定表   实现   etc   def   oid   保存   

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <ctype.h>
  4 #include <stdbool.h>
  5 #define MAXSIZE 7
  6 typedef int ElemType;
  7 typedef struct OrderList{
  8   ElemType * number;//大小可变的动态数组
  9   ElemType length;//当前表的可插入的数据的位置
 10   ElemType maxsize;//表的最大长度
 11 }OrderList;
 12 void init(OrderList *p,int size){//初始化,size为指定表最大长度
 13   p->length=0;
 14   if(size<1){
 15     printf("大小错误!\n");
 16     return;
 17   }
 18   p->number=(ElemType *)malloc(size * sizeof(ElemType));//为number数组分配可存储size个ElemType数据的空间
 19   p->maxsize=size;//更新表的最大长度
 20 }
 21 bool IfIn(OrderList *p,int val){//遍历查找是否已有该数据
 22   for(int a=0;a<p->length;a++)
 23     if(p->number[a]==val)
 24     return true;
 25   return false;
 26 }
 27 void menu(){//打印菜单
 28   printf("键入以下字符以操作,EOF退出\nA:添加数据\nB:查看数据\nC:插入数据\nD:按位置删除数据\nE:按值删除数据\n");
 29 }
 30 void AddData(OrderList *p,int d){//接收一个数值d以默认顺序添加数据
 31   if(IfIn(p,d)){
 32     printf("%d已存储!\n",d);
 33     return;
 34   }//如果已有该数据
 35   int cur = p->length;//获取当前表的位置
 36   if(p->length==p->maxsize&&d>=0){//如果最新可添加数据的位置下标正好等于最大长度
 37     p->number=(ElemType *)realloc(p->number,p->length);//为number数组添加一个数据类型空间
 38     p->length++;//位置+1
 39     p->maxsize++;//最大长度+1
 40     p->number[cur]=d;//获取数据
 41   }
 42   else {//如果当前表的位置尚未到达最大长度
 43     p->number[cur]=d;//直接在最新的位置添加数据
 44     p->length++;//位置+1
 45   }
 46 }
 47 void CheckData(OrderList *p){//查看以录入数据
 48   if(p->length)//如果已存入数据(则length>0)
 49   for(int a=0;a<p->length;a++)//打印数据
 50     printf("第%d个数据:%d\n",a+1,p->number[a]);
 51   else
 52     printf("表为空!\n");
 53 }
 54 void InsertData(OrderList *p,int pos,int data){//接收一个要插入的pos位置和要插入的数据data
 55   if(IfIn(p,data)){
 56     printf("%d已存储!\n",data);
 57     return;
 58   }//如果已有该数据
 59   if(pos>p->length){//插入位置与当前表的最大长度的关系
 60     printf("插入位置超出当前表的可存储位置的!\n");
 61     return;
 62     }
 63   for(int z=p->length;z>=pos;z--){//循环后移保存数据为插入的位置腾出空间
 64     p->number[z]=p->number[z-1];
 65   }
 66   p->number[pos-1]=data;//获取数据
 67   p->length++;//可添加数据位置的右移即+1
 68 }
 69 void DeleInpos(OrderList *p,int pos){//删除第pos个数据
 70   if(pos>=p->length||pos<=0){//如果删除的位置大于等于可插入数据的空位置或位置无效
 71     printf("删除位置错误!\n");
 72     return;
 73   }
 74   for (int z =pos-1;z<p->length;z++)//将该位置上的值用后面的值覆盖
 75     p->number[z]=p->number[z+1];
 76   p->length--;//可插入数据的位置左移,-1
 77 }
 78 void DeleInVal(OrderList *p,int val){//按值删除
 79   for(int a=0;a<p->length;a++){//循环遍历整个表
 80     if(p->number[a]==val)//如果该位置上的值等于指定删除的值
 81     DeleInpos(p,a+1);//将该位置+1即表示第a+1个元素利用位置删除
 82   }
 83 }
 84 int Getval(){//获取数据
 85   int a;
 86   printf("请输入数值:");
 87   scanf("%d",&a);
 88   return a;
 89 }
 90 int Getpos(){//获取位置
 91   int a;
 92   printf("请输入位置:");
 93   scanf("%d",&a);
 94   return a;
 95 }
 96 void main(void){
 97   OrderList list;//顺序表结构
 98   OrderList * p=&list;//指向表的指针以操作
 99   init(p,3);//默认表可存储三个数据
100   char ch;
101   menu();//打印菜单
102   while((ch=getchar())!=EOF){//键入Ctrl+z时停止
103     setbuf(stdin,NULL);//清空缓冲区
104     switch (toupper(ch)){
105       case A: AddData(p,Getval());break;//添加数据
106       case B: CheckData(p);break;//查看数据
107       case C: InsertData(p,Getpos(),Getval());break;//插入数据
108       case D: DeleInpos(p,Getpos());break;//按pos位置删除
109       case E: DeleInVal(p,Getval());break;//按值删除
110     }
111     setbuf(stdin,NULL);//清空缓冲区
112     menu();//打印菜单
113   }
114 }

 

数据结构-动态顺序表-C语言实现

标签:大于   while   else   指定表   实现   etc   def   oid   保存   

原文地址:https://www.cnblogs.com/Let-us-Coding/p/12916337.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!