C語(yǔ)言之復(fù)雜鏈表的復(fù)制方法(圖示詳解)
什么是復(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;
上圖就是一個(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。
2、接下來(lái)我們應(yīng)該把新創(chuàng)建的這條復(fù)雜鏈表(newlist)與已有的復(fù)雜鏈表(oldlist)合并成如下的形式:
在這種情況下我們已經(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ù)雜鏈表如下圖
在完成以上的步驟之后我們所要做的工作就很簡(jiǎn)單了,我們只要把這一條鏈表linklist分開成我們的newlist鏈表和oldlist鏈表就可以了。
這樣我們就完美的完成了復(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ù)雜鏈表中沒有結(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ù)制方法(圖示詳解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持我們。
欄 目:C語(yǔ)言
下一篇:詳解C++的String類的字符串分割實(shí)現(xiàn)
本文標(biāo)題:C語(yǔ)言之復(fù)雜鏈表的復(fù)制方法(圖示詳解)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1390.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法