将来的你一定会感谢现在努力学习的你!
经过一个下午的折腾和鼓捣,终于成功的将数据结构(严蔚敏版)的顺序表给调试好了,我测了大量的数据都通过!如有不合适的地方还请路过的大佬能指示一下,我在此先深深表示一下感谢!
不废话了,我这个代码写的非常详细!大家看代码学习,不懂的可以留言!
最后希望大家都能写好基本的数据结构!
代码如下:
#include<iostream>
#include<algorithm>
#include<string.h>
#define MAXSIZE 100 //顺序表可能达到的最大长度
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct{
ElemType *elem; //存储空间的基地址,类似数组的首地址
int length; //当前长度
}SqList; //顺序表的结构类型为SqList
//顺序表的初始化
Status InitList(SqList &L)
{
//构造一个空的顺序表L
L.elem = new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
if(!L.elem)
return 0; //存储分配失败退出
L.length = 0; //空表长度为0
return 1;
}
//顺序表的创建
Status CreateList(SqList &L)
{
printf("请您输入想要创建的顺序表的元素的个数:\n");
scanf("%d",&L.length);
printf("请输入你想要创建的顺序表:\n");
for(int i=0;i<L.length;i++)
scanf("%d",&L.elem[i]);
}
//顺序表的取值
Status GetElem(SqList L,int i,ElemType &e)
{
if(i<1 || i>L.length) //判断i值是否合理,如果不合理,返回0
return 0;
e = L.elem[i-1]; //elem[i-1]单元存储第i个数据元素
return 1;
}
//顺序表的查找
Status LocateElem(SqList L,ElemType e)
{
//在顺序表L中查找值为e的数据元素,返回其序号
for(int i=0;i<L.length;i++)
{
if(L.elem[i] == e)
return i+1; //查找成功,返回序号i+1
}
return 0;
}
//顺序表的插入
Status ListInsert(SqList &L,int i,ElemType e)
{
//在顺序表L中第i个位置插入新的元素e,i值的合法范围是1<=i<=L.length+1
if((i<1) || (i>L.length+1))
return 0; //i值不合法
if(L.length == MAXSIZE)
return 0; //当前的存储空间已经满了
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 1;
}
//顺序表的删除
Status ListDelete(SqList &L,int i)
{
//在顺序表L中删除第i个元素,i值的合法范围是1<=i<=L.length
if((i<1) || (i>L.length))
return 0; //i值不合法
for(int j=i;j<=L.length-1;j++)
L.elem[j-1] = L.elem[j]; //被删除元素之后的元素前移
L.length--; //表长减1
return 1;
}
int main()
{
int m,n;
SqList L;
InitList(L);
CreateList(L);
printf("请输入你要取值的位置和一个数:\n");
scanf("%d%d",&m,&n);
GetElem(L,m,n);
if(GetElem(L,m,n))
{
printf("该位置的值已经被取出,取出的值是:\n");
printf("%d\n",n);
}
else
{
printf("取值位置输入有错误,拜拜!\n");
}
printf("请输入你要查找的值:\n");
scanf("%d",&m);
LocateElem(L,m);
if(LocateElem(L,m))
{
printf("你想要查找的值在线性表的位置如下:\n");
printf("%d\n",LocateElem(L,m));
}
else
{
printf("你输入的值在线性表中没有!\n");
}
printf("请输入你要插入的位置和元素的值:\n");
scanf("%d%d",&m,&n);
ListInsert(L,m,n);
if(ListInsert(L,m,n))
printf("插入成功!\n");
else
printf("插入失败!\n");
//下面注释掉的是为了判断执行上述插入之后取值是否仍能正常运行
/*scanf("%d%d",&m,&n);
GetElem(L,m,n);
printf("%d\n",n);*/
printf("请输入你想要在顺序表中删除的第i个位置:\n");
scanf("%d",&n);
ListDelete(L,n);
if(ListDelete(L,n))
{
printf("成功删除!\n");
}
else
printf("没有成功删除!\n");
//下面的是为了判断执行上述删除之后取值是否仍能正常运行
printf("请输入你要取值的位置和一个数:\n");
scanf("%d%d",&m,&n);
GetElem(L,m,n);
if(GetElem(L,m,n))
{
printf("该位置的值已经被取出,取出的值是:\n");
printf("%d\n",n);
}
else
{
printf("取值位置输入有错误,拜拜!\n");
}
printf("表的最终长度是%d\n",L.length); //最后输出一下线性表的长度
return 0;
}
运行结果: