两非递减有序单链表归并、逆置
数据结构课后题:2.22
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW 0
#define OK 1
typedef int ElemType;
typedef int Status;
typedef struct LNode {
ElemType data;//数据域
struct LNode *next;//指针域
}LNode, *LinkList;
LinkList CreateList_L_Tail(int n)
{//尾插法建立单链表
LinkList L;
LNode *p, *r;
L = (LinkList)malloc(sizeof(LNode));//创建头结点
r = L;//r始终指向尾节点,开始时指向头结点
for (int i = n; i > 0; i--)
{//循环建立数据节点
p = (LinkList)malloc(sizeof(LNode));//生成新结点
scanf_s("%d", &p->data);//创建数据节点*p,输入元素的值
r->next = p;//将*p插入到*r之后
r = p;
}
r->next = NULL;
return L;
}
void PrintList(LinkList L)
{
LNode* p;
p = L->next;
while (p != NULL)
{
printf("%5d", p->data);
p = p->next;
}
printf("\n");
}
LinkList MergeList(LinkList a, LinkList b)
{
LNode *pa, *pb, *pc, *pan, *pbn;
pa = a->next;
pb = b->next;
pc = a;
pc->next = NULL;
while (pa&&pb)
{
if (pa->data < pb->data)//pa所指的结点连到pc,pa指针后移
{
pan = pa->next;
pa->next = pc->next;
pc->next = pa;
pa = pan;
}
else//pb所指的结点链到pc,pb指针后移
{
pbn = pb->next;
pb->next = pc->next;
pc->next = pb;
pb = pbn;
}
}
while (pa)
{
pan = pa->next;
pa->next = pc->next;
pc->next = pa;
pa = pan;
}
while (pb)
{
pbn = pb->next;
pb->next = pc->next;
pc->next = pb;
pb = pbn;
}
free(pb);
return pc;
}
void InvertLinkList(LinkList L)
{//就地逆置单链表L
LNode*p, *pn;
p = L->next;
if (!p || !p->next)
return ERROR;
pn = p->next;//pn指向p的直接后继结点
p->next = NULL;//令首元结点的指针域为空
while (pn)
{
p = pn;
pn = pn->next;//指针后移
p->next = L->next;
L->next = p;//插入结点之后
}
}
int main()
{
int n;
LinkList L, S, K;
printf("输入第一个要建立的顺序链表的元素个数:");
scanf_s("%d", &n);
printf("输入顺序链表的元素(尾插法创建单链表):");
L = CreateList_L_Tail(n);
printf("顺序表中元素是:");
PrintList(L);
printf("输入第二个要建立的顺序链表的元素个数:");
scanf_s("%d", &n);
printf("输入顺序链表的元素(尾插法创建单链表):");
S = CreateList_L_Tail(n);
printf("顺序表中元素是:");
PrintList(S);
printf("归并后的线性链表是:");
K = MergeList(L, S);
PrintList(K);
printf("逆置后的线性表是:");
InvertLinkList(K);
PrintList(K);
system("pause");
return 0;
}