複雜單鏈表的複製

2021-08-03 09:25:38 字數 2123 閱讀 7108

複雜單鏈表的複製:

一、何為複製單鏈表

就我們所知,單鏈表也就是乙個結點包含乙個資料域和乙個指標域,這樣若干個結點構成的鍊錶。而複雜單鏈表和普通單鏈表差不多,唯一的不同就是多乙個random。我們可以用一張圖來表示:

那我們怎麼來進行複雜鍊錶的複製呢,現在公認的最有效的方法只有一種,就是在原有單鏈表的每個元素後面新增乙個結點,結點中的data是前乙個結點的data,結點的next是原來結點的next。

由上圖可見我們已經將結點都插入到原有複雜單鏈表的後面去了,這樣我們就已經搞定了複雜單鏈表的乙個複製:複製next關係。接著要做的就是複製它的random關係,由圖,可以很清楚地看到,要複製單鏈表的結點的random也就是原有結點的random的next。用乙個例子來解釋:

由圖:cur的random的data為3,如果要進行複製,那麼複製出來的鍊錶的random的data也必須是3,且指向的位置應該和原來的位置是一樣的。那麼可以明顯看到copy->random = cur->random->next。

這樣也就完成了一次random的複製。如此重複,就能將所有的random關係都賦好。

最後也就剩乙個拆分了,這步最為簡單,將兩個單鏈表從乙個單鏈表中分離出來就行。

二、**實現

標頭檔案:

#ifndef __complexlist_h__

#define __complexlist_h__

#include

#include

#include

#include

typedef int datatype;

typedef struct complexnode

complexnode;

complexnode* buycomplexnode(datatype x);//建立乙個結點

void display(complexnode* head);//列印鍊錶

complexnode* copycomplexnode(complexnode* head);//複製鍊錶

void destroylist(complexnode* head);//銷毀鍊錶

#endif

程式實現檔案:

#include

"complexlist.h"

complexnode* buycomplexnode(datatype x)

newnode->_data = x;

newnode->_next =

null;

newnode->_random =

null;

return newnode;

}void display(complexnode* head)

printf("null\n");

}complexnode* copycomplexnode(complexnode* head)

//將原有鍊錶的random關係賦給將要複製的鍊錶

cur = head;

while(cur)

//將複製完的鍊錶拆分,形成兩條鍊錶

cur = head;

newhead = cur->_next;

copy = cur->_next;

while(cur)

}return newhead;

}void destroylist(complexnode* head)

free(cur);

head =

null;

}

測試檔案:

#include

"complexlist.h"

void test()

int main()

到此,複雜鍊錶的複製完成。

複雜單鏈表的複製

wz asust 2016 1 先int例項 後模板化 2 複製不能改變原串的資料及結構 3 隨機指標的正確性 思考 除了追加新結點後分離新舊鍊錶 還有一複雜度高的演算法,就是記錄下每乙個結點,隨機指標指向的結點在整個鏈中的排序 佇列實現 建立新煉表後,根據佇列記錄,連線隨機指標 不能記錄值,僅能實...

複雜單鏈表的複製

typedef struct complexlist complexlist,pcomplexlist void initlist pcomplexlist phead complexlist buynode datatype x 建立乙個複雜單鏈表 void insertnode pcomplex...

單鏈表的複製 C 實現

include includeusing namespace std typedef int datatype 定義鍊錶資料結構 typedef struct nodelnode,linklist int main 尾插法 建立鍊錶 linklist tail create linklist h n...