c语言实现两个有序链表的合并(代码示例)

青灯夜游
青灯夜游 转载
2020-10-26 15:08:20 3246浏览

本篇文章通过代码示例介绍一下使用c语言合并两个有序链表的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

教程推荐:《c语言教程视频

c语言实现两个有序链表的合并

现有两个有序单链表,通过代码实现将两个单链表合并为一个有序的新表,要求使用旧表的空间,不能新分配内存

#include <stdio.h>#include <stdlib.h>typedef struct List{
	int a;
	struct List *next;}list;void newList(list *l){
	//初始化头节点
	l->next = NULL;}void setList(list * l){
	//建立链表
	int i = 1;
	int j;
	while (i)
	{
		scanf_s("%d", &j);
		if (j == -1)
		{
			i = 0;
		}
		else
		{
			list *l1 = (list *)malloc(sizeof(list));//为新的结点分派内存
			l1->a = j;//储存数据
			/*
			将最后结点的next区域指向新结点
			将新结点的next区域指向设置为空
			*/
			l->next = l1;
			l1->next = NULL;
			l = l->next;
		}
	}}void printfList(list *l){
	printf("该链表内容为:\n");
	while (l->next)
	{
		printf("%d\t", l->next->a);
		l = l->next;
	}
	printf("\n");}list *add(list *LA, list *LB){
	//记录两个链表的头结点
	list *la=LA;
	list *l = LA;
	list *lb = LB;
	//移动指针
	LA = LA->next;
	LB = LB->next;
	la->next = NULL;
	while (LA!=NULL&&LB!=NULL)
	{
		/*
		将两个结点的数据进行比较,数据较小的结点接在头结点后面,
		*/
		if (LA->a < LB->a)
		{
			la->next = LA;
			la = LA;
			LA = LA->next;
		}
		else
		{
			la->next = LB;
			la = LB;
			LB = LB->next;
		}
	}
	//若其中一个链表的结点已经全接在新表中则将另一个链表的剩余结点接在新表的后面
	if (LA)
	{
		la->next = LA;
	}
	if(LB)
	{
		la->next = LB;
	}
	free(lb);
	return l;}int main(){
	//为结点分配内存
	list *LA = (list *)malloc(sizeof(list));
	list *LB = (list *)malloc(sizeof(list));
	//初始化结点
	newList(LA);
	newList(LB);
	//建立链表
	setList(LA);
	setList(LB);
	//输出链表的内容
	printf("LA的数据:\n");
	printfList(LA);
	printf("LB的数据:\n");
	printfList(LB);
	list *LC = add(LA, LB);
	//输出合并后的新表
	printfList(LC);
	system("pause");
	return 0;}

在这里插入图片描述

更多编程相关知识,请访问:编程入门!!

以上就是c语言实现两个有序链表的合并(代码示例)的详细内容,更多请关注php中文网其它相关文章!

声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除