C语言链表完成La和Lb中的数据元素按值递增有序排列

源码如下

#pragma once
#include<stdio.h>
#include<stdlib.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int ElemType;
typedef int Status;

typedef struct Node
{
    
    
	ElemType data;
	struct Node* next;
}LNode, * LinkList;

Status InitList(LinkList L);//构造一个空线性表L,创建成功返回OK
Status InputData(LinkList L);//初始化线性表,成功返回OK
int ListLength(LNode L);//求线性表的长度
Status GetElem(LNode L, int i, ElemType& e);//用e返回L中第i个数据,成功后返回OK
Status ListInsert(LinkList L, ElemType e);//在线性表L的链尾插入元素e,成功返回OK
void MergeList(LNode La, LNode Lb, LinkList Lc);//合并La和Lb到Lc中
void OutPut(LinkList L);//输出线性表所有元素

Status InitList(LinkList L)//构造一个空线性表L,创建成功返回OK
{
    
    
	L->next = NULL;
	L->data = 0;
	return OK;
}

Status InputData(LinkList L)//初始化线性表,成功返回OK
{
    
    
	int n;
	LinkList Temp_L, p;
	scanf_s("%d", &n);
	L->data = n;
	printf("请按空格依次输入每个元素:\n");
	p = L;
	while (n--)
	{
    
    
		if (!(Temp_L = (LinkList)malloc(sizeof(LNode))))
		{
    
    
			exit(OVERFLOW);
		}
		scanf_s("%d", &Temp_L->data);
		Temp_L->next = NULL;
		p->next = Temp_L;
		p = Temp_L;
	}
	printf("******************************************\n");
	return OK;
}

int ListLength(LNode L)//求线性表的长度
{
    
    
	return L.data;
}

Status GetElem(LNode L, int i, ElemType& e)//用e返回L中第i个数据,成功后返回OK
{
    
    
	LinkList p = &L;
	if (i<0 || i > p->data)
	{
    
    
		return ERROR;
	}
	while (i)
	{
    
    
		p = p->next;
		i--;
	}
	e = p->data;
	return OK;
}

Status ListInsert(LinkList L, ElemType e)//在线性表L的链尾插入元素e,成功返回OK
{
    
    
	int L_len = L->data;
	LinkList newNode, p = L;
	if (!(newNode = (LinkList)malloc(sizeof(LNode))))
	{
    
    
		exit(OVERFLOW);
	}
	newNode->next = NULL;
	newNode->data = e;

	while (L_len)
	{
    
    
		p = p->next;
		L_len--;
	}
	p->next = newNode;
	L->data++;
	return OK;
}

void MergeList(LNode La, LNode Lb, LinkList Lc)//合并La和Lb到Lc中
{
    
    
	int i = 1, k = 0, j = 1;
	int La_len = ListLength(La);
	int Lb_len = ListLength(Lb);
	ElemType ai, bj;
	while ((i <= La_len) && (j <= Lb_len))
	{
    
    
		GetElem(La, i, ai); GetElem(Lb, j, bj);
		if (ai <= bj)
		{
    
    
			ListInsert(Lc, ai);
			++i;
		}
		else
		{
    
    
			ListInsert(Lc, bj);
			++j;
		}
	}
	while (i <= La_len)
	{
    
    
		GetElem(La, i++, ai);
		ListInsert(Lc, ai);
	}
	while (j <= Lb_len)
	{
    
    
		GetElem(Lb, j++, bj);
		ListInsert(Lc, bj);
	}
}

void OutPut(LinkList L)//输出线性表所有元素
{
    
    
	LinkList Temp_L = L->next;
	while (Temp_L)
	{
    
    
		printf("%d ", Temp_L->data);
		Temp_L = Temp_L->next;
	}
}

int main()
{
    
    
	LNode La, Lb, Lc;
	InitList(&La); InitList(&Lb); InitList(&Lc);
	printf("请输入链La的元素个数:\n");
	InputData(&La);
	printf("请输入链Lb的元素个数:\n");
	InputData(&Lb);
	MergeList(La, Lb, &Lc);
	printf("合并La和Lb后,Lc中元素如下:\n");
	OutPut(&Lc);
	return 0;
	
}

猜你喜欢

转载自blog.csdn.net/qq_32100603/article/details/109500444