//頭文件
#pragma once
typedef int DataType;
typedef struct ComplexNode
{
DataType _data; // 數據
struct ComplexNode* _next; // 指向下一個節點的指針
struct ComplexNode* _random; // 指向隨機節點
}ComplexNode,*pComplexNode;
void BuyNode(pComplexNode& pNode,DataType x);
void PushBack(pComplexNode& pHead,DataType x);
void CopyCplexList(pComplexNode pHead,pComplexNode& NewpHead);
pComplexNode Find(pComplexNode pHead, DataType Data);
void PrintLinkList(pComplexNode pHead);
//函數文件
#include<stdio.h>
#include"ComplexList.h"
#include<assert.h>
#include<malloc.h>
//創建節點
void BuyNode(pComplexNode& pNode, DataType x)
{
pNode = (pComplexNode)malloc(sizeof(ComplexNode));
pNode->_data = x;
pNode->_next = NULL;
pNode->_random = NULL;
}
//頭插
void PushBack(pComplexNode& pHead,DataType x)
{
pComplexNode tmp = pHead;
if (pHead == NULL)
{
BuyNode(pHead, x);
return;
}
while (tmp->_next != NULL)
{
tmp = tmp->_next;
}
BuyNode(tmp->_next, x);
}
//復雜鏈表復制
void CopyCplexList(pComplexNode pHead, pComplexNode& NewpHead)
{
pComplexNode tmp = pHead;
pComplexNode head = pHead;
if (pHead == NULL)
return;
while (head != NULL)
{
tmp = head->_next;
BuyNode(NewpHead, head->_data);
head->_next = NewpHead;
NewpHead->_next = tmp;
head = tmp;
}
head = pHead;
while (head != NULL)
{
tmp = head->_next;
if (head->_random == NULL)
tmp->_random == NULL;
else
tmp->_random = head->_random->_next;
head = head->_next->_next;
}
head = pHead;
NewpHead = head->_next;
while (head!=NULL)
{
tmp = head->_next;
head->_next = tmp->_next;
head = tmp->_next;
if (head == NULL)
return;
tmp->_next = head->_next;
}
}
//查找
pComplexNode Find(pComplexNode pHead, DataType Data)
{
pComplexNode tmp = pHead;
assert(pHead);
while (tmp)
{
if (tmp->_data == Data)
return tmp;
tmp = tmp->_next;
}
return NULL;
}
//輸出
void PrintLinkList(pComplexNode pHead)
{
pComplexNode tmp = pHead;
if (pHead == NULL)
{
printf("鏈表為空!\n");
}
while (tmp)
{
printf("%d ", tmp->_data);
tmp = tmp->_next;
}
printf("\n");
}
//測試用例 主函數
#include<stdio.h>
#include"ComplexList.h"
void test1()
{
pComplexNode pHead=NULL,NewpHead=NULL;
PushBack(pHead, 1);
PushBack(pHead, 2);
PushBack(pHead, 3);
PushBack(pHead, 4);
PrintLinkList( pHead);
Find(pHead, 1)->_random = Find(pHead, 3);
Find(pHead, 2)->_random = Find(pHead, 4);
Find(pHead, 3)->_random = Find(pHead, 2);
Find(pHead, 4)->_random = Find(pHead, 1);
CopyCplexList(pHead, NewpHead);
PrintLinkList(NewpHead);
}
int main()
{
test1();
return 0;
}