链表归并

//有两个数值按顺序排列的链表 1,链表 2,将链表1和2归并 成链表 3。
#define N	64

typedef struct _list_{
	int data;
	struct _list_ *next;
}LinkNode, *Linklist;

Linklist cread_linklist(int size);		//创建链表头结点
Linklist cread_newnode(int data);		//创建新节点
int inster_linklist(Linklist head, int data);	//插入节点
int sort(Linklist listA, Linklist listB, Linklist listC);//归并
int printf_linklist(Linklist list);		//打印链表
int free_linklist(Linklist list);		//销毁链表

int main()
{
	Linklist listA = NULL,
		listB = NULL,
		listC = NULL;
	int i;
	int a[5] = {1, 3, 5, 7, 9},
	b[5] = {2, 4, 6, 7, 8};
	/*创建A、B、C三个链表*/
	listA = cread_linklist(N);
	listB = cread_linklist(N);
	listC = cread_linklist(N);

	for(i = 0; i < 5; i ++)
	{
		inster_linklist(listA, a[i]);
		inster_linklist(listB, b[i]);
	}
	puts("listA");
	printf_linklist(listA);
	puts("listB");
	printf_linklist(listB);
	sort(listA, listB, listC);/*归并链表*/
	puts("listC");
	printf_linklist(listC);
	/*销毁链表*/
	free_linklist(listA);
	free_linklist(listB);
	free_linklist(listC);
	return 0;
}
Linklist cread_linklist(int size)/*创建链表头结点*/
{
	Linklist head = NULL;
	head = (Linklist)malloc(sizeof(LinkNode));
	head->next = NULL;
	return head;
}

Linklist cread_newnode(int data)/*创建新结点*/
{
	Linklist node = NULL;
	node = (Linklist)malloc(sizeof(LinkNode));
	node->data = data;
	node->next = NULL;
	return node;
}

int inster_linklist(Linklist head, int data)/*往链表插入数据*/
{
	Linklist node = NULL;
	node = cread_newnode(data);
	while(head->next != NULL && head->next->data < data)
		head = head->next;
	node->next = head->next;
	head->next = node;
	return 0;
}

int sort(Linklist listA, Linklist listB, Linklist listC)
{
	Linklist tmp = NULL;
	while(NULL != listA->next && NULL != listB->next)
	{
		if(listA->next->data > listB->next->data)
		{
			while(NULL != listC->next)
			{
				listC = listC->next;
			}
			listC->next = listB->next;
			tmp = listB->next;
			listB->next = listB->next->next;
			tmp->next = NULL;
		}
		else
		{
			while(NULL != listC->next)
			{
				listC = listC->next;
			}
			listC->next = listA->next;
			tmp = listA->next;
			listA->next = listA->next->next;
			tmp->next = NULL;
		}
	}
	while(NULL != listA->next)
	{
		while(NULL != listC->next)
			listC = listC->next;
		listC->next = listA->next;
		tmp = listA->next;
		listA->next = listA->next->next;
		tmp->next = NULL;

	}
	while(NULL != listB->next)
	{
		while(NULL != listC->next)
			listC = listC->next;
		listC->next = listB->next;
		tmp = listB->next;
		listB->next = listB->next->next;
		tmp->next = NULL;

	}
	return 0;
}

int printf_linklist(Linklist list)
{
	while(list->next != NULL)
	{
		printf("%5d", list->next->data);
		list = list->next;
	}
	putchar('\n');
	return 0;
}  

int free_linklist(Linklist list)
{
	Linklist tmp = NULL;
	while(list->next != NULL)
	{
		tmp = list->next;
		list->next = list->next->next;
		free(tmp);
	}
	free(list);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值