亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言之復(fù)雜鏈表的復(fù)制方法(圖示詳解)

 更新時(shí)間:2017年07月04日 08:58:58   投稿:jingxian  
下面小編就為大家?guī)硪黄狢語言之復(fù)雜鏈表的復(fù)制方法(圖示詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

什么是復(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)建了一條簡單的單鏈表(newlist),我們要復(fù)制的鏈表不妨稱之為oldlist。

2、接下來我們應(yīng)該把新創(chuàng)建的這條復(fù)雜鏈表(newlist)與已有的復(fù)雜鏈表(oldlist)合并成如下的形式:

在這種情況下我們已經(jīng)把兩條復(fù)雜鏈表合并成了一條鏈表(稱之為linklist),通過對(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ù)雜鏈表如下圖

在完成以上的步驟之后我們所要做的工作就很簡單了,我們只要把這一條鏈表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;

}

測試代碼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語言之復(fù)雜鏈表的復(fù)制方法(圖示詳解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • c++定義全局變量詳解

    c++定義全局變量詳解

    這篇文章主要給大家介紹了C++語言中定義全局變量,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2021-10-10
  • C語言制作簡易金山打字通功能的代碼

    C語言制作簡易金山打字通功能的代碼

    今天小編就為大家分享一篇關(guān)于C語言制作簡易金山打字通功能的代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C++簡單QQ程序服務(wù)器端的實(shí)現(xiàn)代碼

    C++簡單QQ程序服務(wù)器端的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C++簡單QQ程序服務(wù)器端的實(shí)現(xiàn)代碼,感興趣的朋友可以參考一下
    2016-05-05
  • 基于OpenGL實(shí)現(xiàn)多段Bezier曲線拼接

    基于OpenGL實(shí)現(xiàn)多段Bezier曲線拼接

    這篇文章主要為大家詳細(xì)介紹了基于OpenGL實(shí)現(xiàn)多段Bezier曲線拼接,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • OpenCV利用高斯模糊實(shí)現(xiàn)簡單的磨皮美顏效果

    OpenCV利用高斯模糊實(shí)現(xiàn)簡單的磨皮美顏效果

    這篇文章主要介紹了通過OpenCV中的高斯模糊以及雙邊模糊來實(shí)現(xiàn)一個(gè)簡單的磨皮美顏效果,文中的講解很詳細(xì),感興趣的同學(xué)可以學(xué)習(xí)一下
    2021-12-12
  • 使用C語言編寫圣誕表白程序

    使用C語言編寫圣誕表白程序

    圣誕節(jié)快到了,讓我們用C語言制作一個(gè)圣誕表白程序吧,下面通過本文學(xué)習(xí)下實(shí)現(xiàn)代碼
    2016-12-12
  • 顯示內(nèi)存狀態(tài)示例分享

    顯示內(nèi)存狀態(tài)示例分享

    這篇文章主要介紹了顯示內(nèi)存狀態(tài)示例,代碼簡單,下面直接看代碼,需要的朋友可以參考下
    2014-02-02
  • C++ Boost Algorithm算法超詳細(xì)精講

    C++ Boost Algorithm算法超詳細(xì)精講

    Boost.Algorithm 提供了補(bǔ)充標(biāo)準(zhǔn)庫算法的算法。與 Boost.Range 不同,Boost.Algorithm 沒有引入新概念。 Boost.Algorithm 定義的算法類似于標(biāo)準(zhǔn)庫中的算法
    2022-10-10
  • C++中關(guān)鍵字 override 的簡析

    C++中關(guān)鍵字 override 的簡析

    這篇小文來聊聊 C++中的關(guān)鍵字 override,它的含義其實(shí)兩句話就說完了,但為了敘述的完整性,讓我們從虛函數(shù)說起。感興趣的小伙伴可以跟著小編一起學(xué)習(xí)下面文章內(nèi)容
    2021-09-09
  • C++ String部分成員模擬實(shí)現(xiàn)流程詳解

    C++ String部分成員模擬實(shí)現(xiàn)流程詳解

    我們先不直接實(shí)現(xiàn)完整版的string,先實(shí)現(xiàn)簡易版的string部分成員來基本了解下它的框架,以及以后來學(xué)習(xí)深淺拷貝的問題。這樣有循序漸進(jìn)的過程嘛
    2022-08-08

最新評(píng)論