带随机指针域的单链表的复制

来源:互联网 发布:软件使用情况 编辑:程序博客网 时间:2024/06/06 09:01
题目要求:复杂链表的复制。一个链表的每个节点,有一个指向next指针指向下一个节点,还有一
个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,

返回复制后的新链表。

#define _CRT_SECURE_NO_WARNINGS 1typedef int DataType;#define NULL 0#include<stdio.h>#include<windows.h>#include<assert.h>typedef struct Node{DataType data;struct Node*next;struct Node*random;}Node, *LinkList;void InitList(LinkList *L){*L = (Node*)malloc(sizeof(Node));if (*L == NULL){printf("申请内存空间失败");}(*L)->next = NULL;}LinkList BuyNode(DataType data){LinkList NewNode = NULL;NewNode = (LinkList)malloc(sizeof(Node));if (NewNode == NULL){printf("为节点创建空间失败");}NewNode->data = data;NewNode->random =NULL;NewNode->next = NULL;return NewNode;}void PrintList(LinkList L){LinkList Cur = L;if (L == NULL){printf("NULL");}while (Cur){if (Cur == NULL)return;printf("%d %d--->", Cur->data,Cur->random->data);Cur = Cur->next;}printf("NULL\n");}void PushBack(LinkList* L, DataType data){assert(L);LinkList Cur = *L;if (Cur == NULL){Cur = BuyNode(data);}while (Cur->next){Cur = Cur->next;}Cur->next = BuyNode(data);}LinkList Find(LinkList L, DataType data){assert(L);if (L == NULL){return NULL;}LinkList Cur = L;while (Cur != NULL){if (Cur->data == data){return Cur;}Cur = Cur->next;}return NULL;}LinkList CopyLinkListwithRandompoint(LinkList L){LinkList CopyL = NULL;LinkList Cur = NULL;LinkList Tail = NULL;LinkList NewNode = NULL;if (L == NULL)return NULL;else if (L->next == NULL)CopyL = L->next;Cur = L->next;while (Cur->next)        //在单链表每一个节点后面插入一个data与原来链表{                             //相同的节点NewNode = BuyNode(Cur->data);NewNode->next = Cur->next;Cur->next = NewNode;Cur = NewNode->next;}NewNode = BuyNode(Cur->data);Cur->next = NewNode;Cur = L->next;                      //为新插入的节点赋随机域while(Cur){NewNode = Cur->next;NewNode->random = Cur->random->next;Cur = NewNode->next;}            //拆链表为原链表和复制后之后的链表Cur = L->next;NewNode = Cur->next;Cur->next = NewNode->next;NewNode->next = NULL;CopyL = NewNode;Tail = NewNode;while (1){Cur = Cur->next;NewNode = Cur->next;if (NULL == NewNode->next)break;Cur->next = NewNode->next;NewNode->next = NULL;Tail->next = NewNode;Tail = Tail->next;}Cur->next = NULL;Tail->next = NewNode;Tail = Tail->next;return CopyL;}void test(){LinkList L;InitList(&L);PushBack(&L, 1);PushBack(&L, 2);PushBack(&L, 3);PushBack(&L, 4);L->random = NULL;LinkList L1 = Find(L, 1);LinkList L2 = Find(L, 2);LinkList L3 = Find(L, 3);LinkList L4 = Find(L, 4);L1->random = L4;L2->random = L3;L3->random = L1;L4->random = L2;    PrintList(CopyLinkListwithRandompoint(L));}int main(){test();system("pause");return 0;