- CreateList(SqList &L,int n) :创建长度为n的顺序表L—— 时间复杂度:O(n)
- InitList(SqList &L) :初始化顺序表L——时间复杂度:O(1)
- InsertList(SqList &L,int i,ElemType e) :在位置i处插入元素e ——时间复杂度:O(n)
- ListDelete(SqList &L,int i):删除位置i处元素——时间复杂度:O(n)
- LocateElem(SqList L,ElemType e) :返回顺序表L中第一个等于e的元素的位置——时间复杂度:O(n)
- GetElem(SqList L, int i, ElemType &e):根据指定的位置序号i,获取顺序表L中第i个数据元素的值——时间复杂度:O(1)
- Reverse(SqList &L) : 将原顺序表L直接倒置。
- PrintList(SqList L):遍历顺序表L,并输出。
完整的实现代码(包括算法步骤和代码注释)
//******************************数据结构-顺序表中基本操作的实现******************************//
#include<stdio.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
//------顺序表的存储结构------//
#define MAXSIZE 100 //顺序表可能达到的最大长度
typedef struct
{
ElemType *elem; //或ElemType elem[MAXSIZE] 存储空间的基地址
int length; //当前长度
}SqList; //顺序表的结构类型为SqList
//------顺序表的初始化------//
//-----【算法步骤】 -----//
//1.为顺序表 L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址。
//2.将表的当前长度设为0。
bool InitList(SqList &L)
{
//构造一个空的顺序表L
L.elem=new int[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
if(!L.elem) return false; //存储分配失败退出
L.length=0; //空表长度为0
return true;
}
//------顺序表初始化前n个数据------//
bool CreateList(SqList &L,int n)
{
if(n<0||n>MAXSIZE) return false; //n值不合法
for(int i=0; i<n; i++){
scanf("%d",&L.elem[i]);
L.length++;
}
return true;
}
//------顺序表的插入------//
//-----【算法步骤】 -----//
//1.判断插入位置i是否合法(i值的合法范围是1<=i<=n+1),若不合法则返回ERROR。
//2.判断顺序表的存储空间是否已满,若满则返回ERROR。
//3.将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置(i=n+1时无需移动)。
//4.将要插入的新元素e放入到第i个位置。
//5.表长加1。
Status ListInsert(SqList &L, int i, int e)
{
//在顺序表L中第i个位置插入新的元素e,i值的合法范围是1<=i<=L.length+1
if(i<1||(i>L.length+1)) return ERROR; //i值不合法
if(L.length==MAXSIZE) return ERROR; //当前存储空间已满
for(int j=L.length-1; j>=i-1; j--)
L.elem[j+1]=L.elem[j]; //插入位置及之后的元素后移
L.elem[i-1]=e; //将新元素e放入第i个位置
++L.length; //表长加1
return OK;
}
//------顺序表的删除------//
//-----【算法步骤】 -----//
//1.判断删除位置i是否合法(i值的合法范围是1<=i<=n),若不合法则返回ERROR。
//2.将第i+1个至第n个的元素依次向前移动一个位置(i=n时无需移动)。
//3.表长减1。
Status ListDelete(SqList &L,int i)
{
//在顺序表L中删除第i个元素,i值的合法范围是1<=i<=L.length
if(i<1||(i>L.length)) return ERROR; //i值不合法
for(int j=i; j<=L.length-1; j++)
L.elem[j-1]=L.elem[j]; //被删除元素之后的元素前移
--L.length; //表长减1
return OK;
}
//------顺序表的查找(按值查找)------//
//-----【算法步骤】 -----//
//1.从第一个元素起,依次和e相比较,若找到与e相等的元素L.elem[i],则查找成功,返回该元素的序号i+1。
//2.若查遍整个顺序表都没有找到,则查找失败,返回0。
int LocateElem(SqList L, int e)
{
//在顺序表L中查找值为e的数据元素,返回其序号。
for(int i=0; i<L.length;i++)
if(L.elem[i]==e) return i+1; //查找成功,返回序号i+1。
return 0; //查找失败,返回0。
}
//------顺序表L的倒置------//
void ReverseList(SqList &L)
{
//顺序表L的逆置
for(int i=0;i<L.length/2;i++) //
{
//交换数据
int temp=L.elem[i];
L.elem[i]=L.elem[L.length-1-i];
L.elem[L.length-1-i]=temp;
}
}
//------输出打印顺序表 按位置从小到大输出顺序表所有元素------//
void PrintList(SqList L)
{
printf("当前顺序表中所有元素为:");
for(int i=0; i<L.length; i++)
{
printf("%d ",L.elem[i]);
}
printf("\n");
}
//------创建顺序表函数------//
void Create(SqList &L)
{
int n;
bool flag;
L.length=0;
printf("请输入要创建的顺序表的长度:");
scanf("%d",&n);
printf("请输入依次输入%d个数(空格隔开):",n);
flag=CreateList(L,n);
if(flag){
printf("顺序表L创建成功!\n");
PrintList(L);
}
else
printf("输入长度不合法!\n");
}
//------插入顺序表函数------//
void Insert(SqList &L)
{
int place;
int e;
bool flag;
printf("请输入要插入的位置(从1开始)及元素:");
scanf("%d%d",&place,&e);
flag=ListInsert(L,place,e);
if(flag)
{
printf("插入成功!\n");
PrintList(L);
}
}
//------删除顺序表函数------//
void Delete(SqList &L)
{
int place;
bool flag;
printf("请输入要删除的位置(从1开始):");
scanf("%d",&place);
flag=ListDelete(L,place);
if(flag)
{
printf("删除成功!\n");
PrintList(L);
}
}
//------查找顺序表函数------//
void Search(SqList L)
{
int e,flag;
printf("请输入要查找的值:");
scanf("%d",&e);
flag=LocateElem(L,e);
if(flag)
{
printf("该元素的位置为:%d\n",flag);
printf("查找成功!\n");
}
else
printf("未查找到该元素!");
}
//------倒置顺序表函数------//
void Reverse(SqList L)
{
ReverseList(L);
printf("顺序表L倒置后为:");
for(int i=0; i<L.length; i++)
{
printf("%d ",L.elem[i]);
}
}
//菜单
void Menu()
{
printf("\n|*|---------- 1.创建顺序表L中的数据元素 ----------|*|\n");
printf("|*|---------- 2.在顺序表L中插入数据元素 ----------|*|\n");
printf("|*|---------- 3.在顺序表L中删除数据元素 ----------|*|\n");
printf("|*|---------- 4.查找顺序表L中的数据元素 ----------|*|\n");
printf("|*|---------- 5.倒置顺序表L中的数据元素 ----------|*|\n");
printf("|*|---------- 6.打印顺序表L中的数据元素 ----------|*|\n");
printf("|*|---------- 7.退出程序 ----------|*|\n");
}
//------创建主函数------//
int main()
{
SqList L;
int choice;
InitList(L);
while(1)
{
Menu();
printf("请输入菜单序号:");
scanf("%d",&choice);
switch(choice)
{
case 1:Create(L); break;
case 2:Insert(L); break;
case 3:Delete(L); break;
case 4:Search(L); break;
case 5:Reverse(L); break;
case 6:PrintList(L); break;
}
if(choice==7) break;
}
}
运行结果:
|*|---------- 1.创建顺序表L中的数据元素 ----------|*|
|*|---------- 2.在顺序表L中插入数据元素 ----------|*|
|*|---------- 3.在顺序表L中删除数据元素 ----------|*|
|*|---------- 4.查找顺序表L中的数据元素 ----------|*|
|*|---------- 5.倒置顺序表L中的数据元素 ----------|*|
|*|---------- 6.打印顺序表L中的数据元素 ----------|*|
|*|---------- 7.退出程序 ----------|*|
请输入菜单序号:1
请输入要创建的顺序表的长度:3
请输入依次输入3个数(空格隔开):1 2 3
顺序表L创建成功!
当前顺序表中所有元素为:1 2 3
|*|---------- 1.创建顺序表L中的数据元素 ----------|*|
|*|---------- 2.在顺序表L中插入数据元素 ----------|*|
|*|---------- 3.在顺序表L中删除数据元素 ----------|*|
|*|---------- 4.查找顺序表L中的数据元素 ----------|*|
|*|---------- 5.倒置顺序表L中的数据元素 ----------|*|
|*|---------- 6.打印顺序表L中的数据元素 ----------|*|
|*|---------- 7.退出程序 ----------|*|
请输入菜单序号:2
请输入要插入的位置(从1开始)及元素:2 4
插入成功!
当前顺序表中所有元素为:1 4 2 3
|*|---------- 1.创建顺序表L中的数据元素 ----------|*|
|*|---------- 2.在顺序表L中插入数据元素 ----------|*|
|*|---------- 3.在顺序表L中删除数据元素 ----------|*|
|*|---------- 4.查找顺序表L中的数据元素 ----------|*|
|*|---------- 5.倒置顺序表L中的数据元素 ----------|*|
|*|---------- 6.打印顺序表L中的数据元素 ----------|*|
|*|---------- 7.退出程序 ----------|*|
请输入菜单序号:3
请输入要删除的位置(从1开始):4
删除成功!
当前顺序表中所有元素为:1 4 2
|*|---------- 1.创建顺序表L中的数据元素 ----------|*|
|*|---------- 2.在顺序表L中插入数据元素 ----------|*|
|*|---------- 3.在顺序表L中删除数据元素 ----------|*|
|*|---------- 4.查找顺序表L中的数据元素 ----------|*|
|*|---------- 5.倒置顺序表L中的数据元素 ----------|*|
|*|---------- 6.打印顺序表L中的数据元素 ----------|*|
|*|---------- 7.退出程序 ----------|*|
请输入菜单序号:4
请输入要查找的值:4
该元素的位置为:2
查找成功!
|*|---------- 1.创建顺序表L中的数据元素 ----------|*|
|*|---------- 2.在顺序表L中插入数据元素 ----------|*|
|*|---------- 3.在顺序表L中删除数据元素 ----------|*|
|*|---------- 4.查找顺序表L中的数据元素 ----------|*|
|*|---------- 5.倒置顺序表L中的数据元素 ----------|*|
|*|---------- 6.打印顺序表L中的数据元素 ----------|*|
|*|---------- 7.退出程序 ----------|*|
请输入菜单序号:5
顺序表L倒置后为:2 4 1
|*|---------- 1.创建顺序表L中的数据元素 ----------|*|
|*|---------- 2.在顺序表L中插入数据元素 ----------|*|
|*|---------- 3.在顺序表L中删除数据元素 ----------|*|
|*|---------- 4.查找顺序表L中的数据元素 ----------|*|
|*|---------- 5.倒置顺序表L中的数据元素 ----------|*|
|*|---------- 6.打印顺序表L中的数据元素 ----------|*|
|*|---------- 7.退出程序 ----------|*|
请输入菜单序号:6
当前顺序表中所有元素为:2 4 1
|*|---------- 1.创建顺序表L中的数据元素 ----------|*|
|*|---------- 2.在顺序表L中插入数据元素 ----------|*|
|*|---------- 3.在顺序表L中删除数据元素 ----------|*|
|*|---------- 4.查找顺序表L中的数据元素 ----------|*|
|*|---------- 5.倒置顺序表L中的数据元素 ----------|*|
|*|---------- 6.打印顺序表L中的数据元素 ----------|*|
|*|---------- 7.退出程序 ----------|*|
请输入菜单序号:7
--------------------------------
Process exited after 58.64 seconds with return value 0
请按任意键继续. . .