数据结构之顺序表(C++版)
#include <iostream>
#include <stdlib.h>
#define MAXLISTSIZE 100 //预设的存储空间最大容量
using namespace std;
typedef string ElemType;
typedef struct{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //允许的最大存储容量(以sizeof(ElemType)为单位)
}SqList; //俗称顺序表
void InitList(SqList &L);
void LocateElem(SqList L);
void ListInsert(SqList &L);
void ListDelete(SqList &L);
void DestroyList(SqList &L);
void ListLength(SqList L);
void ListEmpty(SqList L);
void GetElem(SqList L);
void MergeList_Sq();
int main(void)
{
SqList L;
int z;
cout << "+---------------------------+" << '\n';
cout << "|----------顺序表-----------|" << '\n';
cout << "+---------------------------+" << '\n';
cout << "提示:为保证您的操作得到保存,请按正常顺序退出系统^_^" << '\n';
do
{
cout << '\n' << '\t' << '\t' << '\t' <<"--------------------------------" << '\n';
cout << '\t' << '\t' << '\t' <<"+ 主菜单 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+--------------------------------" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [1]----顺序表初始化 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [2]----顺序表的定位 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [3]----顺序表的插入 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [4]----顺序表的删除 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [5]----顺序表的销毁 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [6]----顺序表求表长 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [7]----顺序表的判空 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [8]----顺序表的存取 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [9]----顺序表的合并 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [0]----退出系统 |" << '\n';
cout << '\t' << '\t' << '\t' <<"--------------------------------" << '\n';
cout << "请输入您的选择:";
cin >> z;
switch(z)
{
case 0 : break;
case 1 : InitList(L);break;
case 2 : LocateElem(L);break;
case 3 : ListInsert(L);break;
case 4 : ListDelete(L);break;
case 5 : DestroyList(L);break;
case 6 : ListLength(L);break;
case 7 : ListEmpty(L);break;
case 8 : GetElem(L);break;
case 9 : MergeList_Sq();break;
default:cout << "无效选项!" << '\n';system("pause");
}
}
while(z!= 0);
}
//顺序表的初始化赋值
void InitList(SqList &L)
{
int j;
int maxsize;
cout << "请输入顺序表的最大长度: ";
cin >> maxsize;
if(maxsize == 0)
maxsize = MAXLISTSIZE;
L.elem = new ElemType[maxsize];
if(!L.elem) exit(1); //储存分配失败
cout << "请输入顺序表的长度: ";
cin >> L.length;
L.listsize = maxsize; //该顺序表可以存储元素的最大容量
cout << "请输入顺序表的元素: ";
for (j = 0; j < L.length; j++)
{
cin >> L.elem[j];
}
system("pause"); //任意键继续
}//InitList
void LocateElem(SqList L)
{
ElemType e;
int j;
//在顺序表L中查找第一个值与e相等的元素,若存在输出该元素的位置,若不存在,输出所找的元素不存在
j = 0; //j的初值为第一个元素的位序
cout << "请输入要查找的元素:";
cin >> e;
while(j < L.length && L.elem[j] != e)
++j; //依次进行判定
if(j < L.length) cout << "所找元素的位置为:" << j + 1; //找到满足判定条件的数据元素为第j个元素
else cout << "所找的元素不存在"; //该线性表中不存在满足判定的数据元素
cout << '\n';
system("pause");
}//LocateElem
void ListInsert(SqList &L)
{
int j;
int pos;
ElemType e;
cout << "请输入所要插入的位置及元素:";
cin >> pos >>e;
//若存储空间不满且1 <= pos <= Listlength(L) + 1,则在顺序表L的第pos个元素之前插入元素e,输出插入元素后的顺序表
if(pos < 1 || pos > L.length + 1)
{
cout << "插入位置不合法" << '\n'; //插入位置不合法
system("pause");
return;
}
if(L.length >= L.listsize)
{
cout << "当前存储空间已满,无法插入,请重新选择顺序表功能" << '\n'; //当前存储空间已满,无法插入
system("pause");
return;
}
for(j = L.length - 1; j >= pos - 1; --j)
L.elem[j + 1] = L.elem[j]; //插入位置之后的元素右移
L.elem[pos - 1] = e; //插入e
++L.length; //表长增1
cout << "插入后的顺序表:";
for (j = 0; j < L.length; j++)
{
cout << L.elem[j] << ' ';
}
cout << '\n';
system("pause");
}//ListInsert
void ListDelete(SqList &L)
{
int j;
int pos;
cout << "请输入所要删除元素的位置: ";
cin >> pos;
//若1 <= pos <= Listlength(L).则在顺序表L中删除第pos个元素,输出删除后的顺序表
if(pos < 1 || pos > L.length)
{
cout << "删除位置不合法\n"; //删除位置不合法
system("pause");
return;
}
for(j = pos; j < L.length; ++j)
L.elem[j - 1] = L.elem[j]; ///被删除元素之后的元素左移
--L.length; //表长减1
cout << "删除后的顺序表:";
for (j = 0; j < L.length; j++)
{
cout << L.elem[j] << ' ';
}
cout << '\n';
system("pause");
}//ListDelete
void DestroyList(SqList &L)
{
//释放顺序表L所占存储空间
delete[] L.elem;
L.listsize = 0;
L.length = 0;
cout << "顺序表已销毁" << '\n';
system("pause");
}//DestroyList_Sq
void ListLength(SqList L)
{
cout << "表长为:" << L.length << '\n';
system("pause");
}
void ListEmpty(SqList L)
{
if(L.length == 0)
cout << "该顺序表为空" << '\n';
else
cout << "该顺序表不为空" << '\n';
system("pause");
}
void GetElem(SqList L)
{
int j;
cout << "取出顺序表元素的位置:";
cin >> j;
if(j < 1 || j > L.length)
{
cout << "取出位置不合法" << '\n'; //取出位置不合法
system("pause");
return;
}
cout << "取出的元素为:" << L.elem[j - 1] << '\n';
system("pause");
}
void MergeList_Sq()
{
//输入有序顺序表La,Lb.归并为Lc.输出Lc
SqList La; SqList Lb; SqList Lc;
int i, j, k; int maxsize;
maxsize = MAXLISTSIZE;
La.elem = new ElemType[maxsize];
Lb.elem = new ElemType[maxsize];
Lc.elem = new ElemType[maxsize];
if(!La.elem || !Lb.elem || !Lc.elem) exit(1); //储存分配失败
cout << "请输入顺序表La的长度: ";
cin >> La.length;
La.listsize = maxsize; //该顺序表可以存储元素的最大容量
cout << "请输入顺序表的元素: ";
for (j = 0; j < La.length; j++)
{
cin >> La.elem[j];
}
cout << "请输入顺序表Lb的长度: ";
cin >> Lb.length;
Lb.listsize = maxsize; //该顺序表可以存储元素的最大容量
cout << "请输入顺序表的元素: ";
for (j = 0; j < Lb.length; j++)
{
cin >> Lb.elem[j];
}
Lc.listsize = Lc.length = La.length + Lb.length;
for(i = 0, j = 0, k = 0; i < La.length && j < Lb.length; k++)
if(La.elem[i] <= Lb.elem[j])
{
Lc.elem[k] = La.elem[i];
i++;
}
else
{
Lc.elem[k] = Lb.elem[j];
j++;
}
while(i < La.length)
{
Lc.elem[k] = La.elem[i];
i++, k++;
} //插入La的剩余元素
while(j < Lb.length)
{
Lc.elem[k] = Lb.elem[j];
j++, k++;
} //插入Lb的剩余元素
cout << "合并后的顺序表Lc为:";
for (j = 0; j < Lc.length; j++)
{
cout << Lc.elem[j] << ' ';
}
cout << '\n';
system("pause");
}//MergeList_Sq