顺序表 基本操作
1 实验1 顺序表基本操作 2 3 实验目的 4 1. 熟悉C语言的上机环境,掌握C语言的基本结构。 5 2. 会定义线性表的顺序存储结构。 6 3. 熟悉对顺序表的一些基本操作和具体的函数定义。 7 注意事项 8 在做第一次“数据结构”课程实验之前,要在硬盘上建立好自己的工作目录,专门来存储你所做的实验程序及相关信息,以后每次做实验都采用这个目录。 9 实验内容 10 该程序的功能是对元素类型为整型的顺序表进行一些操作。该程序包括顺序表结构类型的定义以及对顺序表操作的具体的函数定义和主函数。 11 /* 定义DataType为int类型 */ 12 typedef int DataType; 13 14 /*顺序表存储空间的总分配量*/ 15 #define MAXSIZE 100 16 17 /* 顺序存储类型 */ 18 typedef struct 19 {DataType data[MAXSIZE]; /*存放线性表的数组*/ 20 int length; /* length是顺序表的长度*/ 21 }SeqList; 22 23 /* 初始化顺序表 */ 24 SeqList SeqListInit( ) 25 26 /* 清空顺序表 */ 27 void ListClear(SeqList L) 28 29 /* 求顺序表长度 */ 30 int ListLength(SeqList L) 31 32 /* 检查顺序表是否为空 */ 33 int ListEmpty(SeqList L) 34 35 /*检查顺序表是否为满 */ 36 int ListFull(SeqList L) 37 38 /* 遍历顺序表 */ 39 void ListTraverse(SeqList L) 40 41 /* 从顺序表中查找元素 */ 42 DataType ListGet(SeqList L ,int i) 43 44 /* 从顺序表中查找与给定元素值相同的元素在顺序表中的位置 */ 45 int ListLocate(SeqList L, DataType x) 46 47 /* 向顺序表中插入元素 */ 48 void ListInsert(SeqList L,int i,DataType x) 49 50 /* 从顺序表中删除元素 */ 51 void ListDelete(SeqList L,int i) 52 53 /*求顺序表中元素的前驱*/ 54 DataType ListPrior (SeqList L,DataType e) 55 56 /*求顺序表中元素的后继*/ 57 DataType ListNext(SeqList L,DataType e)
参考:
1 // 实验1 顺序表基本操作 2 #include <stdio.h> 3 #include <malloc.h> 4 #include <stdlib.h> 5 6 /* 定义DataType为int类型 */ 7 8 typedef int DataType; 9 10 11 /*顺序表存储空间的总分配量*/ 12 13 #define MAXSIZE 100 14 15 /* 顺序存储类型 */ 16 17 typedef struct{ 18 DataType data[MAXSIZE]; /*存放线性表的数组*/ 19 int length; /* length是顺序表的长度*/ 20 }SeqList; 21 22 /* 1.初始化顺序表 */ 23 24 SeqList SeqListInit( ) 25 { 26 SeqList sq; //分配线性表的存储空间 27 sq.length = 0; 28 return sq; 29 } 30 31 32 /* 2.清空顺序表 */ 33 34 void ListClear(SeqList *L) 35 { 36 L->length = 0; 37 } 38 39 40 /* 3.求顺序表长度 */ 41 42 int ListLength(SeqList L) 43 { 44 return L.length; 45 } 46 47 /* 4.检查顺序表是否为空 */ 48 49 int ListEmpty(SeqList L) 50 { 51 if(L.length==0) //是空的 52 return 1; 53 else //不是空的 54 return 0; 55 } 56 57 58 /* 5.检查顺序表是否为满 */ 59 60 int ListFull(SeqList L) 61 { 62 if(L.length==MAXSIZE) //满了 63 return 1; 64 else 65 return 0; 66 } 67 68 69 /* 6.遍历顺序表 */ 70 71 void ListTraverse(SeqList L) 72 { 73 int i; 74 for(i=0;i<L.length;i++){ 75 printf("%d ",L.data[i]); 76 } 77 printf("\n"); 78 } 79 80 81 /* 7.从顺序表中查找元素 */ 82 83 DataType ListGet(SeqList L ,int i) 84 { 85 return L.data[i-1]; 86 } 87 88 89 90 /* 8.从顺序表中查找与给定元素值相同的元素在顺序表中的位置 */ 91 92 int ListLocate(SeqList L, DataType x) 93 { 94 int i; 95 for(i=0;i<L.length;i++){ 96 if(L.data[i]==x) 97 return i+1; 98 } 99 return 0; 100 } 101 102 103 104 /* 9.向顺序表中插入元素 */ 105 106 void ListInsert(SeqList* L,int i,DataType x) 107 { 108 if(L->length==MAXSIZE){ //顺序表已经满了,不能再插入元素了 109 printf("插入失败,顺序表已满!\n"); 110 return ; 111 } 112 if(i>L->length+1 || i<1){ 113 printf("插入失败,要插入的位置不在范围内!\n"); 114 return ; 115 } 116 int j; 117 for(j=L->length-1;j>=i-1;j--) //元素后移 118 L->data[j+1] = L->data[j]; 119 L->data[i-1] = x; //插入 120 L->length++; //长度加1 121 printf("插入成功!\n"); 122 return ; 123 } 124 125 126 127 /* 10.从顺序表中删除元素 */ 128 129 void ListDelete(SeqList* L,int i) 130 { 131 if(L->length==0){ //顺序表已经空了,不能再删除元素了 132 printf("删除失败,顺序表已空!\n"); 133 return ; 134 } 135 if(i>L->length || i<1){ 136 printf("删除失败,要删除的位置不在范围内!\n"); 137 return ; 138 } 139 int j; 140 for(j=i;j<L->length;j++){ //向前覆盖 141 L->data[j-1] = L->data[j]; 142 } 143 L->length--; //长度减1 144 printf("删除成功!\n"); 145 return ; 146 } 147 148 149 150 /* 11.求顺序表中元素的前驱*/ 151 152 DataType ListPrior (SeqList L,DataType e) 153 { 154 int i; 155 for(i=0;i<L.length;i++) 156 if(L.data[i]==e) 157 break; 158 if(i==L.length) //如果没有找到元素e 159 return 0; 160 if(i==0) //如果e是第一个元素,则没有前驱 161 return 0; 162 return L.data[i-1]; 163 } 164 165 166 167 /* 12.求顺序表中元素的后继*/ 168 169 DataType ListNext(SeqList L,DataType e) 170 { 171 int i; 172 for(i=0;i<L.length;i++) 173 if(L.data[i]==e) 174 break; 175 if(i==L.length) //如果没有找到元素e 176 return 0; 177 if(i==L.length-1) //如果e是最后一个元素,说明他没有后继 178 return 0; 179 return L.data[i+1]; 180 } 181 182 int Menu() 183 { 184 int in; 185 printf("[1] 初始化顺序表\n"); 186 printf("[2] 清空顺序表\n"); 187 printf("[3] 求顺序表长度\n"); 188 printf("[4] 检查顺序表是否为空\n"); 189 printf("[5] 检查顺序表是否为满\n"); 190 printf("[6] 遍历顺序表\n"); 191 printf("[7] 从顺序表中查找元素\n"); 192 printf("[8] 从顺序表中查找与给定元素值相同的元素在顺序表中的位置\n"); 193 printf("[9] 向顺序表中插入元素\n"); 194 printf("[10] 从顺序表中删除元素\n"); 195 printf("[11] 求顺序表中元素的前驱\n"); 196 printf("[12] 求顺序表中元素的后继\n"); 197 printf("[0] 按任意键退出\n"); 198 scanf("%d",&in); 199 return in; 200 } 201 SeqList Reply(SeqList sq,int in) 202 { 203 int i,x; 204 switch(in){ 205 case 1: //初始化顺序表 206 if(sq.length==-1){ 207 sq = SeqListInit(); 208 printf("初始化成功!\n"); 209 } 210 else{ 211 printf("已经初始化过了!\n"); 212 } 213 break; 214 case 2: //清空顺序表 215 if(sq.length==-1){ 216 printf("请先初始化顺序表!\n"); 217 break; 218 } 219 ListClear(&sq); 220 printf("清空成功!\n"); 221 break; 222 case 3: //求顺序表长度 223 if(sq.length==-1){ 224 printf("请先初始化顺序表!\n"); 225 break; 226 } 227 printf("顺序表长度为:%d\n",ListLength(sq)); 228 break; 229 case 4: //检查顺序表是否为空 230 if(sq.length==-1){ 231 printf("请先初始化顺序表!\n"); 232 break; 233 } 234 if(ListEmpty(sq)) 235 printf("顺序表为空!\n"); 236 else 237 printf("顺序表不为空!\n"); 238 break; 239 case 5: //检查顺序表是否为满 240 if(sq.length==-1){ 241 printf("请先初始化顺序表!\n"); 242 break; 243 } 244 if(ListFull(sq)) 245 printf("顺序表已满!\n"); 246 else 247 printf("顺序表未满!\n"); 248 break; 249 case 6: //遍历顺序表 250 if(sq.length==-1){ 251 printf("请先初始化顺序表!\n"); 252 break; 253 } 254 ListTraverse(sq); 255 break; 256 case 7: //从顺序表中查找元素 257 if(sq.length==-1){ 258 printf("请先初始化顺序表!\n"); 259 break; 260 } 261 printf("你要查找第几个元素?\n"); 262 scanf("%d",&i); 263 if(i>sq.length || i<1){ 264 printf("查找失败,该位置不在当前查找范围之内!\n"); 265 break; 266 } 267 printf("第%d个元素是:%d\n",i,ListGet(sq,i)); 268 break; 269 case 8: //从顺序表中查找与给定元素值相同的元素在顺序表中的位置 270 if(sq.length==-1){ 271 printf("请先初始化顺序表!\n"); 272 break; 273 } 274 printf("你要查找的元素值是?\n"); 275 scanf("%d",&x); 276 if(i = ListLocate(sq,x)) 277 printf("这是第%d个元素!\n",i); 278 else 279 printf("没找到该元素!\n"); 280 break; 281 case 9: //向顺序表中插入元素 282 if(sq.length==-1){ 283 printf("请先初始化顺序表!\n"); 284 break; 285 } 286 printf("请问你要插在第几个元素的位置?\n"); 287 scanf("%d",&i); 288 printf("你要插入的元素值是?\n"); 289 scanf("%d",&x); 290 ListInsert(&sq,i,x); 291 break; 292 case 10: //从顺序表中删除元素 293 if(sq.length==-1){ 294 printf("请先初始化顺序表!\n"); 295 break; 296 } 297 printf("请问你要删除第几个元素?\n"); 298 scanf("%d",&i); 299 ListDelete(&sq,i); 300 break; 301 case 11: //求顺序表中元素的前驱 302 if(sq.length==-1){ 303 printf("请先初始化顺序表!\n"); 304 break; 305 } 306 printf("请问你要查找的元素值为?\n"); 307 scanf("%d",&x); 308 x = ListPrior(sq,x); 309 if(x) 310 printf("该元素的前驱为:%d\n",x); 311 else 312 printf("没找到前驱!\n"); 313 break; 314 case 12: //求顺序表中元素的后继 315 if(sq.length==-1){ 316 printf("请先初始化顺序表!\n"); 317 break; 318 } 319 printf("请问你要查找的元素值为?\n"); 320 scanf("%d",&x); 321 x = ListNext(sq,x); 322 if(x) 323 printf("该元素的后继为:%d\n",x); 324 else 325 printf("没找到后继!\n"); 326 break; 327 default://检查顺序表是否为满 328 printf("Bye~\n"); 329 exit(1); 330 } 331 system("pause"); 332 system("cls"); 333 return sq; 334 } 335 336 int main() 337 { 338 SeqList sq; 339 sq.length = -1; 340 while(1){ 341 int in; 342 in = Menu(); 343 sq = Reply(sq,in); 344 } 345 return 0; 346 }