数据结构学习笔记——顺序表的基本操作(超详细最终版+++)建议反复看看ヾ(≧▽≦*)o
目錄
- 前言
- 一、順序表的定義
- 二、順序表的初始化
- 三、順序表的建立
- 四、順序表的輸出
- 五、順序表的逆序輸出
- 六、順序表的插入操作
- 七、順序表的刪除操作
- 八、順序表的按位和按值查找
- 基本操作的完整代碼
- 九*、順序表刪除的常用操作
- 十*、順序表的常用合并操作
前言
以下所有代碼都經過測試,編譯運行軟件:Dev-C++ 5.11,若有表述和代碼錯誤感謝指出!!!
一、順序表的定義
以下操作均為順序表的靜態分配,所以其大小和空間是固定的,可通過MaxSize設置順序表的最大長度。
#include<stdio.h> #define MaxSize 10 //可自行更改最大長度 typedef struct {int data[MaxSize]; //元素int length; //順序表的當前長度 } SqList; //順序表的類型定義二、順序表的初始化
設置順序表的初始長度為0,即L.length=0。
/*初始化順序表*/ void InitList(SqList L) {L.length=0; }三、順序表的建立
/*順序表的建立*/ void CreatList(SqList &L) {printf("請輸入建立順序表的元素個數:\n");scanf("%d",&L.length);for(int i=0; i<L.length; i++) {int number=i+1;printf("請輸入第%d個整數:\n",number);scanf("%d",&L.data[i]);} }四、順序表的輸出
順序表的輸出,依次遍歷從頭到尾輸出順序表中各元素的值,即通過一個for循環,條件<L.length(順序表的總長度),每次輸出元素。
/*順序表的輸出(從頭到尾輸出順序表中各元素的值)*/ void DispList(SqList L) {for(int i=0; i<L.length; i++)printf("%d ",L.data[i]); }結合以上功能函數,如下,創建一個順序表,長度為6,其功能是創建一個順序表并輸入元素,再通過函數調用依次輸出各元素,數據元素依次為2,6,0,-1,4,8,如下完整代碼:
#include<stdio.h> #define MaxSize 10 typedef struct {int data[MaxSize];int length; } SqList;/*1、初始化順序表*/ void InitList(SqList L) {L.length=0; }/*2、順序表的建立*/ void CreatList(SqList &L) {printf("請輸入建立順序表的元素個數:\n");scanf("%d",&L.length);for(int i=0; i<L.length; i++) {int number=i+1;printf("請輸入第%d個整數:\n",number);scanf("%d",&L.data[i]);} }/*3、順序表的輸出(從頭到尾輸出順序表中各元素的值)*/ void DispList(SqList L) {for(int i=0; i<L.length; i++)printf("%d ",L.data[i]); }//主函數 int main() {SqList L;InitList(L);CreatList(L);printf("順序表為:\n"); DispList(L); }首先輸入要創建順序表中的元素個數,然后依次輸入各數據元素,最后輸出該順序表,運行結果如下:
五、順序表的逆序輸出
順序表的逆序輸出也就是交換通過折半法,交換數據元素,然后也是通過調用DispList()函數依次遍歷順序表輸出。
/*將順序表中的所有元素逆置并輸出*/ void ReverseList(SqList L) {int temp;for(int i=0; i<L.length/2; i++) {temp=L.data[i];L.data[i]=L.data[L.length-i-1];L.data[L.length-i-1]=temp;}DispList(L); //調用輸出函數 }例如,接上一個例子,不過這次是逆序輸出順序表,如下完整代碼:
#include<stdio.h> #define MaxSize 10 typedef struct {int data[MaxSize];int length; } SqList;/*1、初始化順序表*/ void InitList(SqList L) {L.length=0; }/*2、順序表的建立*/ void CreatList(SqList &L) {printf("請輸入建立順序表的元素個數:\n");scanf("%d",&L.length);for(int i=0; i<L.length; i++) {int number=i+1;printf("請輸入第%d個整數:\n",number);scanf("%d",&L.data[i]);} }/*3、順序表的輸出(從頭到尾輸出順序表中各元素的值)*/ void DispList(SqList L) {for(int i=0; i<L.length; i++)printf("%d ",L.data[i]); }/*4、將順序表中的所有元素逆置并輸出*/ void ReverseList(SqList L) {int temp;for(int i=0; i<L.length/2; i++) {temp=L.data[i];L.data[i]=L.data[L.length-i-1];L.data[L.length-i-1]=temp;}DispList(L); }//主函數 int main() {SqList L;InitList(L);CreatList(L);printf("逆序輸出順序表:\n");ReverseList(L); }運行結果如下:
六、順序表的插入操作
順序表的插入操作以位序進行插入元素,這里要注意位序是從1開始的,而c語言中的數組下標是從0開始的,這一點在插入操作中要明白,這里加了一個if語句判斷輸入的插入位置是否合法,若不合法則會返回false,插入后,要將其后的元素后移,最后數組長度加1。
/*順序表的插入操作 (在L的位序i處插入元素e)*/ bool ListInsert(SqList &L,int i, int e) {if (i<1||i>L.length||L.length>=MaxSize) //在[1,length+1]內有效且未存滿或等于最大長度return false; //插入失敗返回 falsefor(int j=L.length; j>=i; j--) //j變量等于順序表的長度L.data[j]=L.data[j-1]; //將要插入的位置,第i個元素及以后的元素后移,先移動后面的元素,即數組下標小的賦給下標大的L.data[i-1]=e; //由于數組的下標是從0開始的,所以位序要減一,即將要插入的元素e賦值給L.data[i-1]L.length++; //數組長度加1return true; //插入成功返回 true }例如,向之前所創建好的順序表的位序為3(數組下標為2)處插入數據元素“7”,如下完整代碼:
#include<stdio.h> #define MaxSize 10 typedef struct {int data[MaxSize];int length; } SqList;/*1、初始化順序表*/ void InitList(SqList L) {L.length=0; }/*2、順序表的建立*/ void CreatList(SqList &L) {printf("請輸入建立順序表的元素個數:\n");scanf("%d",&L.length);for(int i=0; i<L.length; i++) {int number=i+1;printf("請輸入第%d個整數:\n",number);scanf("%d",&L.data[i]);} }/*3、順序表的輸出(從頭到尾輸出順序表中各元素的值)*/ void DispList(SqList L) {for(int i=0; i<L.length; i++)printf("%d ",L.data[i]); }/*4、順序表的插入操作 (在L的位序i處插入元素e)*/ bool ListInsert(SqList &L,int i, int e) {if (i<1||i>L.length||L.length>=MaxSize) //在[1,length+1]內有效且未存滿或等于最大長度return false; //插入失敗返回 falsefor(int j=L.length; j>=i; j--) //j變量等于順序表的長度L.data[j]=L.data[j-1]; //將要插入的位置,第i個元素及以后的元素后移,先移動后面的元素,即數組下標小的賦給下標大的L.data[i-1]=e; //由于數組的下標是從0開始的,所以位序要減一,即將要插入的元素e賦值給L.data[i-1]L.length++; //數組長度加1return true; //插入成功返回 true }//主函數 int main() {SqList L;InitList(L);CreatList(L);printf("當前順序表為:\n");DispList(L);ListInsert(L,3,7); //在順序表L的位序為3處插入數據元素7printf("\n");printf("插入后的順序表為:\n");DispList(L); }運行結果如下:
七、順序表的刪除操作
順序表的刪除操作同插入操作一樣,也是通過位序插入/刪除,刪除目標元素后,其后的元素要向前移動一格,最后數組長度要減1。
/*順序表的刪除操作 (刪除L中第i個位置的元素并引用變量e返回)*/ bool ListDelete(SqList &L,int i,int &e) {if (i<1||i>L.length) //在[1,length+1]內有效return false; //刪除失敗返回truee=L.data[i-1]; //將要刪除的元素賦值給e,由于是數組所以要i-1for(int j=i; j<L.length; j++)L.data[j-1]=L.data[j]; //將要刪除的位置,第i個元素后的元素前移,先移動前面的元素,即下標大的賦值給下標小的L.length--; //數組長度減1return true; //刪除成功返回true }例如對創建的順序表,刪除第4個元素(位序為4),然后輸出順序表,完整代碼如下:
#include<stdio.h> #define MaxSize 10 typedef struct {int data[MaxSize];int length; } SqList;/*1、初始化順序表*/ void InitList(SqList L) {L.length=0; }/*2、順序表的建立*/ void CreatList(SqList &L) {printf("請輸入建立順序表的元素個數:\n");scanf("%d",&L.length);for(int i=0; i<L.length; i++) {int number=i+1;printf("請輸入第%d個整數:\n",number);scanf("%d",&L.data[i]);} }/*3、順序表的輸出(從頭到尾輸出順序表中各元素的值)*/ void DispList(SqList L) {for(int i=0; i<L.length; i++)printf("%d ",L.data[i]); }/*4、順序表的刪除操作 (刪除L中第i個位置的元素并引用變量e返回)*/ bool ListDelete(SqList &L,int i,int &e) {if (i<1||i>L.length) //在[1,length+1]內有效return false; //刪除失敗返回truee=L.data[i-1]; //將要刪除的元素賦值給e,由于是數組所以要i-1for(int j=i; j<L.length; j++)L.data[j-1]=L.data[j]; //將要刪除的位置,第i個元素后的元素前移,先移動前面的元素,即下標大的賦值給下標小的L.length--; //數組長度減1return true; //刪除成功返回true }//主函數 int main() {SqList L;int a;int e=0; //初始化e的值 InitList(L);CreatList(L);printf("當前順序表為:\n");DispList(L);printf("\n");printf("請輸入想刪除的元素位置:\n",a);scanf("%d",&a);if (ListDelete(L,a,e))printf("已刪除順序表中第%d個元素,其元素值為%d\n",a,e);elseprintf("輸入的位序i不合法,刪除操作失敗!\n");printf("當前順序表為:\n");DispList(L);return 0; }運行結果如下:
八、順序表的按位和按值查找
順序表的按位查找是以數組下標進行查找的,所以位序要減1,即L.data[i-1]。
/*順序表的按位查找 (獲取L中第i個位置元素的值)*/ int GetElem(SqList L,int i) {return L.data[i-1]; //立即找到第i個元素 }順序表的按值查找是,查找L中第一個元素值等于e的元素,它會依次沿著順序表向后查找,找到后返回其位序。
/*順序表的按值查找 (查找L中第一個元素值等于e的元素并返回其次序)*/ int LocateElem(SqList L,int e) {for(int i=0; i<L.length; i++) //依次從前往后查找if(L.data[i]==e)return i+1; //數組下標為i的元素值為e,返回其位序i+1(數組從0開始)return 0; //未找到元素,退出循環查找失敗 }例如對創建的順序表,查詢順序表中第3個位置的數據元素,另外查詢順序表中第一個元素值等于“4”的數據元素,其完整代碼如下:
#include<stdio.h> #define MaxSize 10 typedef struct {int data[MaxSize];int length; } SqList;/*1、初始化順序表*/ void InitList(SqList L) {L.length=0; }/*2、順序表的建立*/ void CreatList(SqList &L) {printf("請輸入建立順序表的元素個數:\n");scanf("%d",&L.length);for(int i=0; i<L.length; i++) {int number=i+1;printf("請輸入第%d個整數:\n",number);scanf("%d",&L.data[i]);} }/*3、順序表的輸出(從頭到尾輸出順序表中各元素的值)*/ void DispList(SqList L) {for(int i=0; i<L.length; i++)printf("%d ",L.data[i]); }/*4、順序表的按位查找 (獲取L中第i個位置元素的值)*/ int GetElem(SqList L,int i) {return L.data[i-1]; //立即找到第i個元素 }/*5、順序表的按值查找 (查找L中第一個元素值等于e的元素并返回其次序)*/ int LocateElem(SqList L,int e) {for(int i=0; i<L.length; i++) //依次從前往后查找if(L.data[i]==e)return i+1; //數組下標為i的元素值為e,返回其位序i+1(數組從0開始)return 0; //未找到元素,退出循環查找失敗 }//主函數 int main() {SqList L;int a,b;InitList(L);CreatList(L);printf("順序表為:\n");DispList(L);printf("\n");printf("按位查找第3個元素的值:\n");a=GetElem(L,3);printf("%d \n",a);printf("按值查找值為4的元素:\n");b=LocateElem(L,4);printf("%d \n",b); }運行結果如下:
基本操作的完整代碼
以上順序表基本操作的完整代碼如下:
#include<stdio.h> #define MaxSize 10 typedef struct {int data[MaxSize];int length; } SqList;/*1、初始化順序表*/ void InitList(SqList L) {L.length=0; }/*2、順序表的建立*/ void CreatList(SqList &L) {printf("請輸入建立順序表的元素個數:\n");scanf("%d",&L.length);for(int i=0; i<L.length; i++) {int number=i+1;printf("請輸入第%d個整數:\n",number);scanf("%d",&L.data[i]);} }/*3、順序表的輸出(從頭到尾輸出順序表中各元素的值)*/ void DispList(SqList L) {for(int i=0; i<L.length; i++)printf("%d ",L.data[i]); }/*4、將順序表中的所有元素逆置并輸出*/ void ReverseList(SqList L) {int temp;for(int i=0; i<L.length/2; i++) {temp=L.data[i];L.data[i]=L.data[L.length-i-1];L.data[L.length-i-1]=temp;}DispList(L); //調用輸出函數 }/*5、順序表的插入操作 (在L的位序i處插入元素e)*/ bool ListInsert(SqList &L,int i, int e) {if (i<1||i>L.length||L.length>=MaxSize) //在[1,length+1]內有效且未存滿或等于最大長度return false; //插入失敗返回 falsefor(int j=L.length; j>=i; j--) //j變量等于順序表的長度L.data[j]=L.data[j-1]; //將要插入的位置,第i個元素及以后的元素后移,先移動后面的元素,即數組下標小的賦給下標大的L.data[i-1]=e; //由于數組的下標是從0開始的,所以位序要減一,即將要插入的元素e賦值給L.data[i-1]L.length++; //數組長度加1return true; //插入成功返回 true }/*6、順序表的刪除操作 (刪除L中第i個位置的元素并引用變量e返回)*/ bool ListDelete(SqList &L,int i,int &e) {if (i<1||i>L.length) //在[1,length+1]內有效return false; //刪除失敗返回truee=L.data[i-1]; //將要刪除的元素賦值給e,由于是數組所以要i-1for(int j=i; j<L.length; j++)L.data[j-1]=L.data[j]; //將要刪除的位置,第i個元素后的元素前移,先移動前面的元素,即下標大的賦值給下標小的L.length--; //數組長度減1return true; //刪除成功返回true }/*7、順序表的按位查找 (獲取L中第i個位置元素的值)*/ int GetElem(SqList L,int i) {return L.data[i-1]; //立即找到第i個元素 }/*8、順序表的按值查找 (查找L中第一個元素值等于e的元素并返回其次序)*/ int LocateElem(SqList L,int e) {for(int i=0; i<L.length; i++) //依次從前往后查找if(L.data[i]==e)return i+1; //數組下標為i的元素值為e,返回其位序i+1(數組從0開始)return 0; //未找到元素,退出循環查找失敗 }九*、順序表刪除的常用操作
具體的實現步驟感興趣的小伙伴可以看之前這篇文章:
數據結構學習筆記:順序表的刪除操作及其演化題目總結
十*、順序表的常用合并操作
若要將兩個順序表的數據元素合并,通過創建一個CombineList1()函數,將順序表L1和順序表L2分別添加至順序表L3中,該函數中包含三個參數,分別是SqList L1,SqList L2,SqList &L3(順序表L3由于被更改,所以要用引用符號),如下:
只需設置一個while()循環,條件是該順序表的長度,每次將該順序表的值賦給最終順序表,且每次循環變量都加1,如下:
while(i<L1.length)L3.data[k++]=L1.data[i++]; while(j<L2.length)L3.data[k++]=L2.data[j++];該算法的完整代碼:
/*合并兩個順序表*/ bool CombineList1(SqList L1,SqList L2,SqList &L3) {InitList(L3);int i=0,j=0;int k = 0;while(i<L1.length)L3.data[k++]=L1.data[i++];while(j<L2.length)L3.data[k++]=L2.data[j++];L3.length=k;return true; }例如,創建兩個順序表L1、L2,順序表L1的數據元素依次為4、5、0、2、-1;順序表L2的數據元素依次為8、1、4、7、2,將這兩個順序表合并為順序表L3,并最后輸出順序表L3:
代碼如下:
運行結果如下:
若要將兩個有序順序表的數據元素合并,我們則要對上述代碼進行修改,即按順序依次取兩個順序表較小的數據元素存入新的順序表中,然后對剩余的數據元素再添加至新的順序表的后面,創建一個函數CombineList2():
該算法的完整代碼如下:
/*5、合并有序順序表*/ bool CombineList2(SqList L1,SqList L2,SqList &L3) {if(L1.length+L2.length>MaxSize)return false;int i=0,j=0;int k = 0;InitList(L3);while(i<L1.length&&j<L2.length) { //對兩個順序表中的元素兩兩比較,將小者存入結果表 if(L1.data[i]<=L2.data[j])L3.data[k++]=L1.data[i++];elseL3.data[k++]=L2.data[j++];}while(i<L1.length)L3.data[k++]=L1.data[i++];while(j<L2.length)L3.data[k++]=L2.data[j++];L3.length=k;return true; }注:該代碼參考《王道 數據結構 考研復習指導》
例如,創建兩個有序順序表L1、L2,有序順序表L1的數據元素依次為-5、0、3、7;有序順序表L2的數據元素依次為1、7、10,將這兩個有序順序表合并為有序順序表L3,并最后輸出有序順序表L3:
代碼如下:
運行結果如下:
后續更新分割線……
總結
以上是生活随笔為你收集整理的数据结构学习笔记——顺序表的基本操作(超详细最终版+++)建议反复看看ヾ(≧▽≦*)o的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络实验(华为eNSP模拟器)——
- 下一篇: Linux操作系统笔记——Shell变量