#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);
}
1.数据结构--线性表之数组实现
最新推荐文章于 2023-01-24 15:40:26 发布