複雜單鏈表的複製:
一、何為複製單鏈表
就我們所知,單鏈表也就是乙個結點包含乙個資料域和乙個指標域,這樣若干個結點構成的鍊錶。而複雜單鏈表和普通單鏈表差不多,唯一的不同就是多乙個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...