今天剛學了數據結構,老師教的我是雲里霧里的,晚上回來自己又教程視頻,不管怎么說算是簡單的實現了順序表的一些簡單功能。順序表里的難點有向順序表里插入元素,刪除元素,查詢元素位置這幾個函數比較難寫,我自己根據這幾個難點做了幾個圖片來解釋這幾個功能的具體實現:
插入元素的實現:
其實數據結構與算法中的順序表的原理跟數組是一樣的。當你在往一個數組中插入一個元素時,為了避免插入的位置的原有數據被覆蓋我們就需要發數組中從插入位置開始的數據統一往后移一個位置,然后再把需要插入的數據插入此時的表中,這樣就可以保證數據不會丟失,並且每插入一個數據我們的表的長度就加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 }