设单链表A和B均非递减有序,试设计算法,将A和B合并成非递增有序的单链表C,并要求利用原表A和B的结点空间构造表C。|数据结构

设单链表A和B均非递减有序,试设计算法,将A和B合并成非递增有序的单链表C,并要求利用原表A和B的结点空间构造表C。
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
	int data; 
	struct node *next; 
}Linklist; //单链表结点

void main()
{
	Linklist *A,*B,*C;
	Linklist * Merge(Linklist *A,Linklist *B);
	Linklist *CreateLinkList();
	void sort_increase(Linklist* head);
	void OUT(Linklist *head);

	printf("Input data of list A:\n");
	A=CreateLinkList(); //生成单链表A
	printf("Output list A:\n");
	OUT(A); //输出单链表A
	printf("After Sort:\n");
	sort_increase(A);
	OUT(A);

	printf("Input data of list B:\n");
	B=CreateLinkList(); //生成单链表B
	printf("Output list B:\n");
	OUT(B); //输出单链表B
	printf("After Sort:\n");
	sort_increase(B);
	OUT(B);

	printf("合并:\n");
	C = Merge(A,B); //将升序链表A、B合并成降序链表C
	
	printf("Output list C:\n");
	OUT(C);
}

//生成单链表
Linklist *CreateLinkList() 
{
	Linklist *head,*p,*q;
	int i,n;
	head=(Linklist*)malloc(sizeof(Linklist)); //生成头结点
	head->next=NULL ;
	q=head;
	printf("Input length of list: \n");
	scanf("%d", &n); 
	printf("Input data of list: \n");
	for(i=1;i<=n;i++)
	{
		p=(Linklist*)malloc(sizeof(Linklist)); 
		scanf("%d",&p->data);
		p->next=NULL;
		q->next=p; //在链尾插入
		q=p;
	}
	return head; //返回指向单链表的头指针head
}

//递增排序
void sort_increase(Linklist* head)
{
	int t;
	Linklist *r;//串联链表
	Linklist *temp;//记录每一轮指针走到哪里了
	for(r = head->next;r;r=r->next)
	{
		for(temp = r->next;temp;temp=temp->next)
		{
			if(r->data > temp->data)
			{
				t = temp->data;
				temp->data = r->data;
				r->data = t;
			}
		}
	}

}

Linklist * Merge(Linklist *A,Linklist *B)

{
	Linklist *pa,*pb,*s;
	Linklist *C;
	pa=A->next; // p始终指向链表A的第一个未比较的数据结点 
	pb=B->next; // q始终指向链表B的第一个未比较的数据结点 
	C=A; //生成链表的C的头结点
	C->next=NULL;
	free(B); //回收链表B的头结点空间
	while(pa && pb) 
	{
		if(pa->data <= pb->data)
		{
			s=pa;
			pa=pa->next;
		}
		else
		{
			s=pb;
			pb=pb->next;
		}
		
		s->next=C->next; //用头插法将结点*s插到C的头结点之后 
		C->next=s;
	}
	if(pb)
		pa=pb;
	while(pa) 
	{
		s=pa;
		pa=pa->next;
		s->next=C->next;
		C->next=s;
	}
	free(B);
	return C;
}

//输出
void OUT(Linklist *head)
{
	head = head->next;
	while(head)
	{
		printf("%6d",head->data);
		head = head->next;
	}
	printf("\n");
}

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值