//有两个数值按顺序排列的链表 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;
}