今天刚学了数据结构,老师教的我是云里雾里的,晚上回来自己又教程视频,不管怎么说算是简单的实现了顺序表的一些简单功能。顺序表里的难点有向顺序表里插入元素,删除元素,查询元素位置这几个函数比较难写,我自己根据这几个难点做了几个图片来解释这几个功能的具体实现:
插入元素的实现:
其实数据结构与算法中的顺序表的原理跟数组是一样的。当你在往一个数组中插入一个元素时,为了避免插入的位置的原有数据被覆盖我们就需要发数组中从插入位置开始的数据统一往后移一个位置,然后再把需要插入的数据插入此时的表中,这样就可以保证数据不会丢失,并且每插入一个数据我们的表的长度就加1。
1 //插入元素 2 int InsertList(sqlink L,int data,int no){ 3 int j; 4 if(L->last >= maxsize-1){ 5 printf("没有空闲空间!\n"); 6 return 0; 7 }else if(no<0||no>L->last+1){ 8 printf("插入位置不存在!\n"); 9 return 0; 10 }else{ 11 for(j=L->last;j>=no-1;j--) 12 L->data[j+1] = L->data[j]; 13 L->data[no-1] = data; 14 L->last++; 15 return 0; 16 } 17 }
删除元素的实现:
相对于插入元素,删除元素不需要进行数据的插入,我们想要删除某一个位置的数据只需要把此位置的数据覆盖了就行了,也就是说把需要删除的位置的后继元素都往前移一个位置,把需要删除的位置的数据覆盖的。
1 //删除元素 2 int DeleteList(sqlink L,int no){ 3 int j; 4 if(no<0||no>L->last){ 5 printf("删除的元素不存在"); 6 return 0; 7 }else{ 8 for(j=no;j+1<=L->last;j++) 9 L->data[j] = L->data[j+1]; 10 L->last--; 11 return 0; 12 } 13 }
定位元素的实现:
定位元素的思想很简单,跟数组的遍历时一样的。当我们想要定位某一个数据在表中的位置时,只需要从顺序表的第一位置开始依次查找,直到查找到时返回其在表的位置,如果遍历了所有的元素也没有找到需要的数据便返回空。
1 //定位元素 2 int LocateList(sqlink L,int data){ 3 int i = 0; 4 while(i<=L->last&&L->data[i]!=data) 5 i++; 6 if(i<L->last) return i; 7 else return 0; 8 }
所有代码的实现:
1 #include<stdio.h> 2 #include<malloc.h> 3 #define maxsize 1024 //线性表的最大长度 4 typedef struct{ //表的类型 5 int data[maxsize];//表的储存空间 6 int last; 7 }sqlist,*sqlink; //说明标示符 8 9 10 void CreateList(sqlink L);//创空表 11 void ClearList(sqlink L);//置空表 12 int GetList(sqlink L,int no);//取表元素 13 int LengthList(sqlink L);//求表长 14 int InsertList(sqlink L,int data,int no);//插入元素 15 int DeleteList(sqlink L,int no);//删除元素 16 int LocateList(sqlink L,int data);//定位元素 17 int EmptyList(sqlink L);//判空表 18 void PrintList(sqlink L);//打印表元素 19 20 int main(){ 21 22 sqlink L = (sqlink)malloc(sizeof(sqlist)); 23 CreateList(L); 24 PrintList(L); 25 26 int data,x; 27 printf("请输入要插入的数据和位置:"); 28 scanf("%d %d",&data,&x); 29 InsertList(L,data,x); 30 PrintList(L); 31 32 return 0; 33 } 34 35 void CreateList(sqlink L){ 36 int tempNo = 1; 37 int tempData = 0; 38 do{ 39 printf("请输入顺序表第%d个元素:",tempNo); 40 scanf("%d",&tempData); 41 if(tempData!=-1){ 42 L->data[tempNo-1] = tempData; 43 L->last = tempNo-1; 44 tempNo++; 45 } 46 }while(tempNo<=maxsize&&tempData!=-1); 47 } 48 void PrintList(sqlink L){ 49 int i; 50 for(i = 0;i<LengthList(L);i++){ 51 printf("%d ",L->data[i]); 52 } 53 printf("\n"); 54 } 55 void ClearList(sqlink L){ 56 L->last = -1; 57 } 58 int GetList(sqlink L,int no){ 59 int tempData = 0; 60 tempData = L->data[no-1]; 61 return tempData; 62 } 63 int LengthList(sqlink L){ 64 int tempL; 65 tempL = L->last+1; 66 return tempL; 67 } 68 //插入元素 69 int InsertList(sqlink L,int data,int no){ 70 int j; 71 if(L->last >= maxsize-1){ 72 printf("没有空闲空间!\n"); 73 return 0; 74 }else if(no<0||no>L->last+1){ 75 printf("插入位置不存在!\n"); 76 return 0; 77 }else{ 78 for(j=L->last;j>=no-1;j--) 79 L->data[j+1] = L->data[j]; 80 L->data[no-1] = data; 81 L->last++; 82 return 0; 83 } 84 } 85 //删除元素 86 int DeleteList(sqlink L,int no){ 87 int j; 88 if(no<0||no>L->last){ 89 printf("删除的元素不存在"); 90 return 0; 91 }else{ 92 for(j=no;j+1<=L->last;j++) 93 L->data[j] = L->data[j+1]; 94 L->last--; 95 return 0; 96 } 97 } 98 //定位元素 99 int LocateList(sqlink L,int data){ 100 int i = 0; 101 while(i<=L->last&&L->data[i]!=data) 102 i++; 103 if(i<L->last) return i; 104 else return 0; 105 }