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