1.数据结构--线性表之数组实现

#include <iostream>  
using namespace std;

#define MAXSIZE 100 //顺序表可能达到的最大长度  
//函数结果状态  
#define OK 1  
#define OVERFLOW -2  
#define ERROR 0  


typedef int Status;
typedef int ElemType;


typedef struct
{
	ElemType *elem; //存储空间的基地址  
	int length; //当前的长度  
}SqList;


/************************************************************************/
/* 1.顺序表的初始化
(1)为顺序表动态分配一个预定义大小的数组,使elem指向这段空间的基地址。
(2)为表的当前长度设置为0。*/
/************************************************************************/
Status InitList_Sq(SqList &L)
{
	//构造一个空的线性表L  
	L.elem = new ElemType[MAXSIZE];
	if (!L.elem)
		exit(OVERFLOW);
	L.length = 0;
	return OK;
}

/************************************************************************/
/*2. 销毁线性表*/
/************************************************************************/
void DestroyList(SqList &L)
{
	if (L.elem)
		delete[]L.elem; //释放存储空间  
}




/************************************************************************/
/*3. 清空线性表*/
/************************************************************************/
void ClearList(SqList &L)
{
	L.length = 0; //将线性表的长度设置为0  
}




/************************************************************************/
/*4. 求线性表的长度*/
/************************************************************************/
int GetLength(SqList L)
{
	return (L.length);
}




/************************************************************************/
/*5. 判断线性表是否为空*/
/************************************************************************/
int IsEmpty(SqList L)
{
	return L.length ? 0 : 1; //为空返回1,不为空返回0  
}




/************************************************************************/
/*6. 获取线性表L中的某个数据元素的内容*/
/************************************************************************/
int GetElem(SqList L, int i, ElemType &e) //线性表第i个位置的元素的值,结果保存的e中  
{
	if (i < 1 || i > L.length)
		return ERROR;
	e = L.elem[i - 1];
	return OK;
}




/************************************************************************/
/*7. 查找值为e的元素的位置*/
/************************************************************************/
int LocateELem(SqList L, ElemType e)
{
	for (int i = 0; i < L.length; ++i)
		if (L.elem[i] == e) return i + 1;
	return 0;
}




/************************************************************************/
/*8. 在线性表L中第i个数据元素之前插入数据元素e */
/************************************************************************/
Status ListInsert_Sq(SqList &L, int i, ElemType e)
{
	if (i < 1 || i > L.length + 1)
		return ERROR;
	if (L.length == MAXSIZE)
		return ERROR;    //当前存储空间已满    


	for (int k = L.length - 1; k >= i - 1; --k)
		L.elem[k + 1] = L.elem[k];
	L.elem[i - 1] = e;
	++L.length;
	return OK;
}




/************************************************************************/
/*9. 将线性表L中的第i个元素删除 */
/************************************************************************/
Status ListDelete_Sq(SqList &L, int i)
{
	if (i < 1 || i > L.length)
		return ERROR;
	if (IsEmpty(L))
		return ERROR;    //当前表已经为空  


	for (int k = i; k <= L.length - 1; ++k)
		L.elem[k - 1] = L.elem[k];
	--L.length;
	return OK;
}




//打印线性表  
void PrintOut(SqList &L)
{
	int flag = 0; //标记是否是第一项  
	for (int i = 0; i < L.length; ++i)
	{
		if (flag == 0) flag = 1;
		else cout << " ";
		cout << L.elem[i];
	}
	cout << endl;
}


void MergeList_Sq(SqList LA, SqList LB, SqList &LC) //已知顺序有序表LA和LB的元素按照值非递减排列,归并LA和LB得到新的顺序有序表LC,LC的元素也按值非递减排列
{
	ElemType * pa = LA.elem;
	ElemType * pb = LB.elem;


	LC.length = LA.length + LB.length;
	LC.elem = new ElemType[LC.length];


	ElemType * pc = LC.elem;
	ElemType * pa_last = LA.elem + LA.length - 1;
	ElemType * pb_last = LB.elem + LB.length - 1;


	while (pa <= pa_last && pb <= pb_last)
	{
		if (*pa <= *pb) *pc++ = *pa++; //依次“摘取”两个表中值较小的结点插入到LC表的最后
		else *pc++ = *pb++;
	}


	while (pa <= pa_last)
		*pc++ = *pa++;


	while (pb <= pb_last)
		*pc++ = *pb++;
}


int main()
{
	SqList L1, L2;
	InitList_Sq(L1);
	ListInsert_Sq(L1, 1, 1);
	ListInsert_Sq(L1, 2, 2);
	ListInsert_Sq(L1, 3, 3);
	PrintOut(L1);


	InitList_Sq(L2);
	ListInsert_Sq(L2, 1, 1);
	ListInsert_Sq(L2, 2, 5);
	ListInsert_Sq(L2, 3, 7);
	PrintOut(L2);


	SqList L3;
	MergeList_Sq(L1, L2, L3);
	PrintOut(L3);


	DestroyList(L1);
	DestroyList(L2);
	DestroyList(L3);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值