日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言建立线性表(顺序储存,链式储存,循环,双向)全

發(fā)布時(shí)間:2025/3/19 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言建立线性表(顺序储存,链式储存,循环,双向)全 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

c語言建立線性表

  • 順序儲(chǔ)存
    • 儲(chǔ)存結(jié)構(gòu)
    • 初始化(建立)順序表
    • 查找操作
      • 一、按值查找,找到返回對(duì)應(yīng)的下標(biāo)
      • 二、按照下標(biāo)返回元素
    • 插入操作
      • 一、在線性表尾部添加元素
      • 二、在位置i處插入元素
      • 三、順序表(有序)插入,(如都是由小到大)
    • 刪除操作
      • 一、刪除位置i的元素,刪除成功后,返回刪除的值
      • 二、刪除值為val的第一個(gè)元素,沒有返回-1
      • 三、在非遞減有序的有序表中刪除多余的相同元素
    • 其余操作
      • 一、將線性表中的所有元素轉(zhuǎn)置
      • 二、兩個(gè)有序的順序表合并后任然有序
    • 完整代碼
  • 鏈?zhǔn)絻?chǔ)存
    • 存儲(chǔ)結(jié)構(gòu)
    • 建立鏈表
      • 一、尾插法建立
      • 二、頭插法建立
    • 查找位置i的兩種方法
    • 鏈表的查找操作
      • 一、在鏈表中查找第i的節(jié)點(diǎn)
      • 二、在單鏈表中按值查找第一個(gè)與val相等的節(jié)點(diǎn)
      • 三、查找與val值相等的節(jié)點(diǎn)個(gè)數(shù)
      • 四、找鏈表中的最大值與最小值
    • 插入操作
      • 一、在位置i前插入數(shù)據(jù)val
      • 二、在位置i后插入數(shù)據(jù)val
      • 三、在第一個(gè)值為val的后邊添加值val1
    • 刪除操作
    • 鏈表逆置
    • 合并兩個(gè)有序表
    • 完整代碼
  • 循環(huán)鏈表
  • 雙向鏈表
    • 儲(chǔ)存結(jié)構(gòu)
    • 建立雙向鏈表
    • 插入操作
    • 刪除操作
    • 其余操作

順序儲(chǔ)存

儲(chǔ)存結(jié)構(gòu)

采用的是用內(nèi)存動(dòng)態(tài)分配方式定義線性表的順序儲(chǔ)存結(jié)構(gòu)

#define LIST_MAX_SIZE 100 //線性表的最大長(zhǎng)度 #define LISTINCREMENT 10 //線性表一次增加的量typedef struct {int* elem; //指向存放線性表數(shù)據(jù)元素的基地址int length; //線性表當(dāng)前長(zhǎng)度(當(dāng)前存儲(chǔ)的元素個(gè)數(shù))int listsize; // 當(dāng)前分配的存儲(chǔ)容量 }SQList;

初始化(建立)順序表

操作步驟:

  • 申請(qǐng)一片連續(xù)的空間,并將其地址空間賦給elem指針變量。
  • 開始是length 值為0.
  • 對(duì)listsize 賦初值,其值是申請(qǐng)空間的最大容量。
  • //創(chuàng)建一個(gè)線性表 //注意點(diǎn)是:如果無法分配空間,打印提示,并直接返回 void CreateList(SQList &L) {L.elem = (int *)malloc(LIST_MAX_SIZE * sizeof(int));if (!L.elem) {printf("分配地址出錯(cuò)\n");return;}L.length = 0;L.listsize = LIST_MAX_SIZE; }//求線性表中的元素個(gè)數(shù) int ListLength(SQList L) {return L.length; }

    查找操作

    一、按值查找,找到返回對(duì)應(yīng)的下標(biāo)

    一、按值查找,找到返回對(duì)應(yīng)的下標(biāo),沒有則返回-1。如果有多個(gè)返回第一個(gè)的位置
    條件:1、線性表存在;2、線性表中有元素

    算法:在條件滿足的情況下,遍歷一遍,如果下標(biāo)在i~length之間就返回下標(biāo)

    int ListLocate(SQList L, int e) {if (!L.elem ) {printf("線性表沒有初始化\n");return -1;}if (L.length == 0) {printf("線性表中沒有元素\n");return -1;}int i = 1;//下標(biāo)是從1開始存儲(chǔ)元素的while (i <= L.length && e != L.elem[i])i++;if (i <= L.length) {printf("元素已經(jīng)找到\n");return i;}else {printf("線性表中沒有該元素\n");return -1;} }

    二、按照下標(biāo)返回元素

    條件:1、線性表存在;2、下表沒有越界

    int GetList(SQList L,int i) {if (!L.elem) {printf("線性表沒有初始化\n");return -1;}if (i<1 || i>L.length) {printf("數(shù)組下標(biāo)越界\n");return -1;}return L.elem[i]; }

    插入操作

    插入步驟,在后邊一定要將 length 加1

    一、在線性表尾部添加元素

    條件:線性表存在

    在條件滿足情況下:L.elem[++L.length] = val; 表示在尾部添加元素

    void ListPush(SQList& L,int val) {if (!L.elem) {printf("線性表沒有初始化\n");return ;}if (L.length == L.listsize)//當(dāng)前存儲(chǔ)空間已經(jīng)滿了,增加分量{//在原來基礎(chǔ)上擴(kuò)大int* newbase = (int*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(int));if (!newbase) {printf("分配空間錯(cuò)誤\n");return;}L.elem = newbase; //獲得新基址L.listsize += LISTINCREMENT;//更新容量}//在尾部插入L.elem[++L.length] = val; }

    二、在位置i處插入元素

    步驟:

  • 將位置i以后的元素后移一個(gè)位置。
  • 在i處插入值
  • void ListInsert(SQList& L, int i, int val) {if (!L.elem) {printf("線性表沒有初始化\n");return;}if (L.length == L.listsize)//當(dāng)前存儲(chǔ)空間已經(jīng)滿了,增加分量{//在原來基礎(chǔ)上擴(kuò)大int* newbase = (int*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(int));if (!newbase) {printf("分配空間錯(cuò)誤\n");return;}L.elem = newbase; //獲得新基址L.listsize += LISTINCREMENT;//更新容量}for (int j = L.length; j >= i; --j) {L.elem[j + 1] = L.elem[j]; //i后面的元素后移}//插入元素L.elem[i] = val;L.length++; }

    三、順序表(有序)插入,(如都是由小到大)

    基本思路是:

  • 先找到值val插入的位置。

  • int pos = L.length;while (pos > 0 && val < L.elem[pos])pos--;//這個(gè)循壞結(jié)束后,POS對(duì)應(yīng)位置元素是小于等于val的,所以可以將val插到其后邊 for (int i = L.length; i >= pos+1; i--)L.elem[i + 1] = L.elem[i];//在pos后邊插入L.elem[pos + 1] = val;
  • 然后將該位置以后到結(jié)尾的元素依次向后移到一位,然后在空出的位置插入val

  • void ListInsertorder(SQList& L, int val) {if (!L.elem) {printf("線性表沒有初始化\n");return;}if (L.length == L.listsize)//當(dāng)前存儲(chǔ)空間已經(jīng)滿了,增加分量{//在原來基礎(chǔ)上擴(kuò)大int* newbase = (int*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(int));if (!newbase) {printf("分配空間錯(cuò)誤\n");return;}L.elem = newbase; //獲得新基址L.listsize += LISTINCREMENT;//更新容量}//找到要插入的位置int pos = L.length;while (pos > 0 && val < L.elem[pos])pos--;//這個(gè)循壞結(jié)束后,POS對(duì)應(yīng)位置元素是小于等于val的,所以可以將val插到其后邊for (int i = L.length; i >= pos+1; i--)L.elem[i + 1] = L.elem[i];//插入L.elem[pos + 1] = val;L.length++; }

    刪除操作

    插入步驟,在后邊一定要將 length 減1

    一、刪除位置i的元素,刪除成功后,返回刪除的值

    兩種情況一個(gè)是在尾部,另一個(gè)是其余位置。 如果是在結(jié)尾只要length減一就可以了。
    條件:添加 i不能越界

    基本步驟:

  • 判斷位置i是否合理
  • 將位置i處的值取出
  • 將位置i+1到結(jié)尾的元素向前移動(dòng)一位
  • length –
  • int ListDelete(SQList& L, int i) {if (!L.elem) {printf("線性表沒有初始化\n");return -1;}if (i<1 || i>L.length) {printf("數(shù)組越界\n");return -1;}int val = L.elem[i];if (i == L.length)L.length--;else{//元素往前移for (; i < L.length; i++)L.elem[i] = L.elem[i + 1];L.length--;}return val; }

    二、刪除值為val的第一個(gè)元素,沒有返回-1

    int ListDelete_Sq(SQList& L, int val) {//找到元素在的位置int i = 1;while (i <= L.length && val != L.elem[i])i++;//分情況刪除if (i == L.length)L.length--;else if (i < L.length) {//元素前移for (; i < L.length; ++i)L.elem[i] = L.elem[i + 1];L.length--;}else{printf("要?jiǎng)h除的數(shù)據(jù)元素不存在\n");return -1;} }

    三、在非遞減有序的有序表中刪除多余的相同元素

    基本思路是:

    因?yàn)槭怯行虻乃邢嗤匾欢ㄊ窍噜彽?#xff0c;所有只要依次比較相鄰的元素,刪去相同的。

    void Listdelete_Sq(SQList& L) {int i = 1;while (i < L.length) {if (L.elem[i] != L.elem[i + 1])i++;else { //刪除 第i+1個(gè)元素if (i == L.length - 1)L.length--;else {for (int j = i + 1; j < L.length; j++)L.elem[j] = L.elem[j + 1];//刪除第i個(gè)元素L.length--;//長(zhǎng)度減一}}} }

    其余操作

    一、將線性表中的所有元素轉(zhuǎn)置

    void reverse_Sq(SQList& L) {int i = 1, j = L.length;while (i < j){int temp = L.elem[i];L.elem[i] = L.elem[j];L.elem[j] = temp;i++, j--;} }

    二、兩個(gè)有序的順序表合并后任然有序

    思路是:

    取出第一個(gè)邊和第二個(gè)表中最小的數(shù)據(jù),兩者比較,將最小的插入到第三個(gè)表中,重復(fù)上述步驟。直到有一個(gè)表為空。然后繼續(xù)將不為空的表中的元素依次插入到第三個(gè)表中。

    SQList MergeList_Sq(SQList La, SQList Lb) {SQList Lc;Lc.listsize = Lc.length = La.length + Lb.length;Lc.elem = (int*)malloc(Lc.listsize * sizeof(int));int i, j, k;i = j = k = 1;while (i <= La.length && j <= Lb.length) {if (La.elem[i] <= Lb.elem[j])Lc.elem[k++] = La.elem[i++];elseLc.elem[k++] = Lb.elem[j++];}while(i<=La.length)Lc.elem[k++] = La.elem[i++];while(j<=Lb.length)Lc.elem[k++] = Lb.elem[j++];return Lc; }

    完整代碼

    #include<stdio.h> #include<malloc.h>#define LIST_MAX_SIZE 100 //線性表的最大長(zhǎng)度 #define LISTINCREMENT 10 //線性表一次增加的量typedef struct {int* elem; //指向存放線性表數(shù)據(jù)元素的基地址int length; //線性表當(dāng)前長(zhǎng)度(當(dāng)前存儲(chǔ)的元素個(gè)數(shù))int listsize; // 當(dāng)前分配的存儲(chǔ)容量 }SQList;//創(chuàng)建一個(gè)線性表 //注意點(diǎn)是:如果無法分配空間,打印提示,并直接返回 void CreateList(SQList &L) {L.elem = (int *)malloc(LIST_MAX_SIZE * sizeof(int));if (!L.elem) {printf("分配地址出錯(cuò)\n");return;}L.length = 0;L.listsize = LIST_MAX_SIZE; }//求線性表中的元素個(gè)數(shù) int ListLength(SQList L) {return L.length; }//增加容量 void increte_List(SQList& L) {//在原來基礎(chǔ)上擴(kuò)大int* newbase = (int*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(int));if (!newbase) {printf("分配空間錯(cuò)誤\n");return;}L.elem = newbase; //獲得新基址L.listsize += LISTINCREMENT;//更新容量 }/* 查找操作*/ //一、按值查找,找到返回對(duì)應(yīng)的下標(biāo),沒有則返回-1。如果有多個(gè)返回第一個(gè)的位置 //條件:1、線性表存在;2、線性表中有元素int ListLocate(SQList L, int e) {if (!L.elem ) {printf("線性表沒有初始化\n");return -1;}if (L.length == 0) {printf("線性表中沒有元素\n");return -1;}int i = 1;//下標(biāo)是從1開始存儲(chǔ)元素的while (i <= L.length && e != L.elem[i])i++;if (i <= L.length) {printf("元素已經(jīng)找到\n");return i;}else {printf("線性表中沒有該元素\n");return -1;} }//二、按照下標(biāo)返回元素 //條件:1、線性表存在;2、下表沒有越界int GetList(SQList L,int i) {if (!L.elem) {printf("線性表沒有初始化\n");return -1;}if (i<1 || i>L.length) {printf("數(shù)組下標(biāo)越界\n");return -1;}return L.elem[i]; }/* 插入元素*/ //一、在線性表尾部添加元素 //條件:線性表存在 void ListPush(SQList& L,int val) {if (!L.elem) {printf("線性表沒有初始化\n");return ;}if (L.length == L.listsize)//當(dāng)前存儲(chǔ)空間已經(jīng)滿了,增加分量increte_List(L);//在尾部插入L.elem[++L.length] = val; }//二、在位置i處插入元素 void ListInsert(SQList& L, int i, int val) {if (!L.elem) {printf("線性表沒有初始化\n");return;}if (L.length == L.listsize)//當(dāng)前存儲(chǔ)空間已經(jīng)滿了,增加分量increte_List(L);for (int j = L.length; j >= i; --j) {L.elem[j + 1] = L.elem[j]; //i后面的元素后移}//插入元素L.elem[i] = val;L.length++; }//三、順序表(有序)插入,(如都是由小到大) void ListInsertorder(SQList& L, int val) {if (!L.elem) {printf("線性表沒有初始化\n");return;}if (L.length == L.listsize)//當(dāng)前存儲(chǔ)空間已經(jīng)滿了,增加分量increte_List(L);//找到要插入的位置int pos = L.length;while (pos > 0 && val < L.elem[pos])pos--;//這個(gè)循壞結(jié)束后,POS對(duì)應(yīng)位置元素是小于等于val的,所以可以將val插到其后邊for (int i = L.length; i >= pos+1; i--)L.elem[i + 1] = L.elem[i];//插入L.elem[pos + 1] = val;L.length++; }/* 刪除操作*/ // 一、刪除位置i的元素,刪除成功后,返回刪除的值 // 兩種情況一個(gè)是在尾部,另一個(gè)是其余位置 //添加 i不能越界 int ListDelete(SQList& L, int i) {if (!L.elem) {printf("線性表沒有初始化\n");return -1;}if (i<1 || i>L.length) {printf("數(shù)組越界\n");return -1;}int val = L.elem[i];if (i == L.length)L.length--;else{//元素往前移for (; i < L.length; i++)L.elem[i] = L.elem[i + 1];L.length--;}return val; }//二、刪除值為val的第一個(gè)元素,沒有返回-1int ListDelete_Sq(SQList& L, int val) {//找到元素在的位置int i = 1;while (i <= L.length && val != L.elem[i])i++;//分情況刪除if (i == L.length)L.length--;else if (i < L.length) {//元素前移for (; i < L.length; ++i)L.elem[i] = L.elem[i + 1];L.length--;}else{printf("要?jiǎng)h除的數(shù)據(jù)元素不存在\n");return -1;} }//三、在非遞減有序的有序表中刪除多余的相同元素 void Listdelete_Sq(SQList& L) {int i = 1;while (i < L.length) {if (L.elem[i] != L.elem[i + 1])i++;else { //刪除 第i+1個(gè)元素if (i == L.length - 1)L.length--;else {for (int j = i + 1; j < L.length; j++)L.elem[j] = L.elem[j + 1];//刪除第i個(gè)元素L.length--;//長(zhǎng)度減一}}} }/*其余操作*/ //一、將線性表中的所有元素轉(zhuǎn)置void reverse_Sq(SQList& L) {int i = 1, j = L.length;while (i < j){int temp = L.elem[i];L.elem[i] = L.elem[j];L.elem[j] = temp;i++, j--;} }//二、兩個(gè)有序的順序表合并后任然有序 SQList MergeList_Sq(SQList La, SQList Lb) {SQList Lc;Lc.listsize = Lc.length = La.length + Lb.length;Lc.elem = (int*)malloc(Lc.listsize * sizeof(int));int i, j, k;i = j = k = 1;while (i <= La.length && j <= Lb.length) {if (La.elem[i] <= Lb.elem[j])Lc.elem[k++] = La.elem[i++];elseLc.elem[k++] = Lb.elem[j++];}while(i<=La.length)Lc.elem[k++] = La.elem[i++];while(j<=Lb.length)Lc.elem[k++] = Lb.elem[j++];return Lc; }void show(SQList L) {for (int i = 1; i <= L.length; ++i)printf("%d ", L.elem[i]);printf("\n"); }int main() {SQList La, Lb,Lc;CreateList(La);CreateList(Lb);for (int i = 1; i <= 5; ++i){int x;scanf_s("%d", &x);ListPush(La, x);}for (int i = 1; i <= 5; ++i){int x;scanf_s("%d", &x);ListPush(Lb, x);}show(La), show(Lb);reverse_Sq(Lb);show(Lb);Lc = MergeList_Sq(La, Lb);show(Lc);return 0; }

    鏈?zhǔn)絻?chǔ)存

    存儲(chǔ)結(jié)構(gòu)

    typedef struct LNode {int date;LNode* next; }LNode;

    建立鏈表

    一、尾插法建立

    ,需要建立三個(gè)指針,一個(gè)指向頭指針,一個(gè)始終指向尾部,一個(gè)指向新建立的

    基本思路是:

    為頭節(jié)點(diǎn)申請(qǐng)空間后,讓s也指向頭結(jié)點(diǎn)。然后為p申請(qǐng)空間并賦值,將s的下一個(gè)指針指向p,然后指針s后移。(即將p賦給s),重復(fù)這個(gè)步驟

    LNode* create_E(int n) {LNode* head, * s,*p;head = (LNode *)malloc(sizeof(LNode));head->next = NULL;s = head;while (n--) {p = (LNode*)malloc(sizeof(LNode));scanf_s("%d", &p->date);s->next = p; //把新節(jié)點(diǎn)插入鏈表的結(jié)尾s = p; //指針s后移}s->next = NULL;return head; }

    二、頭插法建立

    核心思路:

    在頭結(jié)點(diǎn)后插入新節(jié)點(diǎn)。理解好這句。
    我們要在頭結(jié)點(diǎn)后邊插入新節(jié)點(diǎn),要什么做呢?首先是將原本頭結(jié)點(diǎn)的next放到新建立的節(jié)點(diǎn)的next把,然后再講頭結(jié)點(diǎn)的next指向p。

    //只需要兩個(gè)指針 LNode* create_H(int n) { //得到的鏈表與輸入的值相反LNode* head, * p;head = (LNode*)malloc(sizeof(LNode));head->next = NULL;while (n--) {p = (LNode*)malloc(sizeof(LNode));scanf_s("%d", &p->date);p->next = head->next; //在頭結(jié)點(diǎn)后插入新節(jié)點(diǎn)head->next = p;}return head; }

    查找位置i的兩種方法

    1、在i滿足1<=i<=length 的情況下一直往后移動(dòng)i次就可以了。

    LNode* p = head->next;int len = GetLength(head);if (i > len||i<1) {printf("i值不合理\n");return -1;}while (--i) {p = p->next;}

    因?yàn)樵谶@里 p初值是 head->next 所以只要移動(dòng)i-1次就到位置i了,所以是while(–i),如果是p初值是 head,則是 i–

    2、

    LNode* p, * s;p = head; //賦值是頭結(jié)點(diǎn),不是nextint j = 0;while (p && j < i ) { //找第i個(gè)位置p = p->next;j++;}if (!p || j > i) //對(duì)應(yīng)的情況是i超過長(zhǎng)度,與i小于0{printf("i不合理\n");return;}

    鏈表的查找操作

    一、在鏈表中查找第i的節(jié)點(diǎn)

    //需要檢測(cè) i的值是否合理int GetElem(LNode* head,int i) {LNode* p = head->next;int len = GetLength(head);if (i > len||i<1) {printf("i值不合理\n");return -1;}while (--i) {p = p->next;}return p->date; }

    二、在單鏈表中按值查找第一個(gè)與val相等的節(jié)點(diǎn)

    int LocateElem(LNode* head,int val) {int i = 1;LNode* p = head->next;if (!p){printf("當(dāng)前鏈表為空\(chéng)n");return -1;}while (p && p->date != val) {p = p->next;i++;}//printf("位置i為:%d", i);if (i > GetLength(head)){printf("當(dāng)前鏈表中沒有該值\n");return -1;}elsereturn i;}

    三、查找與val值相等的節(jié)點(diǎn)個(gè)數(shù)

    int findnum(LNode* head,int val) {LNode* p = head->next;int num = 0;while (p) {if (p->date == val)num++;p = p->next;}return num; }

    四、找鏈表中的最大值與最小值

    void find_max_min(LNode* head) {LNode* p = head->next;int Max = p->date, Min = p->date;while (p) {if (p->date > Max)Max = p->date;elseMin = p->date;p = p->next;}printf("最大值是:%d 最小值是:%d\n", Max, Min); }

    插入操作

    一、在位置i前插入數(shù)據(jù)val

    void ListInsert_P(LNode* head, int i, int val) {LNode* p, * s;p = head; //賦值是頭結(jié)點(diǎn),不是nextint j = 0;while (p && j < i - 1) { //找第i-1個(gè)位置p = p->next;j++;}if (!p || j > i - 1) //對(duì)應(yīng)的情況是i超過長(zhǎng)度,與i小于1return;else{s = (LNode*)malloc(sizeof(LNode));s->date = val;s->next = p->next;p->next = s;} }

    二、在位置i后插入數(shù)據(jù)val

    //第0個(gè)就是在頭結(jié)點(diǎn)后邊 void ListInsert_N(LNode* head, int i, int val) {LNode* p, * s;p = head; //賦值是頭結(jié)點(diǎn),不是nextint j = 0;while (p && j < i ) { //找第i個(gè)位置p = p->next;j++;}//printf("j: %d\n", j);if (!p || j > i) //對(duì)應(yīng)的情況是i超過長(zhǎng)度,與i小于0{printf("i不合理\n");return;}else{s = (LNode*)malloc(sizeof(LNode));s->date = val;s->next = p->next;p->next = s;} }

    三、在第一個(gè)值為val的后邊添加值val1

    void ListInsert_V(LNode* head, int val, int val1) {int i = LocateElem(head, val);//找到值val對(duì)應(yīng)的位置//printf("位置i為:%d", i);ListInsert_N(head, i, val1); }

    刪除操作

    int ListDelete(LNode* head, int i) {LNode* p, * q;int val;p = head;int j = 0;while (p->next && j > i - 1) {p = p->next;j++;}if (!p->next || j > i - 1)return -1;else{q = p->next;p->next = q->next;val = q->date;free(q);//釋放刪除的節(jié)點(diǎn)}return val; }

    鏈表逆置

    void List_reverse(LNode* head) {LNode* p, * pre,*temp;pre = NULL;p = head->next;while (p) {temp = p->next;p->next = pre;pre = p;p = temp;}head->next = pre; //pre指向的是原來鏈表的終點(diǎn) }

    合并兩個(gè)有序表

    LNode* MargeList(LNode* head1, LNode* head2) {LNode* Lc,*La,*Lb,*head;head = (LNode*)malloc(sizeof(LNode));head->next = NULL;Lc = head;La = head1->next;Lb = head2->next;while (La && Lb) {if (La->date <= Lb->date){Lc->next = La;Lc = La; //記得后移La = La->next;}else{Lc->next = Lb;Lc = Lb;Lb = Lb->next;}}Lc->next = La ? La : Lb;return head; }

    完整代碼

    #include<stdio.h> #include<malloc.h>typedef struct LNode {int date;LNode* next; }LNode;/* 建立鏈表*/ //一、尾插法建立,需要建立三個(gè)指針 //一個(gè)指向頭指針,一個(gè)始終指向尾部,一個(gè)指向新建立的 LNode* create_E(int n) {LNode* head, * s,*p;head = (LNode *)malloc(sizeof(LNode));head->next = NULL;s = head;while (n--) {p = (LNode*)malloc(sizeof(LNode));scanf_s("%d", &p->date);s->next = p; //把新節(jié)點(diǎn)插入鏈表的結(jié)尾s = p; //指針s后移}s->next = NULL;return head; }//二、頭插法建立 //只需要兩個(gè)指針 LNode* create_H(int n) { //得到的鏈表與輸入的值相反LNode* head, * p;head = (LNode*)malloc(sizeof(LNode));head->next = NULL;while (n--) {p = (LNode*)malloc(sizeof(LNode));scanf_s("%d", &p->date);p->next = head->next; //在頭結(jié)點(diǎn)后插入新節(jié)點(diǎn)head->next = p;}return head; }/*求鏈表的長(zhǎng)度*/ int GetLength(LNode* head) {LNode* p = head->next;int len = 0;while (p) {p = p->next;len++;}return len; }/*鏈表的查找*/ //一、在鏈表中查找第i的節(jié)點(diǎn) //需要檢測(cè) i的值是否合理int GetElem(LNode* head,int i) {LNode* p = head->next;int len = GetLength(head);if (i > len||i<1) {printf("i值不合理\n");return -1;}while (--i) {p = p->next;}return p->date; }//二、在單鏈表中按值查找第一個(gè)與val相等的節(jié)點(diǎn) int LocateElem(LNode* head,int val) {int i = 1;LNode* p = head->next;if (!p){printf("當(dāng)前鏈表為空\(chéng)n");return -1;}while (p && p->date != val) {p = p->next;i++;}//printf("位置i為:%d", i);if (i > GetLength(head)){printf("當(dāng)前鏈表中沒有該值\n");return -1;}elsereturn i;} // 三、查找與val值相等的節(jié)點(diǎn)個(gè)數(shù) int findnum(LNode* head,int val) {LNode* p = head->next;int num = 0;while (p) {if (p->date == val)num++;p = p->next;}return num; }//四、找鏈表中的最大值與最小值 void find_max_min(LNode* head) {LNode* p = head->next;int Max = p->date, Min = p->date;while (p) {if (p->date > Max)Max = p->date;elseMin = p->date;p = p->next;}printf("最大值是:%d 最小值是:%d\n", Max, Min); }/*插入操作*/ //一、在位置i前插入數(shù)據(jù)valvoid ListInsert_P(LNode* head, int i, int val) {LNode* p, * s;p = head; //賦值是頭結(jié)點(diǎn),不是nextint j = 0;while (p && j < i - 1) { //找第i-1個(gè)位置p = p->next;j++;}if (!p || j > i - 1) //對(duì)應(yīng)的情況是i超過長(zhǎng)度,與i小于1return;else{s = (LNode*)malloc(sizeof(LNode));s->date = val;s->next = p->next;p->next = s;} }//二、在位置i后插入數(shù)據(jù)val //第0個(gè)就是在頭結(jié)點(diǎn)后邊 void ListInsert_N(LNode* head, int i, int val) {LNode* p, * s;p = head; //賦值是頭結(jié)點(diǎn),不是nextint j = 0;while (p && j < i ) { //找第i個(gè)位置p = p->next;j++;}//printf("j: %d\n", j);if (!p || j > i) //對(duì)應(yīng)的情況是i超過長(zhǎng)度,與i小于0{printf("i不合理\n");return;}else{s = (LNode*)malloc(sizeof(LNode));s->date = val;s->next = p->next;p->next = s;} }//三、在第一個(gè)值為val的后邊添加值val1 void ListInsert_V(LNode* head, int val, int val1) {int i = LocateElem(head, val);//找到值val對(duì)應(yīng)的位置//printf("位置i為:%d", i);ListInsert_N(head, i, val1); }/*刪除操作*/ //一、刪除位置i的節(jié)點(diǎn),并返回刪除節(jié)點(diǎn)的值int ListDelete(LNode* head, int i) {LNode* p, * q;int val;p = head;int j = 0;while (p->next && j > i - 1) {p = p->next;j++;}if (!p->next || j > i - 1)return -1;else{q = p->next;p->next = q->next;val = q->date;free(q);//釋放刪除的節(jié)點(diǎn)}return val; }/*鏈表逆置*/ void List_reverse(LNode* head) {LNode* p, * pre,*temp;pre = NULL;p = head->next;while (p) {temp = p->next;p->next = pre;pre = p;p = temp;}head->next = pre; //pre指向的是原來鏈表的終點(diǎn) }/*合并兩個(gè)有序表*/ LNode* MargeList(LNode* head1, LNode* head2) {LNode* Lc,*La,*Lb,*head;head = (LNode*)malloc(sizeof(LNode));head->next = NULL;Lc = head;La = head1->next;Lb = head2->next;while (La && Lb) {if (La->date <= Lb->date){Lc->next = La;Lc = La; //記得后移La = La->next;}else{Lc->next = Lb;Lc = Lb;Lb = Lb->next;}}Lc->next = La ? La : Lb;return head; }void show(LNode* head) {LNode* p = head->next;while (p) {printf("%d ", p->date);p = p->next;}printf("\n"); }int main() {LNode* head1,*head2,*head;head1 = create_E(5);show(head1);/*head2 = create_H(5);show(head2);List_reverse(head2);show(head2);head = MargeList(head1, head2);show(head);*/ListInsert_V(head1, 3, 8);show(head1);ListInsert_P(head1, 3, 47);show(head1);return 0; }

    循環(huán)鏈表

    • 簡(jiǎn)單來說就是將原本最后一個(gè)結(jié)點(diǎn)的指針域由空指針指向頭結(jié)點(diǎn)。
    • 最后一個(gè)結(jié)點(diǎn)的語句是:p->next == head
    /* 創(chuàng)建循環(huán)鏈表(返回尾指針)*/LNode* circular(int n) {LNode* head, * s, * p,*tail;head = (LNode*)malloc(sizeof(LNode));//為頭結(jié)點(diǎn)申請(qǐng)空間head->next = NULL;s = head;while (n--) {p = (LNode*)malloc(sizeof(LNode));scanf_s("%d", &p->date);s->next = p; //把新節(jié)點(diǎn)插入鏈表的結(jié)尾s = p; //指針s后移}s->next = head;//建立循環(huán)tail = s;return tail; }/*打印循環(huán)鏈表*/ void show_cir(LNode* tail) {LNode* head = tail->next;LNode* p = tail->next->next;while (p != head) {printf("%d ", p->date);p = p->next;}printf("\n"); }

    雙向鏈表

    儲(chǔ)存結(jié)構(gòu)

    /*雙向鏈表*/ typedef struct Node {int date;Node* prior;Node* next; }DuLinkList;

    建立雙向鏈表

    /*建立雙向鏈表*/ DuLinkList* create_DuL(int n) {DuLinkList* head, * p, * s;head = (DuLinkList*)malloc(sizeof(DuLinkList));head->next = NULL;head->prior = NULL;s = head;while (n--) {p = (DuLinkList*)malloc(sizeof(DuLinkList));scanf_s("%d", &p->date);s->next = p;p->prior = s;s = p;}s->next = NULL;return head; }

    插入操作

    /*雙向鏈表的插入操作*/ void ListInsert_DuL(DuLinkList* head, int i, int val) {int len = Get_num(head);if (i<1 || i>len){printf("i不合法\n");return;}DuLinkList* p ,*s;s = (DuLinkList*)malloc(sizeof(DuLinkList));s->date = val;p = head;while (--i)//i-- 得到的是位置i的結(jié)點(diǎn),p = p->next;//printf("p = %d\n", p->date);//循環(huán)結(jié)束后p指向的是i的前一個(gè)結(jié)點(diǎn)s->next = p->next;p->next->prior = s;p->next = s;s->prior = p; }

    刪除操作

    /*雙向鏈表的刪除操作*/ int ListDelete_DuL(DuLinkList* head, int i) {int len = Get_num(head);if (i<1 || i>len){printf("i不合法\n");return -1;}DuLinkList* p;p = head;while (--i)p = p->next;//printf("p = %d\n", p->date);//循環(huán)結(jié)束后p指向的是i的前一個(gè)結(jié)點(diǎn)p = p->next; //為了簡(jiǎn)便指向位置i的結(jié)點(diǎn)int val = p->date;p->prior->next = p->next;p->next->prior = p->prior;free(p);return val; }

    其余操作

    /*雙向鏈表中結(jié)點(diǎn)個(gè)數(shù)(存有數(shù)據(jù)的)*/ int Get_num(DuLinkList* head) {DuLinkList* p = head->next;int num = 0;while (p != NULL) {p = p->next;num++;}//printf("num = %d\n", num);return num; }void show_DuL(DuLinkList* head) {DuLinkList* p = head->next;while (p) {printf("%d ", p->date);p = p->next;}printf("\n"); }

    總結(jié)

    以上是生活随笔為你收集整理的c语言建立线性表(顺序储存,链式储存,循环,双向)全的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 一级黄色网址 | 性欧美巨大 | 精品人伦一区二区三区 | 亚洲精品喷潮一区二区三区 | 欧美黑人一区二区 | 久久人爽| 日本少妇喷水视频 | 女人和拘做爰正片视频 | 午夜福利电影一区 | 欧美视频一区二区在线 | av污在线观看 | av免费观看在线 | 成人av在线网址 | 日韩在线观看免费高清 | 天天曰天天干 | 激情四虎 | 艳妇臀荡乳欲伦交换电影 | jizz日本少妇 | 永久免费看mv网站入口78 | 欧美一二三区 | 一极黄色大片 | 91久久精品国产91性色tv | 这里只有精品999 | www.啪啪 | 91日韩中文字幕 | 超碰888 | 国产精品久久久久久人妻精品动漫 | 成人精品免费看 | 丁香花电影免费播放在线观看 | 亚洲先锋影音 | 91精品国产91久久久久青草 | 国产成人精品午夜福利Av免费 | 四虎精品一区二区 | 亚洲午夜精品 | 久久精品无码一区二区三区免费 | 国内精品福利视频 | 欧美三级韩国三级日本三斤在线观看 | www狠狠爱| 美女扒开下面让男人捅 | 毛片免 | 国产成人激情视频 | av在线你懂的| 自拍偷拍欧美亚洲 | 国产激情免费 | 国产欧美一区二区三区免费看 | 色原网| www.国产精品视频 | 色婷婷国产精品久久包臀 | 亚洲欧洲自拍偷拍 | 欧美日韩一区二区三区视频 | 国产亚洲精品久久 | 色综合久久久久久久 | 亚洲av无码不卡一区二区三区 | 日本精品99| 欧美毛片视频 | 在线观看一区视频 | zzjizzji亚洲日本少妇 | 岛国伊人| 日韩黄色在线播放 | 2023毛片 | 久久久久久毛片 | 日韩最新视频 | 在线播放精品 | 精品久久久久久亚洲精品 | 精品一区二区久久久久蜜桃 | 99热这里只有精品66 | 色婷婷aⅴ一区二区三区 | 小日子的在线观看免费第8集 | 亚洲一区视频在线 | 中文字幕在线观看网 | 无码人妻精品一区二区三应用大全 | 亚洲va欧美va| 色噜噜亚洲 | 福利二区 | 欧美综合在线一区 | 国产一区在线观看免费 | 女同性恋一区二区三区 | 久久艹综合 | xx在线视频 | 日韩人妻精品无码一区二区三区 | 亚洲视频在线观看一区二区三区 | 五月天av网| 丁香花电影免费播放电影 | 欧美一级淫片免费视频魅影视频 | 国产精品自拍在线观看 | 色综合天天综合网天天狠天天 | 美女毛片网站 | 四虎午夜影院 | 亚洲人成在线观看 | 波多野结衣一区二区三区高清 | 爽妇网av | 欧美性成人 | 欧美黄色大片免费观看 | 超碰在线97国产 | 女生张开腿让男生插 | 成人自拍在线 | 日本成人综合 | 永久免费av在线 | 在线观看免费视频国产 |