中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

C語言之復(fù)雜鏈表如何復(fù)制-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“C語言之復(fù)雜鏈表如何復(fù)制”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C語言之復(fù)雜鏈表如何復(fù)制”這篇文章吧。

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)東鄉(xiāng),10年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792

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

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

struct ComplexNode * _random;  // 指向隨機(jī)節(jié)點(可以是鏈表中的任意節(jié)點 or 空)

}ComplexNode;

C語言之復(fù)雜鏈表如何復(fù)制

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

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

C語言之復(fù)雜鏈表如何復(fù)制

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

C語言之復(fù)雜鏈表如何復(fù)制

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

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

C語言之復(fù)雜鏈表如何復(fù)制

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

C語言之復(fù)雜鏈表如何復(fù)制

C語言之復(fù)雜鏈表如何復(fù)制

這樣我們就完美的完成了復(fù)雜鏈表的復(fù)制工作下面就是具體實現(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;    // 指向下個節(jié)點的指針
struct ComplexNode * _random;  // 指向隨機(jī)節(jié)點(可以是鏈表中的任意節(jié)點 or 空)
}ComplexNode;
 
//創(chuàng)建一個復(fù)雜鏈表的結(jié)點
ComplexNode * BuyComplexNode(DataType x);
 
//打印復(fù)雜的單鏈表
void Display(const ComplexNode * cplist);
 
//復(fù)雜鏈表的復(fù)制
ComplexNode * CopyComplexNode(ComplexNode * cplist);
 
#endif//__COMPLEX__NODE__H__

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

#include "complexnode.h"

 

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

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é)點的指針

pold = cplist;

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

while(pold != NULL)

{

ComplexNode * new_node = BuyComplexNode(pold->_data);

if(newlist == NULL)//當(dāng)新的復(fù)雜鏈表中沒有結(jié)點時

{

newlist = new_node;

}

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

{

ComplexNode * node = newlist;

while(node->_next != NULL)//找到最后一個結(jié)點

{

node = node->_next;

}

node->_next = new_node;//插入新的結(jié)點

}

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é)點的random指針指向相應(yīng)的結(jié)點

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;

}

測試代碼test.c:

#include "complexnode.h"

//

//復(fù)雜鏈表的復(fù)制。?個鏈表的每個節(jié)點,有?個指向next指針指向下?個節(jié)

//點,還有?個random指針指向這個鏈表中的?個隨機(jī)節(jié)點或者NULL,現(xiàn)在要

//求實現(xiàn)復(fù)制這個鏈表,返回復(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;

}

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

C語言之復(fù)雜鏈表如何復(fù)制

以上是“C語言之復(fù)雜鏈表如何復(fù)制”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道!

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

網(wǎng)站名稱:C語言之復(fù)雜鏈表如何復(fù)制-創(chuàng)新互聯(lián)
文章分享:http://m.rwnh.cn/article0/pojoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、網(wǎng)站改版移動網(wǎng)站建設(shè)、動態(tài)網(wǎng)站、微信小程序、商城網(wǎng)站

廣告

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

成都網(wǎng)頁設(shè)計公司
蓝田县| 犍为县| 大兴区| 即墨市| 锦屏县| 鄯善县| 鄂托克前旗| 淅川县| 响水县| 板桥市| 澎湖县| 怀集县| 博爱县| 合作市| 临高县| 玛多县| 讷河市| 六安市| 资阳市| 盐边县| 海原县| 云和县| 高邮市| 西乡县| 富蕴县| 丽江市| 汶上县| 大悟县| 通许县| 娄烦县| 荥经县| 德州市| 疏附县| 巫山县| 高淳县| 丹东市| 繁峙县| 孟村| 景宁| 呼玛县| 孟村|