真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何用C語言復制復雜鏈表

這篇文章主要介紹“如何用C語言復制復雜鏈表”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“如何用C語言復制復雜鏈表”文章能幫助大家解決問題。

創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、成都網(wǎng)站建設與策劃設計,金東網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設十多年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:金東等地區(qū)。金東做網(wǎng)站價格咨詢:13518219792

什么是復雜鏈表?

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

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

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

{

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

}ComplexNode;

具體實現(xiàn)的代碼:

頭文件complexnode.h:

#ifndef __COMPLEX__NODE__H__
#define __COMPLEX__NODE__H__
//包含頭文件
#include 
#include
#include 

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

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

 

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

 

#endif//__COMPLEX__NODE__H__

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

#include "complexnode.h"

 

//創(chuàng)建一個復雜鏈表的結(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;

} 

//打印復雜的單鏈表

void Display(const ComplexNode * cplist)

{

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

}

printf("over\n");

}

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

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

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

while(pold != NULL)

{
ComplexNode * new_node = BuyComplexNode(pold->_data);
if(newlist == NULL)//當新的復雜鏈表中沒有結(jié)點時
{
newlist = new_node;

}

else//當新的復雜鏈表有結(jié)點時

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

 

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

 

//合并兩條復雜鏈表
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;
}//合并兩條復雜鏈表結(jié)束

 

//讓新創(chuàng)建的那條復雜鏈表上的所有結(jié)點的random指針指向相應的結(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é)束

 

//分離合并后的復雜鏈表

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;

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

 

return newlist;

}

測試代碼test.c:

#include "complexnode.h"

//
//復雜鏈表的復制。?個鏈表的每個節(jié)點,有?個指向next指針指向下?個節(jié)
//點,還有?個random指針指向這個鏈表中的?個隨機節(jié)點或者NULL,現(xiàn)在要
//求實現(xiàn)復制這個鏈表,返回復制后的新鏈表。
//ps: 復雜鏈表的結(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;

}

關于“如何用C語言復制復雜鏈表”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。


當前標題:如何用C語言復制復雜鏈表
路徑分享:http://weahome.cn/article/ieojso.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部