顺序表是线性表的顺序表示与实现,根据线性表抽象数据类型(ADT),完成顺序表的实现。
ADT List{
数据对象:D={ai|ai∈ElemSet,i=1,2,…n,n≥0}
数据关系:R={<ai-1,ai>| ai-1,ai ∈D,i=2,…,n}
基本操作:
InitList(&L):构造一个空的线性表L
……
ListInsert(&L,I,e):在L中第i个位置之前插入新的数据元素e,L的长度+1
}
- 分文件实现,
- SqList.h 顺序表的定义
- SqList.cpp顺序表的实现
- main.cpp 主程序,完成演示
代码部分:
1、 SqList.h 顺序表的定义
/* SqList.h 定义顺序表 */
#define MAXSIZE 100 // 定义最大长度
typedef int ElemType; // 定义元素类型为整型
// 顺序表结构体定义
typedef struct {
ElemType *elem;
int length; // 表当前长度
} SqList;
/* 说明顺序表基本操作函数 */
//初始化顺序表, 分配空间,顺序表长度置0
int InitSqList(SqList &L);
//判断顺序表是否满?
int IsFullSqList(SqList L);
//判断是否为空
int IsEmptySqList(SqList L);
//取值
int GetElemSqList(SqList L, int i, ElemType &e);
//插入元素
int InsertSqList(SqList &L, int i, ElemType e);
//删除元素, 删除第i个位置元素,e返回,成功返回0
int DeleteSqList(SqList &L, int i, ElemType *e);
//遍历
void TraverseSqList(SqList L);
2、 SqList.cpp顺序表的实现
/* SqList.cpp 顺序表实现 */
#include "SqList.h"
#include <iostream>
using namespace std;
/* 对各个操作函数进行定义 */
// 1、初始化顺序表, 分配空间,顺序表长度置0
int InitSqList(SqList &L)
{
// 动态分配内存空间给顺序表的元素数组
L.elem = new ElemType[MAXSIZE];
if(!L.elem)
{
cout<<"Error[10000], 内存分配失败!\n";
return 10000; // 返回10000表示内存分配失败
}
L.length = 0; // 将顺序表的长度初始化为0
return 0; // 返回0表示初始化成功
}
// 2、 判断顺序表是否满?
int IsFullSqList(SqList L)
{
// 顺序表长度大于等于数组长度,返回值1代表顺序表已满
if(L.length == MAXSIZE)
{
return 1;
}
return 0; // 返回值0未满
}
// 3、判断是否为空
int IsEmptySqList(SqList L)
{
// 如果顺序表的长度等于0,则返回1表示为空;否则返回0表示非空
return L.length == 0 ? 1 : 0;
}
// 4、取值
int GetElemSqList(SqList L, int i, ElemType &e)
{
// 如果i小于1或大于L.length,则输出错误信息并返回错误码10004
if(i<1 || i>L.length)
{
cout<<"Error[10004],i超出顺序表范围!"<<endl;
return 10004;
}
e = L.elem[i-1]; // 将顺序表中第i个元素的值赋给变量e
return 0; // 成功返回值0
}
// 5、插入元素(insert)
int InsertSqList(SqList &L, int i, ElemType e)
{
int index;
// 首先判断顺序表是否满?满了返回值10001
if(IsFullSqList(L))
{
cout<<"Error[10001], 顺序表已满!"<<endl;
return 10001;
}
/* 继续操作
判断位置i的合法性,i大于等于1,小于等于L.length+1
如果位置i不合法,则输出错误信息并返回值10002 */
if(i<1 || i>L.length+1)
{
cout<<"Error[10002], 位置i不合法,应i大于等于1,小于等于L.length+1"
<<endl;
return 10002;
}
// 继续
// 将位置i后所有元素后移一位
for(index = L.length;index >= i;index--)
{
L.elem[index] = L.elem[index-1]; // 后移
}
L.elem[index] = e; // 将新元素e插入到位置i处
L.length++; // 顺序表长度加1
return 0; // 成功insert
}
// 6、删除元素, 删除第i个位置元素,e返回,成功返回0
int DeleteSqList(SqList &L, int i, ElemType *e)
{
int index;
// 判断顺序表是否为空,空返回值10003
if(IsEmptySqList(L))
{
cout<<"Error[10003], 顺序表为空!"<<endl;
return 10003;
}
// 判断位置i合法性,不合法返回值10004
if(i<1 || i>L.length)
{
cout<<"Error[10004],位置i超出范围!"<<endl;
return 10004;
}
// 将位置i的元素赋值给指针变量e
*e = L.elem[i-1];
// 移动元素
for(index = i-1;index<L.length;index++)
{
L.elem[index] = L.elem[index+1];
}
L.length--; // 顺序表长度减1
return 0; // 成功 delete
}
// 7、遍历
void TraverseSqList(SqList L)
{
int i;
for(i=0;i<L.length;i++)
{
cout<<"L.elem["<<i+1<<"] = "<<L.elem[i]<<endl;
}
}
3、main.cpp主程序,完成演示
#include "SqList.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int cmd,i;
SqList L;
ElemType e;
do
{
cout<<"-----------顺序表演示程序---------\n";
cout<<" 1. 初始化\n"
<<" 2. 插入元素\n"
<<" 3. 删除元素\n"
<<" 4. 遍历顺序表\n"
<<" .....\n"
<<" 0.退出\n"
<<"请选择(0~13):";
cin>>cmd;
switch(cmd)
{
case 1:
if(!InitSqList(L))
{
cout<<"顺序表已初始化..."<<endl;
}
else
{
cout<<"顺序表初始化失败,程序将退出!"<<endl;
return 1;
}
break;
case 2:
cout<<"请分别输入插入元素的位置i,值e:";
cin>>i>>e;
if(!InsertSqList(L,i,e))
{
cout<<"元素e="<<e<<",已插入位置i="<<i<<endl;
}
break;
case 3:
cout<<"请输入删除元素的位置i:";
cin>>i;
if(!DeleteSqList(L,i,&e))
{
cout<<"位置i="<<i<<",元素e="<<e<<"已删除!"<<endl;
}
break;
case 4:
cout << "遍历顺序表:" << endl;
TraverseSqList(L);
break;
}
}while(cmd!=0);
return 0;
}
运行结果:
1、初始化
2、插入元素
3、删除元素