数据结构-顺序表的相关操作(定义、增添、删减、合并)

#include<iostream>
using namespace std;
#define maxSize 100  //定义最大存储容量100

typedef int ElemType;//表明ElemType的数据类型是int
typedef struct
{
	ElemType* elem;//ElemType(int)类型指针
	int length;//当前表的容量长度
	int listsize;//表的最大容量
}Sqlist;//给结构体起名为Sqlist

//顺序表的动态存储函数
bool Storage(Sqlist& L)
{
	L.elem = new ElemType[maxSize];//堆区动态开辟空间
	if (!L.elem)//开辟空间失败
		return false;
	L.length = 0;//初始存储容量为0
	L.listsize = maxSize;//最大存储容量为100
	return true;
}

//顺序表的插入,在顺序表L的第i个元素前插入新的元素e
bool Insert(Sqlist& L, int i, ElemType e)
{
	ElemType* p;
	if (i<1 || i>L.length)// i的合法值为1≤i≤L.length
		return false;
	if (L.length >= L.listsize)//队列满了
		return false;
	ElemType* q = &(L.elem[i - 1]);//q为插入位置
	for (p = &(L.elem[L.length - 1]); p >= q; p--)//将第i个元素及后续元素右移
	{
		*(p + 1) = *p;
	}
	*q = e;//q位置赋值为e
	L.length++;//当前存储容量加1
	return true;
}

//顺序表的删除,删除顺序表L中的第i个元素,并用e返回其值
bool Delete(Sqlist& L, int i, ElemType e)
{
	ElemType* p, * q;
	if (i<1 || i>L.length)// i的合法值为1≤i≤L.length
		return false; 	
	p = &(L.elem[i - 1]);// p为被删除元素的位置
	e = *p;// 被删除元素的值赋给e
	q = &L.elem[L.length - 1];//表尾元素的位置
	for (++p; p <= q; p++)// 将第i+1个元素及后续元素左移
	{
		*(p - 1) = *p;
	}	
	L.length--;//当前存储容量减1                 
	return true;
}

//顺序表的搜索,在顺序表中查找第1个与e值相同的元素的位置
int Locate(Sqlist& L, ElemType e)
{
	int i = 1;
	while (i <= L.length && L.elem[i - 1] != e)//从头遍历
	{
		i++;
	}
	if (i <= L.length)//返回i的值
		return i;
	else
		return 0;
}

//顺序表的合并1,将所有在线性表Lb中但不在La中的数据元素插入到La中
void Union01(Sqlist& La, Sqlist& Lb)
{
	for (int i = 1; i <= Lb.length; i++)//从头遍历
	{
		if (!Locate(La, Lb.elem[i - 1]))//如果在La中找不到相同元素
		{
			La.length++;//La当前存储容量加1
			La.elem[La.length-1] = Lb.elem[i - 1];//在La末尾添加该元素
		}
	}
}

//顺序表的合并2,利用两个线性表LA和LB,LA和LB中的元素按值递增有序排列
//现将LA和LB归并成一个新的线性表LC,且LC中的元素仍按值递增有序排列
void Union02(Sqlist& La, Sqlist& Lb, Sqlist& Lc)
{
	ElemType* pa = La.elem;
	ElemType* pb = Lb.elem;
	ElemType* pc = La.elem;
	ElemType* pa_last = La.elem + La.length - 1;
	ElemType* pb_last = Lb.elem + Lb.length - 1;
	Lc.length = La.length + Lb.length;
	while (pa <= pa_last && pb <= pb_last)
	{
		if (*pa <= *pb)
			*pc++ = *pa++;//相当于*pc=*pa,pc++,pa++
		else
			*pc++ = *pb++;
		while (pa <= pa_last)//将剩余的元素插入Lc中
			*pc++ = *pa++;
		while (pb <= pb_last)
			*pc++ = *pb++;
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值