#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;
}