链表逆置
对两个元素递增有序的单链表A和单链表B,编写算法将A、B合并成为一个按元素递减有序(允许有相同元素)的单链表C,不允许使用A、B中的原有结点,不允许增加新结点。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
char data;//data为结点的数据信息
struct node *next;//next为指向后继结点的指针
}LNode;//单链表结点类型
LNode *CreatLinkList()//在表尾生成单链表
{
int i,n;
LNode *q,*p,*head;
head=(LNode *)malloc(sizeof(LNode));//生成头节点
head->next=NULL;//*head为链表头指针
p=head;
q=p;
printf("Input length of List:\n");
scanf("%d",&n);//结点的数据类型为int型,读入结点数据
for(i=1;i<=n;i++)//生成链表的数据结点
{
p=(LNode *)malloc(sizeof(LNode));//申请一个空结点
scanf("%d",&p->data);
p->next=NULL;
q->next=p; //在链尾插入
q=p;
}
return head;
}
void Merge(LNode *A,LNode *B,LNode **C)//单链表逆置
{
LNode *p,*q,*s;
p=A->next;//p始终指向链表A的第一个未比较的数据结点
q=B->next;//q指向链表B发第一个未比较的数据结点
*C=A;
(*C)->next=NULL;//生成链表*C的第一个数据结点
free(B);
while(p!=NULL&&q!=NULL)//将A、B两链表中当前比较结点中值小者赋给*s
{
if(p->data<q->data){
s=p;
p=p->next;
}
else{
s=q;
q=q->next;
}
s->next=(*C)->next;//用头插法将结点*S插到链表*C的头结点之后
(*C)->next=s;
}
if(p==NULL)//如果指向链表A的指针*p为空,则使*p指向链表B
p=q;
while(p!=NULL)//将*p所指向链表中的剩余结点依次摘下的链表C的链首
{
s=p;
p=p->next;
s->next=(*C)->next;
(*C)->next=s;
}
}
int print(LNode *p)//输出单链表
{
p=p->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
LNode *A,*B,*C;
printf("Creat ListA:\n");
A=CreatLinkList();//建立顺序表
print(A);//输出顺序表
printf("Creat ListB:\n");
B=CreatLinkList();//建立顺序表
print(B);
Merge(A,B,&C);//将升序表A和B合并未升序表C
print(C);
}
/*
6
1 2 3 4 5 6
3
7 8 9
*/