C++线性表(单链表)的应用算法(附源码)
生活随笔
收集整理的這篇文章主要介紹了
C++线性表(单链表)的应用算法(附源码)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C++線性表(單鏈表)的應(yīng)用算法
線性表(單鏈表)的應(yīng)用算法:
構(gòu)造一個(gè)遞增有序的正整數(shù)鏈表,實(shí)現(xiàn)鏈表分解為一個(gè)奇數(shù)表和一個(gè)偶數(shù)表,之后再將兩個(gè)鏈表合并一個(gè)遞減鏈表。
運(yùn)行截圖
代碼實(shí)現(xiàn)
/* 線性表(單鏈表)的應(yīng)用算法: 構(gòu)造一個(gè)遞增有序的正整數(shù)鏈表,實(shí)現(xiàn)鏈表分解為一個(gè)奇數(shù)表和一個(gè)偶數(shù)表,之后再將兩個(gè)鏈表合并一個(gè)遞減鏈表。 */#include <stdio.h> #include <stdlib.h> #include <string.h>struct Sqlist //單鏈表結(jié)構(gòu)體 {int data;Sqlist* next; //指針域 };//初始化鏈表 void Start(Sqlist* L, Sqlist* M, Sqlist* N, Sqlist* H)//L初始鏈表 M奇數(shù)鏈表 N偶數(shù)鏈表 H合并后的鏈表 {//初始化鏈表為空L->next = NULL; //L->next = NULL可代表L鏈表的尾節(jié)點(diǎn)(L->next代表L的下一個(gè)節(jié)點(diǎn),下一個(gè)節(jié)點(diǎn)為NULL,則表示沒(méi)有下一個(gè)節(jié)點(diǎn),即為空)M->next = NULL;N->next = NULL;H->next = NULL;printf("【提示】初始化成功!\n"); }//判斷初始鏈表是否為空 void Emp(Sqlist* L) {if (L->next == NULL)printf("【提示】鏈表為空!\n");elseprintf("【提示】鏈表存在數(shù)據(jù)!\n"); }//求初始鏈表長(zhǎng)度 void Length(Sqlist* L) {Sqlist* p;int length = 0;p = L;//while(p->next!=NULL)//當(dāng)p指針的后一節(jié)點(diǎn)不為空時(shí)(當(dāng)不為尾節(jié)點(diǎn)時(shí))while (p->next)//當(dāng)p指針的后一節(jié)點(diǎn)存在時(shí){length++;p = p->next;//往后移動(dòng)指針p}printf("【提示】當(dāng)前鏈表長(zhǎng)度為:%d\n", length); }//在初始鏈表中插入數(shù)據(jù)元素(遞增) void Input(Sqlist* L, int n) {Sqlist* q, * p;int i;for (i = 1; i <= n; i++){ //輸入一個(gè)數(shù),用q來(lái)存放,如果p中是空的,就直接把q給p,如果p不是空的,則比較q和p中的大小,如果p小q大,直接將q新寫(xiě)入的存放到p中,否則則調(diào)換二者順序再上述操作執(zhí)行p = L;q = (Sqlist*)malloc(sizeof(Sqlist));printf("【提示】請(qǐng)輸入第%d個(gè)數(shù):", i);scanf("%d", &q->data); //將數(shù)據(jù)保存到q中q->next = NULL;if (p->next == NULL) //如果p->next為尾節(jié)點(diǎn)(p為空時(shí))p->next = q; //將q給pelse{while (p->next->data < q->data)//當(dāng)p所指向的(下一個(gè))數(shù)據(jù)小于q所指向的數(shù)據(jù){p = p->next;//p指向下一個(gè)節(jié)點(diǎn)(往后移)if (p->next == NULL)//p所指向的為尾節(jié)點(diǎn)時(shí),結(jié)束break;}//交換pq所指向的節(jié)點(diǎn)的值q->next = p->next;p->next = q;}}printf("【提示】插入完成!\n"); } void Output(Sqlist* L) {Sqlist* p;p = L;while (p->next != NULL){//printf("%4d", p->next->data);printf("\t%d", p->next->data);p = p->next;}printf("\n"); }//將初始鏈表分成奇數(shù)鏈表和偶數(shù)鏈表 void Apart(Sqlist* L, Sqlist* M, Sqlist* N) {Sqlist* j, * o, * p;p = L;while (p->next != NULL)//當(dāng)p為非空時(shí){p = p->next;if (p->data % 2 == 0)//判斷是否為偶數(shù){o = (Sqlist*)malloc(sizeof(Sqlist));o->data = p->data;//將p(初始鏈表)的數(shù)據(jù)給o(偶數(shù)鏈表)o->next = N->next;N->next = o;}else{j = (Sqlist*)malloc(sizeof(Sqlist));j->data = p->data;//將p(初始鏈表)的數(shù)據(jù)給j(奇數(shù)鏈表)j->next = M->next;M->next = j;}}printf("【提示】奇表:\n");Output(M);printf("【提示】偶表:\n");Output(N); }void Andbiao(Sqlist* J, Sqlist* O, Sqlist* H) {Sqlist* m, * n, * t, * p;m = J;n = O;t = H;p = H;while (m->next && n->next)//當(dāng)m和n的下一節(jié)點(diǎn)均不為空時(shí){if (m->next->data > n->next->data){t = (Sqlist*)malloc(sizeof(Sqlist));//開(kāi)辟新節(jié)點(diǎn)tt->data = m->next->data;//將m中的數(shù)據(jù)復(fù)制到t中t->next = NULL;//定義t的頭節(jié)點(diǎn)數(shù)據(jù)為空m = m->next;//指針m向后移動(dòng)p->next = t;p = p->next;}else{t = (Sqlist*)malloc(sizeof(Sqlist));//開(kāi)辟新節(jié)點(diǎn)tt->data = n->next->data;//將n中的數(shù)據(jù)復(fù)制到t中t->next = NULL;//定義t的頭節(jié)點(diǎn)數(shù)據(jù)為空n = n->next;//指針n向后移動(dòng)p->next = t;p = p->next; //指針p向后移動(dòng)}}if (m->next == NULL){while (n->next){t = (Sqlist*)malloc(sizeof(Sqlist));//開(kāi)辟新節(jié)點(diǎn)tt->data = n->next->data;//將n中的數(shù)據(jù)復(fù)制到t中t->next = NULL;//定義t的頭節(jié)點(diǎn)數(shù)據(jù)為空n = n->next;//指針n向后移動(dòng)p->next = t;p = p->next;}}if (n->next == NULL){while (m->next){t = (Sqlist*)malloc(sizeof(Sqlist));//開(kāi)辟新節(jié)點(diǎn)tt->data = m->next->data;//將m中的數(shù)據(jù)復(fù)制到t中t->next = NULL;//定義t的頭節(jié)點(diǎn)數(shù)據(jù)為空m = m->next;//指針m向后移動(dòng)p->next = t;p = p->next;}}printf("【提示】合并遞減表:\n");Output(H); }void main() {Sqlist* Begain = (Sqlist*)malloc(sizeof(Sqlist));//初始(遞增)Sqlist* Odd = (Sqlist*)malloc(sizeof(Sqlist));//奇數(shù)Sqlist* Even = (Sqlist*)malloc(sizeof(Sqlist));//偶數(shù)Sqlist* And = (Sqlist*)malloc(sizeof(Sqlist));//合并(遞減)int choose = -1, n;printf(" ---------------------------\n");printf("| 1.初始化單鏈表 |\n");printf("| 2.建立遞增鏈表 |\n");printf("| 3.分成奇/偶兩鏈表 |\n");printf("| 4.合并成遞減單鏈表 |\n");printf("| 5.顯示單鏈表整體 |\n");printf("| 6.求單鏈表長(zhǎng)度 |\n");printf("| 7.判斷單鏈表是否為空 |\n");printf("| 0.退出 |\n");printf(" ---------------------------\n");while (choose){printf("【提示】請(qǐng)輸入你的選擇:");scanf("%d", &choose);if (choose > 7){printf("【提示】輸入格式錯(cuò)誤,請(qǐng)重新輸入:");scanf("%d", &choose);}switch (choose){//初始化case 1:Start(Begain, Odd, Even, And); break;//插入數(shù)據(jù)(遞增)case 2:printf("【提示】請(qǐng)輸入你要插入正整數(shù)的個(gè)數(shù):");scanf("%d", &n);Input(Begain, n);break;//分離為奇/偶鏈表case 3:Apart(Begain, Odd, Even); break;//合并鏈表(遞減)case 4:Andbiao(Odd, Even, And); break;//輸出(遞增)case 5:Output(Begain); break;//計(jì)算鏈表長(zhǎng)度case 6:Length(Begain); break;//判斷鏈表是否為空case 7:Emp(Begain); break;//退出case 0:exit(0); break;}} }代碼小白,僅作學(xué)習(xí)記錄📝
總結(jié)
以上是生活随笔為你收集整理的C++线性表(单链表)的应用算法(附源码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java奇偶链表
- 下一篇: C/C++《程序设计基础(C语言)课程设