最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言之復(fù)雜鏈表的復(fù)制詳解

 更新時(shí)間:2021年06月28日 10:10:57   作者:iotdog  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言之復(fù)雜鏈表的復(fù)制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

什么是復(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分開(kāi)成我們的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ù)雜鏈表中沒(méi)有結(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é)果如下圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C/C++位段超詳細(xì)整理大全

    C/C++位段超詳細(xì)整理大全

    以位為單位來(lái)定義結(jié)構(gòu)體中的成員變量所占的空間內(nèi)存,含有位段的結(jié)構(gòu)體稱為位段結(jié)構(gòu),這篇文章主要給大家介紹了關(guān)于C/C++位段的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 詳解C++11中的線程鎖和條件變量

    詳解C++11中的線程鎖和條件變量

    C++ 11允許開(kāi)發(fā)者們以標(biāo)準(zhǔn)的、不依賴于平臺(tái)的方式編寫多線程程序。這篇文章概述了標(biāo)準(zhǔn)庫(kù)對(duì)于線程和同步操作機(jī)制的支持。這些都是非常重要的知識(shí),希望讀者們可以認(rèn)真看一下
    2021-06-06
  • C語(yǔ)言實(shí)現(xiàn)紙牌計(jì)算24點(diǎn)小游戲

    C語(yǔ)言實(shí)現(xiàn)紙牌計(jì)算24點(diǎn)小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)紙牌計(jì)算24點(diǎn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C++中const、volatile、mutable使用方法小結(jié)

    C++中const、volatile、mutable使用方法小結(jié)

    這篇文章主要介紹了C++中const、volatile、mutable使用方法小結(jié),需要的朋友可以參考下
    2020-01-01
  • C++ LibCurl實(shí)現(xiàn)Web指紋識(shí)別功能

    C++ LibCurl實(shí)現(xiàn)Web指紋識(shí)別功能

    Web指紋識(shí)別是一種通過(guò)分析Web應(yīng)用程序的特征和元數(shù)據(jù),以確定應(yīng)用程序所使用的技術(shù)棧和配置的技術(shù),本文將通過(guò)C++中LibCurl庫(kù)實(shí)現(xiàn)簡(jiǎn)單是指紋識(shí)別功能,感興趣的可以了解下
    2023-11-11
  • QML中動(dòng)態(tài)與靜態(tài)模型應(yīng)用詳解

    QML中動(dòng)態(tài)與靜態(tài)模型應(yīng)用詳解

    QML是一種描述性的腳本語(yǔ)言,文件格式以.qml結(jié)尾。語(yǔ)法格式非常像CSS(參考后文具體例子),但又支持javascript形式的編程控制。QtDesigner可以設(shè)計(jì)出·ui界面文件,但是不支持和Qt原生C++代碼的交互
    2022-08-08
  • C語(yǔ)言學(xué)籍管理系統(tǒng)源代碼

    C語(yǔ)言學(xué)籍管理系統(tǒng)源代碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言學(xué)籍管理系統(tǒng)源代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 淺談C/C++中指針和數(shù)組的不同

    淺談C/C++中指針和數(shù)組的不同

    本文主要解析了C/C++中數(shù)組和指針的區(qū)別,文章簡(jiǎn)單易懂,對(duì)各位的工作學(xué)習(xí)有所幫助,有需求的朋友可以了解下
    2020-05-05
  • Clion配置opencv開(kāi)發(fā)環(huán)境的詳細(xì)過(guò)程

    Clion配置opencv開(kāi)發(fā)環(huán)境的詳細(xì)過(guò)程

    這篇文章主要介紹了Clion配置opencv開(kāi)發(fā)環(huán)境的詳細(xì)過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考的下
    2022-04-04
  • 詳解如何在VS2019和VScode中配置C++調(diào)用python接口

    詳解如何在VS2019和VScode中配置C++調(diào)用python接口

    這篇文章主要介紹了詳解如何在VS2019和VScode中配置C++調(diào)用python接口,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評(píng)論

三明市| 韶山市| 嵊州市| 那曲县| 天等县| 福贡县| 金秀| 中西区| 罗田县| 溧水县| 洪洞县| 合肥市| 肃宁县| 观塘区| 东方市| 滁州市| 高台县| 邹城市| 台中县| 镇坪县| 宝山区| 达州市| 尚志市| 资中县| 海兴县| 绩溪县| 云浮市| 玉屏| 延寿县| 安丘市| 龙泉市| 江陵县| 金堂县| 囊谦县| 天祝| 西和县| 泰州市| 瓦房店市| 广汉市| 万山特区| 原平市|