【数据结构-C语言实现】合并有序线性表

#include<stdio.h>
#include<stdlib.h>
#define Status int
#define INIT_SIZE 20
#define LISTINCREMENT 10
#define N 10

//数据类型
typedef struct
{
	int number;
}ElemType;

//顺序表存储结构
typedef struct
{
	ElemType *pstu;
	int Length;
	int Listsize;
}SqList;

//初始化顺序表
Status InitList(SqList &L)
{
	if(!L.pstu)
	{
		L.pstu = (ElemType *)malloc(sizeof(ElemType) * INIT_SIZE);
		if(!L.pstu)
			return 0;
		L.Length = 0;
		L.Listsize = INIT_SIZE;
		return 1;
	}
	return 0;	
}

//插入操作
Status InsertList(SqList &L, int i,ElemType e)
{
	if(i<=0 || i>L.Length+1)
		return 0;
	if(L.Length >= L.Listsize)
	{
		ElemType *q;
		q = (ElemType *)realloc(L.pstu,sizeof(ElemType) * (LISTINCREMENT + INIT_SIZE));
		if(!q)
			return 0;
		L.Listsize = INIT_SIZE + LISTINCREMENT;
		L.pstu = q;
	}
	ElemType *m,*n;
	m = L.pstu+i-1;
	for(n=L.pstu+L.Length-1;n>=m;n--)
	{
		*(n+1) = *n;
	}
	*m = e;
	L.Length++; //长度要更新
	return 1;
}

//删除操作
Status DeleteList(SqList &L,int i,ElemType &e)
{
	if(i<=0 || i>L.Length+1)
		return 0;
	ElemType *m,*n;
	m = L.pstu+i-1;
	e = *m;
	for(n=m;n<L.pstu+L.Length;n++)
	{
		*n = *(n+1);
	}
	L.Length--;
	return 1;
}

//判断是否在表中
Status GetElem(SqList L,int i)
{
	ElemType *m;
	if(i<=0 || i>L.Length)
		return 0;
	m = L.pstu+i-1;
	return (*m).number;
}

//找到位置(逻辑位置)
Status LocateList(SqList L,ElemType e)
{
	int i=0;
	ElemType *m;
	for(m=L.pstu;m<=L.pstu+L.Length-1;m++)
	{
		i++;
		if((*m).number == e.number)  //*****
		{
			return i;
		}
	}
	return 0;
}

//销毁表
Status DestoryList(SqList &L)
{
	if(!L.pstu)
		return 0;
	free(L.pstu);
	L.pstu = NULL;
	L.Length = 0;
	L.Listsize = INIT_SIZE;
	return 1;
}

//合并有序线性表
Status MergeList(SqList La, SqList Lb, SqList &Lc)
{
	ElemType *p1 = La.pstu;
	ElemType *p2 = Lb.pstu;
	ElemType *p3 = Lc.pstu;
	Lc.Listsize = Lc.Length = La.Length + Lb.Length;
	while(p1 < La.pstu+La.Length && p2 < Lb.pstu+Lb.Length)
	{
		if((*p1).number <= (*p2).number)
		{
			*p3++ = *p1++;
		}
		else
		{

			*p3++ = *p2++;
		}
	}
	while(p1<La.pstu+La.Length)
	{
		*p3++ = *p1++;
	}
	while(p2<Lb.pstu+Lb.Length)
	{
		*p3++ = *p2++;
	}
	return 1;
}

//主函数
void main()
{
	SqList La,Lb,Lc;
	ElemType num;
	La.pstu = NULL;
	Lb.pstu = NULL;
	Lc.pstu = NULL;
	InitList(La);
	printf("插入顺序表a\n");
	for(int i=1;i<=3;i++)
	{
		scanf("%d",&num.number);
		InsertList(La,i,num);
	}
	InitList(Lb);
	printf("插入顺序表b\n");
	for(i=1;i<=3;i++)
	{
		scanf("%d",&num.number);
		InsertList(Lb,i,num);
	}
	InitList(Lc);
	printf("顺序表c合并\n");
	MergeList(La,Lb,Lc);
	for(i=1;i<=6;i++)
	{
		printf("The NO.%d is %d\n",i,GetElem(Lc,i));
	}
}
  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南浔Pyer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值