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

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

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

什么是復雜鏈表?

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

復雜鏈表的數(shù)據(jù)結構如下:

typedef int DataType;  //數(shù)據(jù)域的類型

//復雜鏈表的數(shù)據(jù)結構

typedef struct ComplexNode

{

DataType _data ;      // 數(shù)據(jù)

struct ComplexNode * _next;   // 指向下個節(jié)點的指針

struct ComplexNode * _random;  // 指向隨機節(jié)點(可以是鏈表中的任意節(jié)點 or 空)

}ComplexNode;

上圖就是一個復雜鏈表的例子,那么我們應該如何實現(xiàn)復雜鏈表的復制呢?

1、首先我們應該根據(jù)已有的復雜鏈表創(chuàng)建一條新的復雜鏈表,但是這個新的復雜鏈表的所有的結點的random指針都指向空,這樣是很好實現(xiàn)的,相當于我們創(chuàng)建了一條簡單的單鏈表(newlist),我們要復制的鏈表不妨稱之為oldlist。

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

在這種情況下我們已經(jīng)把兩條復雜鏈表合并成了一條鏈表(稱之為linklist),通過對這條鏈表(linklist)的觀察,我們可以發(fā)現(xiàn)合并的鏈表(linklist)中屬于newlist的結點pnew的上一個結點pold(屬于oldlist的結點)的random指針所指向的結點的next指針就應該是pnew結點的randow指針所指向的結點。

這樣我們讓pold和pnew指針一直往后走最后就可以實現(xiàn)對所有屬于新創(chuàng)建的復雜鏈表(newlist)的random指針指向相應的結點的操作。構成的復雜鏈表如下圖

在完成以上的步驟之后我們所要做的工作就很簡單了,我們只要把這一條鏈表linklist分開成我們的newlist鏈表和oldlist鏈表就可以了。

這樣我們就完美的完成了復雜鏈表的復制工作下面就是具體實現(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ù)域的類型
 
//復雜鏈表的數(shù)據(jù)結構
typedef struct ComplexNode
{
DataType _data ;        // 數(shù)據(jù)
struct ComplexNode * _next;    // 指向下個節(jié)點的指針
struct ComplexNode * _random;  // 指向隨機節(jié)點(可以是鏈表中的任意節(jié)點 or 空)
}ComplexNode;
 
//創(chuàng)建一個復雜鏈表的結點
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)建一個復雜鏈表的結點

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;//指向新的復雜鏈表的頭結點的指針

pold = cplist;

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

while(pold != NULL)

{

ComplexNode * new_node = BuyComplexNode(pold->_data);

if(newlist == NULL)//當新的復雜鏈表中沒有結點時

{

newlist = new_node;

}

else//當新的復雜鏈表有結點時

{

ComplexNode * node = newlist;

while(node->_next != NULL)//找到最后一個結點

{

node = node->_next;

}

node->_next = new_node;//插入新的結點

}

pold = pold->_next;

 

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

 

//合并兩條復雜鏈表

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;

}//合并兩條復雜鏈表結束

 

//讓新創(chuàng)建的那條復雜鏈表上的所有結點的random指針指向相應的結點

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;

}//結束

 

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

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;

}//分離合并的復雜鏈表結束

 

return newlist;

}

測試代碼test.c:

#include "complexnode.h"

//

//復雜鏈表的復制。?個鏈表的每個節(jié)點,有?個指向next指針指向下?個節(jié)

//點,還有?個random指針指向這個鏈表中的?個隨機節(jié)點或者NULL,現(xiàn)在要

//求實現(xiàn)復制這個鏈表,返回復制后的新鏈表。

//ps: 復雜鏈表的結構

 

 

 

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)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C++超詳細分析順序表

    C++超詳細分析順序表

    程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要創(chuàng)建這種元素組,用變量記錄它們,傳進傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關系由它們的存儲順序自然表示
    2022-03-03
  • C/CPP運算優(yōu)先級的坑及解決

    C/CPP運算優(yōu)先級的坑及解決

    這篇文章主要介紹了C/CPP運算優(yōu)先級的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言鏈表實現(xiàn)工資管理系統(tǒng)

    C語言鏈表實現(xiàn)工資管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言鏈表實現(xiàn)工資管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++連連看判定圖形消除算法

    C++連連看判定圖形消除算法

    這篇文章主要為大家詳細介紹了C++連連看判定圖形消除算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • QT樹的具體項目實現(xiàn)

    QT樹的具體項目實現(xiàn)

    本文主要介紹了QT樹的具體項目實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 從C++單例模式到線程安全詳解

    從C++單例模式到線程安全詳解

    下面小編就為大家?guī)硪黄獜腃++單例模式到線程安全詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++ leetcode之刪除并獲得點數(shù)的示例代碼

    C++ leetcode之刪除并獲得點數(shù)的示例代碼

    這篇文章主要介紹了C++ leetcode之刪除并獲得點數(shù)的示例代碼,本文給大家分享問題解析及解決方案,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • C語言實現(xiàn)訪問及查詢MySQL數(shù)據(jù)庫的方法

    C語言實現(xiàn)訪問及查詢MySQL數(shù)據(jù)庫的方法

    這篇文章主要介紹了C語言實現(xiàn)訪問及查詢MySQL數(shù)據(jù)庫的方法,涉及C語言基于libmysql.lib實現(xiàn)訪問MySQL數(shù)據(jù)庫的相關操作技巧,需要的朋友可以參考下
    2018-01-01
  • OpenCV實現(xiàn)相機標定板

    OpenCV實現(xiàn)相機標定板

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)相機標定板,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Qt音視頻開發(fā)之音頻播放QAudioOutput的實現(xiàn)

    Qt音視頻開發(fā)之音頻播放QAudioOutput的實現(xiàn)

    這篇文章主要為大家詳細介紹了如何利用Qt實現(xiàn)音頻播放QAudioOutput功能,文中的示例代碼講解詳細,對我們學習Qt開發(fā)有一定的幫助,需要的可以參考一下
    2023-03-03

最新評論

武定县| 邻水| 永安市| 广灵县| 额敏县| 安多县| 大港区| 连城县| 福泉市| 孟州市| 资溪县| 和硕县| 明光市| 荆州市| 清新县| 罗甸县| 满洲里市| 秭归县| 双峰县| 灵武市| 泸溪县| 青田县| 明水县| 天台县| 泸溪县| 霍城县| 玛沁县| 沿河| 区。| 遂川县| 潞西市| 宜都市| 彝良县| 象州县| 兴隆县| 仪征市| 苗栗市| 昌邑市| 佛学| 小金县| 阳城县|