10.10将A和B合并成一个按元素递减链表

//10.10 对两个元素递增有序的单链表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 *CreateLinkList()            //生成单链表
{
	LNode *head, *p, *q;
	int i, n;
	head = (LNode *)malloc(sizeof(LNode));    //生成头节点
	head->next = NULL;
	p = head;
	q = p;                                    //指针q始终指向链尾节点
	printf("Input length of list:\n");
	scanf("%d", &n);                          //读入节点数据
	getchar();
	printf("Input data of list:\n");
	for (i = 1; i <= n; i++)                  //生成链表的数据节点
	{
		p = (LNode *)malloc(sizeof(LNode));   //申请一个节点空间
		scanf("%c", &p->data);
		getchar();
		p->next = NULL;
		q->next = p;                          //在链尾插入,把新节点p接在q后面,此时p是最后一个节点
		q = p;                                //让q成为最后的节点(对于下一个数据而言)
	}
	return head;                              //返回指向单链表的头指针head
}

void Merge(LNode *A, LNode *B, LNode **C)
{   
	//将升序链表A,B合并成降序链表*C
	LNode *p, *q, *s;
	p = A->next;                              //p始终指向链表A的第一个未比较的数据节点
	q = B->next;                              //q始终指向链表B的第一个未比较的数据节点
	*C = A;                                   //生成链表*C的头节点
	(*C)->next = NULL;
	free(B);                                  //回收链表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;
	}
}

void print(LNode *p)                          //输出单链表
{
	p = p->next;
	while (p != NULL)
	{
		printf("%c ", p->data);
		p = p->next;
	}
	printf("\n");
}

int main()
{
	LNode *A, *B, *C;
	printf("Input data of list A:\n");
	A = CreateLinkList();                     //生成单链表A
	printf("Output list A:\n");
	print(A);								  //输出单链表A
	
	printf("Input daat of list B:\n");
	B = CreateLinkList();                    //生成单链表B
	printf("Output list B:\n");
	print(B);                                //输出单链表B

	printf("Make list C:\n"); 
	Merge(A, B, &C);                         //将升序链表A, B合并成降序链表C
	printf("Output list C:\n");
	print(C);                                //输出单链表C

	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值