c语言版数据结构(奇迹冬瓜)-链表实战(2)合并两有序线性表

//c语言版数据结构(奇迹冬瓜)-链表实战(2)合并两有序线性表

//题目:已知线性表La和Lb中的数据元素按值非递减有序排列,现要求将La与Lb一起为一个新的线性表Lc(值非递减排列)

/*
主要函数思想:
初始化La,Lb,Lc链表头;
输入La,Lb链表数据;
当La链表下一个结点不为空或者Lb链表下一个结点不为空
{
   比较La和Lb的结点
   {
       La的结点>=Lb的结点
	   {
	      Lc的结点指向下一个结点为Lb的当前结点;
		  Lb的结点移到下一个结点;
	   }
	   其余
	   {
	      Lc的结点指向下一个结点为La的当前结点;
		  La的结点移到下一个结点;
	   }
   }
   Lc移动一个结点;
}
La的下一个结点不为空
{
  Lc指向La的剩余部分;
}
其他
{
    Lc指向Lb的剩余部分;
}
*/

//--------头文件---------

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

//--------宏定义---------

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define TRUE 1
#define ERROR 0
#define OVERFLOW -2

//-----结构体和替换-----

typedef int Data;
typedef struct 
{
	Data *data;
	int length;
	int listsize;
}List,*NList;

//-------函数-------
int InitList(NList L);
int InputData(NList L,int n);
Data GetData(NList L,int n);
int Compare(Data a,Data b);
int InsertC(NList L,Data d,int k);
void OutPutC(NList L);

//------主函数------

void main()
{
	List La,Lb,Lc,*A=&La,*B=&Lb,*C=&Lc;
	int n,i,j,k=0;
	Data da,db;
	InitList(A);InitList(B);InitList(C);
	printf("请输入集合A的元素个数:");
	scanf("%d",&n);
	InputData(A,n);
	printf("请输入集合B的元素个数:");
	scanf("%d",&n);
	InputData(B,n);
	i=A->length;j=B->length;
	//printf("A=%d B=%d\n",i,j);
	while(i&&j)
	{
		da=GetData(A,A->length-i);db=GetData(B,B->length-j);
		if(Compare(da,db))
		{
			InsertC(C,da,k++);
			i--;
		}
		else
		{
			InsertC(C,db,k++);
			j--;
		}
		printf("A=%d B=%d\n",i,j);
	}
	while(i)
	{
		da=GetData(A,A->length-i);
		InsertC(C,da,k++);
		i--;
	}
	while(j)
	{
		db=GetData(B,B->length-j);
		InsertC(C,db,k++);
		j--;
	}
	OutPutC(C);
}

//-----------其余函数-----------

int InitList(NList L)
{
	if(!(L->data=(Data*)malloc(LIST_INIT_SIZE*sizeof(Data))))
	{
		exit(OVERFLOW);
	}
	L->length=0;
	L->listsize=LIST_INIT_SIZE;
	return TRUE;
}

int InputData(NList L,int n)
{
	Data *newbase;
	printf("输入集合中的元素(递增输入):");
	for(;n>0;n--)
	{
		if(L->length>=L->listsize)
		{
			if(!(newbase=(Data*)realloc(L->data,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(Data))))
			{
				L->data=newbase;
				L->listsize+=LISTINCREMENT;
			}
		}
		scanf("%d",&L->data[L->length++]);
		//printf("%d\n",L->length);
	}
	return TRUE;
}

Data GetData(NList L,int n)
{
	if(n<0||n>L->length-1)
	{
		exit(OVERFLOW);
	}
	return L->data[n];
}

int Compare(Data a,Data b)
{
	if(a<=b)
	{
		return 1;
	}
	return 0;
}

int InsertC(NList L,Data d,int k)
{
	Data *newbase;
	if(L->length>=L->listsize)
	{
		if(!(newbase=(Data*)realloc(L->data,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(Data))))
		{
			L->data=newbase;
			L->listsize+=LISTINCREMENT;
		}
	}
	L->data[k]=d;
	L->length++;
	return TRUE;
}

void OutPutC(NList L)
{
	int i=0;
	printf("C:");
	for(;i<L->length;i++)
	{
		printf("%d ",L->data[i]);
	}
	printf("\n");
	getchar();
	getchar();
}


 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值