這篇文章主要介紹“如何用C語言復(fù)制復(fù)雜鏈表”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強(qiáng),希望這篇“如何用C語言復(fù)制復(fù)雜鏈表”文章能幫助大家解決問題。
創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、成都網(wǎng)站建設(shè)與策劃設(shè)計,金東網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:金東等地區(qū)。金東做網(wǎng)站價格咨詢:13518219792
什么是復(fù)雜鏈表?
復(fù)雜鏈表指的是一個鏈表有若干個結(jié)點,每個結(jié)點有一個數(shù)據(jù)域用于存放數(shù)據(jù),還有兩個指針域,其中一個指向下一個節(jié)點,還有一個隨機(jī)指向當(dāng)前復(fù)雜鏈表中的任意一個節(jié)點或者是一個空結(jié)點。今天我們要實現(xiàn)的就是對這樣一個復(fù)雜鏈表復(fù)制產(chǎn)生一個新的復(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; // 指向下個節(jié)點的指針 struct ComplexNode * _random; // 指向隨機(jī)節(jié)點(可以是鏈表中的任意節(jié)點 or 空) }ComplexNode;
具體實現(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; // 指向下個節(jié)點的指針 struct ComplexNode * _random; // 指向隨機(jī)節(jié)點(可以是鏈表中的任意節(jié)點 or 空) }ComplexNode; //創(chuàng)建一個復(fù)雜鏈表的結(jié)點 ComplexNode * BuyComplexNode(DataType x); //打印復(fù)雜的單鏈表 void Display(const ComplexNode * cplist); //復(fù)雜鏈表的復(fù)制 ComplexNode * CopyComplexNode(ComplexNode * cplist); #endif//__COMPLEX__NODE__H__
具體功能實現(xiàn)complexnode.c
#include "complexnode.h" //創(chuàng)建一個復(fù)雜鏈表的結(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; } //打印復(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é)點的指針 pold = cplist; //創(chuàng)建一條新的復(fù)雜鏈表 while(pold != NULL) { ComplexNode * new_node = BuyComplexNode(pold->_data); if(newlist == NULL)//當(dāng)新的復(fù)雜鏈表中沒有結(jié)點時 { newlist = new_node; } else//當(dāng)新的復(fù)雜鏈表有結(jié)點時 { ComplexNode * node = newlist; while(node->_next != NULL)//找到最后一個結(jié)點 { node = node->_next; } node->_next = new_node;//插入新的結(jié)點 } 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é)點的random指針指向相應(yīng)的結(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é)束 //分離合并后的復(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ù)制。?個鏈表的每個節(jié)點,有?個指向next指針指向下?個節(jié) //點,還有?個random指針指向這個鏈表中的?個隨機(jī)節(jié)點或者NULL,現(xiàn)在要 //求實現(xiàn)復(fù)制這個鏈表,返回復(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; }
關(guān)于“如何用C語言復(fù)制復(fù)雜鏈表”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。
當(dāng)前名稱:如何用C語言復(fù)制復(fù)雜鏈表
URL分享:http://www.chinadenli.net/article30/ieojso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、搜索引擎優(yōu)化、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、服務(wù)器托管、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)