C語(yǔ)言中怎么復(fù)制復(fù)雜鏈表-創(chuàng)新互聯(lián)

C語(yǔ)言中怎么復(fù)制復(fù)雜鏈表,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

成都創(chuàng)新互聯(lián)公司是一家網(wǎng)站設(shè)計(jì)公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營(yíng)產(chǎn)品:成都響應(yīng)式網(wǎng)站建設(shè)、成都品牌網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷推廣。我們專注企業(yè)品牌在網(wǎng)站中的整體樹(shù)立,網(wǎng)絡(luò)互動(dòng)的體驗(yàn),以及在手機(jī)等移動(dòng)端的優(yōu)質(zhì)呈現(xiàn)。成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、移動(dòng)互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運(yùn)營(yíng)、VI設(shè)計(jì)、云產(chǎn)品.運(yùn)維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場(chǎng)的競(jìng)爭(zhēng)激烈,認(rèn)真對(duì)待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價(jià)值服務(wù)。

什么是復(fù)雜鏈表?

復(fù)雜鏈表指的是一個(gè)鏈表有若干個(gè)結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)有一個(gè)數(shù)據(jù)域用于存放數(shù)據(jù),還有兩個(gè)指針域,其中一個(gè)指向下一個(gè)節(jié)點(diǎn),還有一個(gè)隨機(jī)指向當(dāng)前復(fù)雜鏈表中的任意一個(gè)節(jié)點(diǎn)或者是一個(gè)空結(jié)點(diǎn)。今天我們要實(shí)現(xiàn)的就是對(duì)這樣一個(gè)復(fù)雜鏈表復(fù)制產(chǎn)生一個(gè)新的復(fù)雜鏈表。

復(fù)雜鏈表的數(shù)據(jù)結(jié)構(gòu)如下:

typedef int DataType; //數(shù)據(jù)域的類型
//復(fù)雜鏈表的數(shù)據(jù)結(jié)構(gòu)
typedef struct ComplexNode

{

DataType _data ;   // 數(shù)據(jù)
struct ComplexNode * _next;  // 指向下個(gè)節(jié)點(diǎn)的指針
struct ComplexNode * _random; // 指向隨機(jī)節(jié)點(diǎn)(可以是鏈表中的任意節(jié)點(diǎn) or 空)

}ComplexNode;

C語(yǔ)言中怎么復(fù)制復(fù)雜鏈表

上圖就是一個(gè)復(fù)雜鏈表的例子,那么我們應(yīng)該如何實(shí)現(xiàn)復(fù)雜鏈表的復(fù)制呢?

1、首先我們應(yīng)該根據(jù)已有的復(fù)雜鏈表創(chuàng)建一條新的復(fù)雜鏈表,但是這個(gè)新的復(fù)雜鏈表的所有的結(jié)點(diǎn)的random指針都指向空,這樣是很好實(shí)現(xiàn)的,相當(dāng)于我們創(chuàng)建了一條簡(jiǎn)單的單鏈表(newlist),我們要復(fù)制的鏈表不妨稱之為oldlist。

C語(yǔ)言中怎么復(fù)制復(fù)雜鏈表

2、接下來(lái)我們應(yīng)該把新創(chuàng)建的這條復(fù)雜鏈表(newlist)與已有的復(fù)雜鏈表(oldlist)合并成如下的形式:

C語(yǔ)言中怎么復(fù)制復(fù)雜鏈表

在這種情況下我們已經(jīng)把兩條復(fù)雜鏈表合并成了一條鏈表(稱之為linklist),通過(guò)對(duì)這條鏈表(linklist)的觀察,我們可以發(fā)現(xiàn)合并的鏈表(linklist)中屬于newlist的結(jié)點(diǎn)pnew的上一個(gè)結(jié)點(diǎn)pold(屬于oldlist的結(jié)點(diǎn))的random指針?biāo)赶虻慕Y(jié)點(diǎn)的next指針就應(yīng)該是pnew結(jié)點(diǎn)的randow指針?biāo)赶虻慕Y(jié)點(diǎn)。

這樣我們讓pold和pnew指針一直往后走最后就可以實(shí)現(xiàn)對(duì)所有屬于新創(chuàng)建的復(fù)雜鏈表(newlist)的random指針指向相應(yīng)的結(jié)點(diǎn)的操作。構(gòu)成的復(fù)雜鏈表如下圖

C語(yǔ)言中怎么復(fù)制復(fù)雜鏈表

在完成以上的步驟之后我們所要做的工作就很簡(jiǎn)單了,我們只要把這一條鏈表linklist分開(kāi)成我們的newlist鏈表和oldlist鏈表就可以了。

C語(yǔ)言中怎么復(fù)制復(fù)雜鏈表

C語(yǔ)言中怎么復(fù)制復(fù)雜鏈表

這樣我們就完美的完成了復(fù)雜鏈表的復(fù)制工作下面就是具體實(shí)現(xiàn)的代碼:

頭文件complexnode.h:

#ifndef __COMPLEX__NODE__H__
#define __COMPLEX__NODE__H__
//包含頭文件
#include <stdio.h>
#include<stdlib.h>
#include <assert.h>

typedef int DataType; //數(shù)據(jù)域的類型
//復(fù)雜鏈表的數(shù)據(jù)結(jié)構(gòu)
typedef struct ComplexNode

{
DataType _data ;    // 數(shù)據(jù)
struct ComplexNode * _next;  // 指向下個(gè)節(jié)點(diǎn)的指針
struct ComplexNode * _random; // 指向隨機(jī)節(jié)點(diǎn)(可以是鏈表中的任意節(jié)點(diǎn) or 空)
}ComplexNode;

 

//創(chuàng)建一個(gè)復(fù)雜鏈表的結(jié)點(diǎn)
ComplexNode * BuyComplexNode(DataType x);
//打印復(fù)雜的單鏈表
void Display(const ComplexNode * cplist);
//復(fù)雜鏈表的復(fù)制
ComplexNode * CopyComplexNode(ComplexNode * cplist);

 

#endif//__COMPLEX__NODE__H__

具體功能實(shí)現(xiàn)complexnode.c

#include "complexnode.h"

 

//創(chuàng)建一個(gè)復(fù)雜鏈表的結(jié)點(diǎn)

ComplexNode * BuyComplexNode(DataType x)
{
ComplexNode *cnode = (ComplexNode *)malloc(sizeof(ComplexNode));
if(cnode == NULL)//創(chuàng)建失敗
{

perror("BuyComplexNode()::malloc");
return NULL;

}

//創(chuàng)建成功
cnode->_data = x;
cnode->_next = NULL;
cnode->_random = NULL;
return cnode;

} 

//打印復(fù)雜的單鏈表

void Display(const ComplexNode * cplist)

{

ComplexNode *pnode = cplist;
while (pnode)
{
printf("%d::%d -->",pnode->_data,pnode->_random->_data);
pnode = pnode->_next;

}

printf("over\n");

}

//復(fù)雜鏈表的復(fù)制
ComplexNode * CopyComplexNode(ComplexNode * cplist)

{
ComplexNode * pold = NULL;
ComplexNode * pnew = NULL;
ComplexNode * newlist = NULL;//指向新的復(fù)雜鏈表的頭結(jié)點(diǎn)的指針
pold = cplist;

//創(chuàng)建一條新的復(fù)雜鏈表

while(pold != NULL)

{
ComplexNode * new_node = BuyComplexNode(pold->_data);
if(newlist == NULL)//當(dāng)新的復(fù)雜鏈表中沒(méi)有結(jié)點(diǎn)時(shí)
{
newlist = new_node;

}

else//當(dāng)新的復(fù)雜鏈表有結(jié)點(diǎn)時(shí)

{
ComplexNode * node = newlist;
while(node->_next != NULL)//找到最后一個(gè)結(jié)點(diǎn)
{
node = node->_next;
}
node->_next = new_node;//插入新的結(jié)點(diǎn)
}
pold = pold->_next;

 

}//創(chuàng)建新的復(fù)雜鏈表結(jié)束

 

//合并兩條復(fù)雜鏈表
pold = cplist;
pnew = newlist;
while (pold)

{

ComplexNode * curold = NULL;
ComplexNode * curnew = NULL;
curold = pold->_next;
curnew = pnew->_next;
if(pold->_next == NULL)

{

pold->_next = pnew;
pold = curold;
pnew = curnew;
break;

}

pold->_next = pnew;
pnew->_next = curold;
pold = curold;
pnew = curnew;
}//合并兩條復(fù)雜鏈表結(jié)束

 

//讓新創(chuàng)建的那條復(fù)雜鏈表上的所有結(jié)點(diǎn)的random指針指向相應(yīng)的結(jié)點(diǎn)
pold = cplist;
pnew = newlist;
while (pnew)

{

pnew->_random = pold->_random->_next;

pold = pnew->_next;
if(pold == NULL)//這是pnew的_next指針已經(jīng)指向空

{

break;

}

pnew = pold->_next;

}//結(jié)束

 

//分離合并后的復(fù)雜鏈表

pold = cplist;
pnew = newlist;
while (pold)

{

ComplexNode * curold = NULL;
ComplexNode * curnew = NULL;
if(pnew->_next == NULL)//已經(jīng)分離完成

{

pold->_next = NULL;
pnew->_next = NULL;
break;

 

}

curold = pold->_next->_next;
curnew = pnew->_next->_next;

 

pold->_next = curold;
pnew->_next = curnew;
pold = curold;
pnew = curnew;

}//分離合并的復(fù)雜鏈表結(jié)束

 

return newlist;

}

測(cè)試代碼test.c:

#include "complexnode.h"

//
//復(fù)雜鏈表的復(fù)制。?個(gè)鏈表的每個(gè)節(jié)點(diǎn),有?個(gè)指向next指針指向下?個(gè)節(jié)
//點(diǎn),還有?個(gè)random指針指向這個(gè)鏈表中的?個(gè)隨機(jī)節(jié)點(diǎn)或者NULL,現(xiàn)在要
//求實(shí)現(xiàn)復(fù)制這個(gè)鏈表,返回復(fù)制后的新鏈表。
//ps: 復(fù)雜鏈表的結(jié)構(gòu)
 

void test()

{

ComplexNode * cplist;
ComplexNode * copylist;
ComplexNode * node1;
ComplexNode * node2;
ComplexNode * node3;
ComplexNode * node4;
cplist = BuyComplexNode(1);
node1 = BuyComplexNode(2);
node2 = BuyComplexNode(3);
node3 = BuyComplexNode(4);
node4 = BuyComplexNode(5);
cplist->_next = node1;
node1->_next = node2;
node2->_next = node3;
node3->_next = node4;
cplist->_random = node3;
node1->_random = node4;
node2->_random = cplist;
node3->_random = node1;
node4->_random = node2;
Display(cplist);
copylist = CopyComplexNode(cplist);
Display(copylist);


}
int main()
{
test();
return 0;

}

程序的運(yùn)行結(jié)果如下圖:

C語(yǔ)言中怎么復(fù)制復(fù)雜鏈表

看完上述內(nèi)容,你們掌握C語(yǔ)言中怎么復(fù)制復(fù)雜鏈表的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站bm7419.com,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

新聞標(biāo)題:C語(yǔ)言中怎么復(fù)制復(fù)雜鏈表-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://bm7419.com/article10/dpdpgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、動(dòng)態(tài)網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司、靜態(tài)網(wǎng)站、面包屑導(dǎo)航、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)