欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言之復雜鏈表的復制詳解

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

什么是復雜鏈表?

復雜鏈表指的是一個鏈表有若干個結點,每個結點有一個數(shù)據(jù)域用于存放數(shù)據(jù),還有兩個指針域,其中一個指向下一個節(jié)點,還有一個隨機指向當前復雜鏈表中的任意一個節(jié)點或者是一個空結點。今天我們要實現(xià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)合并成如下的形式:

在這種情況下我們已經把兩條復雜鏈表合并成了一條鏈表(稱之為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指針已經指向空

{

break;

}

pnew = pold->_next;

}//結束

 

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

pold = cplist;
pnew = newlist;
while (pold)

{

ComplexNode * curold = NULL;
ComplexNode * curnew = NULL;
if(pnew->_next == NULL)//已經分離完成

{

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++控制臺實現(xiàn)俄羅斯方塊游戲

    C++控制臺實現(xiàn)俄羅斯方塊游戲

    這篇文章主要為大家詳細介紹了C++控制臺實現(xiàn)俄羅斯方塊游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 一篇文章帶你了解C語言:入門基礎

    一篇文章帶你了解C語言:入門基礎

    這篇文章主要介紹了C語言入門之基礎知識詳解,文中有非常詳細的C語言使用教程及相關基礎知識,對正在學習c語言的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-08-08
  • C語言編寫五子棋游戲

    C語言編寫五子棋游戲

    這篇文章主要為大家詳細介紹了C語言編寫五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Qt5.9繼承QObject創(chuàng)建多線程實例

    Qt5.9繼承QObject創(chuàng)建多線程實例

    本文主要介紹了Qt5.9繼承QObject創(chuàng)建多線程實例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • c++實現(xiàn)堆排序的示例代碼

    c++實現(xiàn)堆排序的示例代碼

    本文主要介紹了c++實現(xiàn)堆排序的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • C++面向對象編程之析構詳解

    C++面向對象編程之析構詳解

    這篇文章主要為大家詳細介紹了C++面向對象編程之析構,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 使用C語言判斷英文字符大小寫的方法

    使用C語言判斷英文字符大小寫的方法

    這篇文章主要介紹了使用C語言判斷英文字符大小寫的方法,分別為isupper()函數(shù)和islower()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • C++?const與constexpr區(qū)別小結

    C++?const與constexpr區(qū)別小結

    C++11標準中,const用于為修飾的變量添加只讀屬性,而constexpr關鍵字則用于指明其后是一個常量,本文主要介紹了C++?const與constexpr區(qū)別小結,感興趣的可以了解一下
    2024-03-03
  • windows下如何安裝OpenCL

    windows下如何安裝OpenCL

    這篇文章主要介紹了windows下如何安裝OpenCL,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • 快速學習六大排序算法

    快速學習六大排序算法

    這篇文章主要介紹了六大排序算法-插入排序、希爾排序、選擇排序、冒泡排序、堆排序、快速排序,需要學習的小伙伴可以參考這篇文章
    2021-08-08

最新評論