亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言合并兩個帶頭節點升序排列鏈表

2020-01-26 13:31:06
字體:
來源:轉載
供稿:網友

合并鏈表,顧名思義,就是將兩個按順序存放數據的鏈表中的數據合并為用一個鏈表存儲,比如在處理多項式的加減法時就需要將兩個多項式的數據進行合并。合并方式有很多種:如果按照存儲方式的不同,可以將兩個鏈表的數據分別提取出來生成一個新的鏈表來存儲原先兩個鏈表的數據,還可以將其中一個鏈表的數據依次插入到另外一個鏈表的相應位置當中去。在遇到相同數據時可以采取只留下一個數據的方式和兩個數據均保留的方式。這些不同點需要到具體的問題中具體分析,但是只是在細節上有一些差別,大體的思路都是一樣的,本文主要介紹將一個鏈表插入到另一個鏈表的相應位置,插入完成后銷毀鏈表二,且遇到相同數據采用均保留的方式。

我們還是先拋開鏈表的操作本身,先對兩組不同的數據進行合并操作,知道兩組按升序排列的數據該如何合并成一組數據,我們來分析這樣幾組數據(將第二組的數據插入到第一組中):

1   5   9   13   15

2   7   12

對于這組數據我們可以很輕易的說出應該把“2”插入到“1”的前面,應該把“7”插入到“5”的前面... ... 那么我們又是如何得到這個結論的呢,接下來我們來用語言細致的描述一下我們剛才是如何得到這樣的結論的:“首先,遍歷第一組數據,找到第一個比要插入的數據大的數據的前一個數據“i”,再將要插入的數據插入到“i”的后面”。

上述描述解決了插入數據的一般性情況,包括我們用“比該數據大”這樣的話說明了遇到相同數據時該如何處理,但是,問題依然存在,我們來觀察下面一組數據:

2   4   7   9

1   3   6   8

我們要將第二組數據插入到第一組數據中,按照之前的說法,找到第一個不比待插入數據小的數據的前一個數據“i”,但是我們發現第一組數據中第一個數據就符合我們的要求,那么它自然沒有前一個數據。這里我們給出一個方案:在進行插入工作前,先對兩個鏈表的首元素進行比較,如果鏈表一的首元素是小于第二個鏈表的首元素的,那么開始合并工作,如果鏈表一的首元素不小于第二個鏈表的首元素,我們先交換兩個鏈表的頭結點,使得鏈表一變成鏈表二。但是這種方式僅適用于我們當前的情況,因為我們要實現的是將鏈表二的元素加入到鏈表一中,之后銷毀鏈表二,這就意味著我們最后只要得到一個鏈表就可以,只要使得傳遞過來的鏈表一在執行完我們的合并鏈表程序后能夠變成合并后的結果鏈表就好了,因此我們可能要更改傳遞過來的鏈表的頭結點的值。

根據上面的說法,我們就要在開始進行合并之前先對兩個鏈表的首元素進行比較,如果鏈表二的首元素比鏈表一的首元素大,則交換兩個鏈表的控制頭,再執行后續的合并工作。

解決了上述問題,還差最后一種情況,我們來觀察下面一組數據:

1   3   4   6   7

2   6   9   10  13

我們可以觀察到,將第二組數據依次向第一組數據中插入,到了“9”的時候,第一組數據就沒有可以插入的位置了,而應該在尾部追加,于是,我們就不能執行之前的操作了,而應該執行另外一項操作,我們具體實現是這樣的:

如果我們在第一組數據中找不到比待插入數據大的數據,我們就將待插入數據的后面的數據連同待插入數據本身,追加到第一組數據的末尾。

根據如上分析,我們需要執行的有四種對鏈表的操作:1、在指定鏈中找到第一個比目標數據的大的節點的前驅節點; 2、將指定元素插入到指定鏈表的指定位置; 3、將鏈表中的制定位置后的所有元素追加到指定鏈表的末尾; 4、交換兩個鏈表的頭結點。

下面我們就分布解決這四種操作(注:A_LINE是我們自己定義的為了方便起見的一個結構體,只有一個int類型的num和一個A_LINE *類型的next成員不具有任何意義,僅僅是為了完成合并鏈表):

1、在指定鏈中找到第一個比目標數據的大的節點的前驅節點:

A_LINE *getFirstLocalBiggerThanEle(A_LINE head, A_LINE ele) { A_LINE *p; A_LINE *q;  for (p = head.next; p->next != NULL && ele.num >= p->num; p = p->next) q = p; if (p->next == NULL) { return NOT_FOUND; } return q;}

我們用A_LINE *p來遍歷鏈表一,用A_LINE *q來實時保存當前節點的前驅節點,鏈表沒有遍歷完而且當前元素依然小于等于目標元素,則循環繼續。當循環結束后,判斷循環結束的原因,如果是因為鏈表遍歷完了而結束的循環,則說明整個鏈表里都沒有比目標節點大的節點,返回NOT_FOUND;若是因為找到了比目標元素大的元素而結束的,那么返回該元素的前驅節點的地址“q”。

2、將指定元素插入到指定鏈表的指定位置:

void insertEleToLine(A_LINE *local, A_LINE ele) { A_LINE *newEle;  newEle = (A_LINE *)calloc(1, sizeof(A_LINE)); newEle->next = local->next; local->next = newEle; newEle->num = ele.num;}

在第一步中我們已經可以得到需要插入的位置的首地址了,下一步我們就要完成插入了,這對于學過鏈表的人并不是什么難事,本文不做為重點講解。

3、將一段數據追加到指定鏈表的末尾:

void appendLineToLineEnd(A_LINE *line, A_LINE targetLine) { A_LINE *tarP;  for (tarP = targetLine.next; tarP->next != NULL; tarP = tarP->next) ; tarP->next = line;}

這里給出的A_LINE *line代表著待插入鏈表的首元素的首地址,targetLine代表要插入到的鏈表的頭結點。首先先定位目標鏈表的末節點的首地址,再將待插入鏈表的末節點的next成員更改為待插入鏈表的首元素的首地址。

但這里存在著問題,這里的賦值相當于直接把鏈表二的一部分節點直接放到鏈表一的末尾,并不是復制出來一份再追加到鏈表一的末尾,這樣就使得鏈表二的那一部分節點又屬于鏈表一又屬于鏈表二,而鏈表二在最后是要被釋放的,那么它的后幾個節點也會被釋放。為了防止這樣的情況發生,我們必須將鏈表二中的要插入到鏈表一中的那一部分節點的前驅節點的next成員賦值為NULL,這樣在就相當于將那一部分節點從鏈表二中刪除,但是這樣并不會引起內存泄漏,這些節點被連接到了鏈表一的末尾,因此在釋放鏈表一的時候這些節點依然會被釋放。

4、交換兩個鏈表的頭結點:

void exchangeLine(A_LINE *head1, A_LINE *head2) { A_LINE temp;  temp = *head1; *head1 = *head2; *head2 = temp;}

5、合并鏈表完整代碼:

void margeLine(A_LINE *targetLine, A_LINE *resourceLine) { A_LINE *tarP = targetLine->next; A_LINE *srcP = resourceLine->next; A_LINE *srcPreP; A_LINE *local;  if (tarP->num >= srcP->num) { exchangeLine(targetLine, resourceLine); }  for (srcP = srcPreP = resourceLine->next; srcP != NULL; srcP = srcP->next) { local = getFirstLocalBiggerThanEle(*targetLine, *srcP);  if (local != NOT_FOUND) { insertEleToLine(local, *srcP); } else { appendLineToLineEnd(srcPreP->next, *targetLine); srcPreP->next = NULL; destoryLine(resourceLine); return; } srcPreP = srcP; } destoryLine(resourceLine);}

最后我們給出整體的可測試的代碼:

#include<stdio.h>#include<malloc.h> #define NOT_FOUND NULL typedef struct A_LINE { int num; struct A_LINE *next;} A_LINE; void margeLine(A_LINE *targetLine, A_LINE *resourceLine);A_LINE *getFirstLocalBiggerThanEle(A_LINE head, A_LINE ele);void insertEleToLine(A_LINE *local, A_LINE ele);void destoryLine(A_LINE *head);void initLine(A_LINE *head);void showLine(A_LINE head);void exchangeLine(A_LINE *head1, A_LINE *head2);void appendLineToLineEnd(A_LINE *line, A_LINE targetLine); void appendLineToLineEnd(A_LINE *line, A_LINE targetLine) { A_LINE *tarP;  for (tarP = targetLine.next; tarP->next != NULL; tarP = tarP->next) ; tarP->next = line;} void exchangeLine(A_LINE *head1, A_LINE *head2) { A_LINE temp;  temp = *head1; *head1 = *head2; *head2 = temp;} void showLine(A_LINE head) { A_LINE *p;  for (p = head.next; p != NULL; p = p->next) { printf("%d ", p->num); }} void initLine(A_LINE *head) { int num; A_LINE *p = NULL;  printf("請輸入一個數(-1表示結束):"); scanf_s("%d", &num); while (num != -1) { if (head->next == NULL) { head->next = (A_LINE *)calloc(1, sizeof(A_LINE)); (head->next)->num = num; p = head->next; } else { p->next = (A_LINE *)calloc(1, sizeof(A_LINE)); (p->next)->num = num; p = p->next; } printf("請輸入一個數(-1表示結束)"); scanf_s("%d", &num); }} void destoryLine(A_LINE *head) { A_LINE *p = head->next;  while (NULL != head->next) { p = head->next; head->next = p->next; free(p); }} void insertEleToLine(A_LINE *local, A_LINE ele) { A_LINE *newEle;  newEle = (A_LINE *)calloc(1, sizeof(A_LINE)); newEle->next = local->next; local->next = newEle; newEle->num = ele.num;} A_LINE *getFirstLocalBiggerThanEle(A_LINE head, A_LINE ele) { A_LINE *p = NULL; A_LINE *q = NULL;  for (p = head.next; p != NULL && ele.num >= p->num; p = p->next) q = p; if (p == NULL) { return NOT_FOUND; } return q;} void margeLine(A_LINE *targetLine, A_LINE *resourceLine) { A_LINE *tarP = targetLine->next; A_LINE *srcP = resourceLine->next; A_LINE *srcPreP; A_LINE *local;  if (tarP->num >= srcP->num) { exchangeLine(targetLine, resourceLine); }  for (srcP = srcPreP = resourceLine->next; srcP != NULL; srcP = srcP->next) { local = getFirstLocalBiggerThanEle(*targetLine, *srcP);  if (local != NOT_FOUND) { insertEleToLine(local, *srcP); } else { appendLineToLineEnd(srcPreP->next, *targetLine); srcPreP->next = NULL; destoryLine(resourceLine); return; } srcPreP = srcP; } destoryLine(resourceLine);} void main(void) { A_LINE head1 = {0}; A_LINE head2 = {0};  printf("錄入第一個鏈表:/n"); initLine(&head1); printf("錄入第二個鏈表/n"); initLine(&head2);  margeLine(&head1, &head2);  printf("鏈表一:/n"); showLine(head1); printf("鏈表二:/n"); showLine(head2);   destoryLine(&head1);}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
九九九热精品免费视频观看网站| 国产日韩中文在线| 国产成一区二区| 亚洲亚裔videos黑人hd| 日韩精品日韩在线观看| 欧美色另类天堂2015| 91在线视频精品| 91欧美精品成人综合在线观看| 在线观看精品自拍私拍| 欧美成人精品在线视频| 国产在线拍偷自揄拍精品| 91久久精品国产91性色| 夜夜躁日日躁狠狠久久88av| 欧美在线日韩在线| 国产亚洲精品一区二区| 久久久久久久久亚洲| 成人免费在线视频网站| 日本一欧美一欧美一亚洲视频| 91久久久久久久| 国产精品久久久亚洲| 亚洲高清在线观看| 精品成人久久av| 久久精品美女视频网站| 欧美激情精品久久久久久免费印度| 日韩在线资源网| 97国产精品视频人人做人人爱| 亚洲国产成人91精品| 国产成人精品久久二区二区91| 欧美日韩电影在线观看| 亚洲第一页自拍| 91精品国产91| 国产精品亚洲第一区| 久久久噜噜噜久久久| www.日韩av.com| 欧美一区二区三区免费观看| 欧美日韩免费观看中文| 最近2019中文免费高清视频观看www99| 国产精品亚洲欧美导航| 欧美日韩午夜视频在线观看| 欧美激情网友自拍| 91中文字幕一区| 成人免费视频97| 亚洲精品中文字幕av| 成人动漫网站在线观看| 亚洲免费视频网站| 国产福利精品在线| 中文字幕日韩综合av| 日韩av在线精品| 日韩电影免费观看中文字幕| 91影视免费在线观看| 韩国三级日本三级少妇99| 亚洲精品视频中文字幕| 亚洲伊人一本大道中文字幕| 亚洲一区二区三区香蕉| 精品亚洲永久免费精品| 亚洲一区二区三区毛片| 日韩欧美精品在线观看| 欧美制服第一页| 欧美激情在线狂野欧美精品| 色综久久综合桃花网| 国产日韩欧美另类| 91亚洲一区精品| 欧美日韩爱爱视频| 欧美精品videofree1080p| 亚洲乱码国产乱码精品精| 亚洲伊人一本大道中文字幕| 国产婷婷成人久久av免费高清| 免费不卡在线观看av| 97国产成人精品视频| 91亚洲永久免费精品| 欧美电影免费观看| 丰满岳妇乱一区二区三区| 中文字幕av日韩| 亚洲丁香婷深爱综合| 国产成人亚洲精品| 国产一区二区三区高清在线观看| 日韩欧美中文免费| 亚洲美女视频网| 日韩电影免费观看中文字幕| 亚洲精品黄网在线观看| 亚洲xxx自由成熟| 91香蕉嫩草神马影院在线观看| 国产精品久久久久久网站| 国产精品自产拍在线观看中文| 成人深夜直播免费观看| 亚洲一品av免费观看| 91国产美女在线观看| 91精品国产91久久久久久不卡| 日韩美女在线观看一区| 久久久精品一区二区三区| 韩国精品美女www爽爽爽视频| 日韩av理论片| 在线观看国产欧美| 日韩中文字幕在线视频播放| 亚洲精品视频中文字幕| 国产精品久久久久久久久久| 中文日韩在线视频| 亚洲欧美精品一区| 亚洲美女www午夜| 色综合久久久888| 午夜精品三级视频福利| 欧美在线观看一区二区三区| 日韩av最新在线观看| 国模极品一区二区三区| 国产久一一精品| 欧美性色视频在线| 亚洲女在线观看| 亚洲一区二区三区成人在线视频精品| 亚洲第一色中文字幕| 九色精品美女在线| 亚洲精品狠狠操| 日韩女优人人人人射在线视频| 欧美日韩免费看| 久久精品免费播放| 久久免费少妇高潮久久精品99| 欧美成年人视频网站| 一区二区三区四区精品| 亚洲精品99999| 色999日韩欧美国产| 亚洲精品久久久久久久久久久久| 国产乱人伦真实精品视频| 亚洲精品免费在线视频| 国产精品老女人精品视频| 欧美日韩日本国产| 亚洲视频电影图片偷拍一区| 国产丝袜一区二区| 国产区精品在线观看| 久久久国产精品免费| 91精品在线看| 亚洲第一男人av| 亚洲色图国产精品| 国产在线视频2019最新视频| 九九热最新视频//这里只有精品| 精品成人国产在线观看男人呻吟| 日韩成人中文字幕在线观看| 精品美女永久免费视频| 亚洲国产精品成人va在线观看| 欧美日韩亚洲国产一区| 日韩中文字幕网址| 精品动漫一区二区三区| 国产免费一区视频观看免费| 久久偷看各类女兵18女厕嘘嘘| 欧美日韩国产综合新一区| 亚洲精品成a人在线观看| 久久久久亚洲精品成人网小说| 国产精品99久久久久久久久久久久| 欧美成人合集magnet| 精品女同一区二区三区在线播放| 九色成人免费视频| 成人高清视频观看www| 97久久伊人激情网| 久久全国免费视频| 久久99久国产精品黄毛片入口| 欧美中文字幕在线视频| 中文字幕亚洲一区二区三区五十路| 亚洲欧美日韩精品| 欧美在线影院在线视频| 亚洲欧洲国产一区| 色黄久久久久久| 高清在线视频日韩欧美| 国产91精品久久久久久久| 日韩成人在线网站| 亚洲福利视频网站| 色999日韩欧美国产|