线性顺序表的定义
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。
线性表的基本操作
1、初始化空的线性表
2、销毁线性表
3、清空线性表
4、判断线性表是否为空
5、得到线性表中元素的个数
6、返回线性表中第i个元素的值
7、定位线性表中某个元素的位置
8、在线性表中执行插入操作
9、在线性表中执行删除操作
线性表代码案例
#include<iostream>
#define MAXSIZE 100
using namespace std;
typedef int ElemType;
typedef struct
{
ElemType* elem;
int length;
}Sqlist;
//顺序表初始化
void InitList_Sq(Sqlist& L)
{
L.elem = new ElemType[MAXSIZE];
if (!L.elem)
{
cout << "顺序表初始化失败" << endl;
}
L.length = 0;
}
//顺序表长度
int ListLength_Sq(Sqlist& L)
{
return L.length;
}
//顺序表是否为空表
bool ListEmpty_Sq(Sqlist& L)
{
if (L.length == 0)
{
return true;
}
else
{
return false;
}
}
//查询元素在顺序表中的位置
int LocateElem_Sq(Sqlist L,ElemType e)
{
for (int i = 0; i < L.length;i++)
{
if (L.elem[i] == e)
{
return i+1;
}
}
return -1;
}
//顺序表的插入
bool ListInsert_Sq(Sqlist& L, int i, ElemType e)
{
if (i<=0 || i>L.length+1)
{
cout << "元素插入位置有误" << endl;
return false;
}
if (L.length == MAXSIZE)
{
cout << "顺序表空间已满" << endl;
return false;
}
for (int j = L.length; j > i; j--)
{
L.elem[j+1] = L.elem[j];
}
L.elem[i-1] = e;
L.length++;
return true;
}
//顺序表的删除
bool ListDelete_Sq(Sqlist& L, int i, ElemType &e)
{
if (i <=0 || i > L.length + 1)
{
cout << "元素删除位置有误" << endl;
return false;
}
if (L.length == 0)
{
cout << "顺序表中没有可删除元素" << endl;
return false;
}
e = L.elem[i-1];
for (int j = i; j <= L.length; j++)
{
L.elem[j - 1] = L.elem[j];
}
L.length--;
return true;
}
//清空线性表
void ClearList_Sq(Sqlist& L)
{
L.length = 0;
}
//销毁线性表
void DeletryList_Sq(Sqlist& L)
{
delete L.elem;
L.elem = NULL;
L.length = 0;
}
//返回第i个元素的值
bool GetElem(Sqlist L, int i,ElemType & e)
{
if (i <= 0 || i > L.length + 1)
{
cout << "输入元素位置有误" << endl;
return false;
}
e = L.elem[i - 1];
return true;
}
//打印线性表
void PrintList_Sq(Sqlist& L)
{
for (int j = 0; j <L.length; j++)
{
cout << L.elem[j] << " ";
}
cout << endl;
}
//顺序表的合并
void Union(Sqlist& La, Sqlist& Lb, ElemType& e)
{
int La_length = ListLength_Sq(La);
while (!ListEmpty_Sq(Lb))
{
ListDelete_Sq(Lb, 1, e);
if (LocateElem_Sq(La, e) == -1)
{
ListInsert_Sq(La, La.length, e);
}
}
ClearList_Sq(Lb);
}
//顺序表的元素转移
void Purge(Sqlist& La, Sqlist& Lb, ElemType& e)
{
InitList_Sq(La);
while (!ListEmpty_Sq(Lb))
{
ListDelete_Sq(Lb, 1, e);
if (LocateElem_Sq(La, e) == -1)
{
ListInsert_Sq(La, La.length, e);
}
}
ClearList_Sq(Lb);
}
//判断两顺序表是否相等
bool Isequal(Sqlist& La, Sqlist& Lb, ElemType& e)
{
int la_length = ListLength_Sq(La);
int lb_length = ListLength_Sq(Lb);
Sqlist Lc;
if (la_length != lb_length)
{
return false;
}
else
{
InitList_Sq(Lc);
for (int i = 1; i <= La.length; i++)
{
GetElem(La, i, e);
ListInsert_Sq(Lc, i, e);
}
for (int j = 1; j <= Lb.length; j++)
{
GetElem(Lb, j, e);
int pos = LocateElem_Sq(Lc, e);
if (pos == 0)
{
return false;
}
else
{
ListDelete_Sq(Lc, j, e);
}
}
if (ListEmpty_Sq(Lc))
{
return true;
}
ClearList_Sq(Lc);
}
}
int main()
{
Sqlist L;
//顺序表的初始化
InitList_Sq(L);
if (ListEmpty_Sq(L))
{
cout << "线性表是空表" << endl;
}
cout << "顺序表的插入" << endl;
for (int i = 1; i <=15; i++)
{
ListInsert_Sq(L, i, i);//顺序表的插入
}
PrintList_Sq(L);//顺序表的打印
cout <<"线性表目前长度为:" << ListLength_Sq(L) << endl;//顺序表长度
cout << "元素的位置为:" << LocateElem_Sq(L, 1) << endl;//顺序表中指定元素的位置
ElemType data;
ListDelete_Sq(L, 2, data);//删除指定位置的元素
cout << "删除的元素为:" << data << endl;
GetElem(L, 2, data);//获取某个位置元素的值
cout << "第2个元素为:" << data << endl;
cout << "顺序表的删除" << endl;
PrintList_Sq(L);//顺序表的打印
ClearList_Sq(L);//清空顺序表
cout << "顺序表的清空" << endl;
PrintList_Sq(L);//顺序表的打印
DeletryList_Sq(L);//顺序表的销毁
system("pause");
return 0;
}