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