14 March 2014
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
	int data;
	struct node *next;
} Node, *LinkList;

LinkList InitLinkList();	// 初始化单链表
void InsertNode(LinkList l, int num);	// 插入结点
int GetLength(LinkList l);	// 获取链表长度
LinkList MergeLinkList(LinkList first, LinkList second);	// 合并链表


int _tmain(int argc, _TCHAR* argv[])
{
	int i, len;
	LinkList A = InitLinkList();
	LinkList B = InitLinkList();
	LinkList C = InitLinkList();
	Node *p, *q, *r;
	p = A;
	q = B;
	r = C;

	InsertNode(A, 2);
	InsertNode(A, 4);
	InsertNode(A, 8);
	InsertNode(A, 5);

	InsertNode(B, 2);
	InsertNode(B, 5);
	InsertNode(B, 6);
	InsertNode(B, 9);

	len = GetLength(A);
	for (i = 0; i < len; i++)
	{
		printf("%d  ", p->next->data);
		p = p->next;
	}
	printf("\n");
	len = GetLength(B);
	for (i = 0; i < len; i++)
	{
		printf("%d  ", q->next->data);
		q = q->next;
	}

	printf("\n");

	r = MergeLinkList(A, B);
	len = GetLength(r);
	for (i = 0; i < len; i++)
	{
		printf("%d  ", r->next->data);
		r = r->next;
	}

	return 0;
}

/* 初始化链表 */
LinkList InitLinkList()
{
	LinkList L;
	L = (LinkList)malloc(sizeof(Node));
	assert(L != NULL);
	L->next = NULL;
	return L;
}

/* 插入结点 */
void InsertNode(LinkList l, int num)
{
	Node *p = l;
	Node *node = (LinkList)malloc(sizeof(Node));
	assert(node != NULL);
	node->data = num;
	node->next = NULL;

	if (l->next == NULL)
		l->next = node;
	else
	{
		while (p->next != NULL && p->next->data < num)
			p = p->next;
		// Insert
		node->next = p->next;
		p->next = node;
	}
}

/* 获取链表长度 */
int GetLength(LinkList l)
{
	Node *p = l->next;
	int i;
	for (i = 0; p!=NULL; i++)
	{
		p = p->next;
	}
	return i;
}

/* 合并两个有序链表,得到有序链表 */
LinkList MergeLinkList(LinkList first, LinkList second)
{
	// 如果result作为参数传入,则必须返回值返回,因为此处对指针重新赋值
	LinkList result = first;
	
	Node *p, *q, *r;
	p = first->next;
	q = second->next;
	r = result;

	// 释放表头结点
	free(second);

	while (p && q)
	{
		if (p->data <= q->data)
		{
			r->next = p;
			p = p->next;
		}
		else
		{
			r->next = q;
			q = q->next;
		}
		r = r->next;
	}

	if (p)
		r->next = p;
	if (q)
		r->next = q;

	return result;
}