链表合并与逆置

链表逆置

对两个元素递增有序的单链表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
*/
上一篇:16.带头结点的单链表L,删除介于给定元素之间的元素


下一篇:C++ 循环单链表(带头结点)