链表面试题---复杂链表的复制

 

复杂链表  : 在复杂链表中,每个节点除了有一个next指向下一节点外,还有一个random指向任意节点或者NULL

   

 

代码如下 :

Linklist.h  头文件

#ifndef __LINKLIST_H__
#define __LINKLIST_H__

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

//定义元素类型
typedef int DataType;
//复杂链表的定义
typedef struct ComplexNode
{
	DataType data;
	struct ComplexNode* next;     //存放下一个节点
	struct ComplexNode* random;  //存放任意节点
}ComplexNode;
//申请节点
ComplexNode *BuyComplexNode(DataType x);
//复杂链表的复制
ComplexNode *CopyComplexList(ComplexNode* plist);
//复杂链表的打印
void PrintComplexList(ComplexNode* plist);


#endif __LINKLIST_H__

Linklist.c 主函数文件

#include "Linklist.h"

//申请节点
ComplexNode* BuyComplexNode(DataType d)
{
	ComplexNode* node = (ComplexNode *)malloc(sizeof(ComplexNode));
	if (node == NULL)
	{
		perror("Buy Node");
		exit(FILENAME_MAX);
	}
	node->data = d;
	node->next = NULL;
	node->random = NULL;
	return node;
}
//复杂链表的打印
void PrintComplexList(ComplexNode* plist)
{
	assert(plist);
	while (plist)
	{
		printf("%d : ", plist->data);
		if (plist->random != NULL)
		{
			printf("(%d)-->", plist->random->data);
		}
		else
		{
			printf("(NULL)-->");
		}
		plist = plist->next;
	}
	printf("Over !\n");
}
//复杂链表的复制
ComplexNode* CopyComplexList(ComplexNode* plist)
{
	ComplexNode* cur = NULL;
	ComplexNode* tmp = NULL;
	ComplexNode* head = NULL;
	assert(plist);
	cur = plist;
	while (cur != NULL)
	{
		tmp = BuyComplexNode(cur->data);
		tmp->next = cur->next;
		cur->next = tmp;
		cur = tmp->next;
	}
	cur = plist;
	tmp = cur->next;
	while (cur != NULL)
	{
		if (cur->random != NULL)
		{
			tmp->random = cur->random->next;
		}
		cur = tmp->next;
		if (cur != NULL)
		{
			tmp = cur->next;
		}
	}
	cur = plist;
	tmp = cur->next;
	head = tmp;
	while (cur != NULL)
	{
		cur->next = tmp->next;
		cur = cur->next;
		if (cur != NULL)
		{
			tmp->next = cur->next;
		}
		tmp = tmp->next;
	}
	return head;
}

test.c 测试文件

#include "Linklist.h"
void testCopyComplexList()
{
	ComplexNode * cur;
	ComplexNode * plist;
	ComplexNode * p1 = BuyComplexNode(5);
	ComplexNode * p2 = BuyComplexNode(4);
	ComplexNode * p3 = BuyComplexNode(3);
	ComplexNode * p4 = BuyComplexNode(2);
	ComplexNode * p5 = BuyComplexNode(1);
	plist = p1;
	p1->next = p2;
	p2->next = p3;
	p3->next = p4;
	p4->next = p5;
	p1->random = p3;
	p2->random = p5;
	p3->random = NULL;
	p4->random = p1;
	p5->random = p2;
	PrintComplexList(plist);
	cur = CopyComplexList(plist);
	PrintComplexList(plist);
}
int main()
{
 testCopyComplexList();
 system("pause");
 return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值