数据结构之顺序存储


  线性表基本概念:由同类型数据元素构成有序序列的线性结构

    表中元素个数称为线性表的长度

     线性表没有元素时称为空表

     表起始位置称为表头,结束位置称为表尾

     位序i从1开始


1
#include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define MAXSIZE 100//顺序表所能表达的最大长度 5 #define OVERFLOW 1 6 7 8 9 typedef int Status;//重命名,使Status和int有相同的作用 10 typedef int ElemType; 11 12 void Interrupt(void)//创建一个中断函数 13 { 14 while(1) //用于检测换行符,使函数脱离scanf的连续输出 15 if(getchar()==\n) 16 break; 17 } 18 19 typedef struct 20 { 21 ElemType *elem;//存储空间的基地址 22 int length;//当前长度 23 }Sqlist;//顺序表的结构类型为Sqlist 24 25 Status InitList(Sqlist &L)//建立一个空表 26 { 27 L.elem = new ElemType[MAXSIZE]; 28 if(!L.length) 29 { 30 exit(OVERFLOW); 31 } 32 L.length = 0; 33 return 0; 34 } 35 36 Status MyList(Sqlist &L)//在空表上输入数字,建立一个属于自己填写的表 37 { 38 int b,i=0; 39 printf("表的长度: "); 40 scanf("%d",&L.length); 41 Interrupt(); 42 printf("输入要填入表的数字:\n"); 43 for( ; i < L.length ; i++ ) 44 { 45 scanf("%d",&b); 46 L.elem[i] = b; 47 } 48 Interrupt(); 49 return 0; 50 } 51 52 Status TraverseList(Sqlist &L)//遍历 ,使现有表中的数据重新打印出来 53 { 54 int j; 55 if(L.length==0) 56 { 57 printf("空表\n"); 58 return 0; 59 } 60 else 61 { 62 for(j=0 ; j < L.length ; j++)//建立一个for函数,读取顺序表中的数据 63 printf("%d ",L.elem[j]); 64 printf("\n");//最后换行 65 return 0; 66 } 67 } 68 69 Status GetElem(Sqlist &L,int i,int &e)//取值 。i:为要取的值得位置,&e:为i位置的接受变量,并且返回主函数 70 { 71 int c; 72 scanf("%d",&i); 73 Interrupt(); 74 if(i<0||i>L.length)//判断i的取值是否超范围 75 { 76 printf("ERROR\n");//如果超范围,返回ERROR,并结束 77 return 0; 78 } 79 else 80 { 81 e = L.elem[i-1];//返回将第i位置的数据赋值给e,并输出 82 printf("%d\n",e); 83 return 0; 84 } 85 86 } 87 88 Status DeleteElem(Sqlist &L,int i)//删除 。i:为要删除数据的位置 89 { 90 int j; 91 scanf("%d",&i);//输入要删除的第i位 92 Interrupt(); 93 if(i<0||i>L.length)//判断输入的i 是否超范围,如果超出,返回错误。 94 { 95 printf("ERROR\n"); 96 return 0; 97 } 98 else 99 { 100 for(j = i; j<=L.length;j++)//被删除元素之后的元素都向前移一位 101 L.elem[j-1] = L.elem[j]; 102 L.length = L.length-1;//表长减1 103 return 0; 104 } 105 } 106 107 Status ListInsert(Sqlist &L,int i,ElemType e)//顺序表的插入 i:为要插入的表的位置。e:要插入该位置的元素 108 { 109 int j; 110 scanf("%d",&i); 111 scanf("%d",&e); 112 Interrupt(); 113 if(i>L.length+1||L.length>=MAXSIZE||i<1)//判断要插入表的位置i是否超出范围 114 { 115 printf("ERROR\n"); 116 return 0; 117 } 118 else 119 { 120 for(j=L.length;j>=i;j--)//插入位置及之后的元素分别向后移一位 121 L.elem[j]=L.elem[j-1]; 122 L.elem[i-1]=e;//将新元素e放入第i个位置 123 ++L.length;//表长加1 124 return 0; 125 } 126 } 127 128 Status LocateElem(Sqlist &L,ElemType e)//查找。在顺序表L中查找值为e的数据元素 129 { 130 int j,i=0; 131 bool text=true;//利用bool类型,来判断表里有没有值为e的值 132 scanf("%d",&e);//输入e的值 133 Interrupt(); 134 for(j=0;j<L.length;j++)//遍历整个顺序表,和e值一一作比较, 135 { 136 if(L.elem[j]==e) 137 { 138 printf("第 %d 位\n",j+1); 139 i++; 140 text=false; 141 } 142 } 143 144 if(text)//bool类型的输出 145 printf("没有找到"); 146 return 0; 147 } 148 149 int main() 150 { 151 int a,i=0; 152 char c; 153 Sqlist L;//将L定义为Sqlist类型的变量,便于直接引用 154 InitList(L); 155 MyList(L); 156 TraverseList(L); 157 printf("操作输入序号选择:\n 1:遍历顺序表\n 2:顺序表取值\n 3:删除元素\n 4:插入元素\n 5:顺序表查找\n 6:表长\n输入#退出\n"); 158 while(1) 159 { 160 int f = 0; 161 printf("请选择:"); 162 scanf("%c",&c); 163 Interrupt(); 164 switch(c) 165 { 166 case 1: printf("遍历顺序表: ");TraverseList(L); break; 167 case 2: printf("顺序表取值(取值位置): ");GetElem(L, a , a ); break; 168 case 3: printf("删除元素(删除的位置): ");DeleteElem(L,a); break; 169 case 4: printf("插入元素(位置 插入的元素): ");ListInsert(L,a,a); break; 170 case 5: printf("顺序表查找(输入要查找的元素): ");LocateElem(L,a); break; 171 case 6: printf("表长: %d \n",L.length); break; 172 case #: f = 1; break; 173 default: printf("ERROR\n"); 174 } 175 if (f == 1) 176 { 177 printf("已正常退出!\n"); 178 break; 179 } 180 } 181 182 return 0; 183 }

 

数据结构之顺序存储

 

 

数据结构之顺序存储

上一篇:(1-2)SpringCloud:服务的消费者rest+ribbon


下一篇:Mybatis源码分析(一)源码编译