///为了方便阅读,我直接把注释写在了程序里,如果发现我写的有问题,欢迎各位巨佬指导。
#include<iostream>
using namespace std;
typedef int elemtype;///elemtype就是线性表中的元素类型
///我们暂时把类型设为int
const int maxsize=100;///startsize就是线性表的大小
const int nstep=10;
struct mylist
{
elemtype *node;///线性表中的数据
int nsize;///线性表的大小
int nlength;///线性表的长度
};
void initlist(mylist &l)//初始化线性表
{
l.node=new elemtype[maxsize];///开辟空间
///初始状态没有元素,,大小nsize和长度nlength都赋值为0
l.nsize=0;
l.nlength=0;
}
void dellist(mylist &l)//删除已有的线性表
{
l.nsize=0;
l.nlength=0;
delete []l.node;///删除内存。记住,最好delete后面加上[]
l.node=NULL;///保险,好习惯
}
void clearlist(mylist &l)//清空线性表
{
l.nlength=0;
delete[] l.node;
l.nsize=0;
l.node=new elemtype[maxsize];
}
bool islistempty(mylist l)//判断线性表是不是空的
{
return l.nlength;
/*
if(l.nlength==0)return 0;
else return 1;
*/
}
int listlength(mylist l)//返回线性表的长度
{
return l.nlength;
}
int getelem(mylist l,int x,elemtype &e)//e返回下标为x的元素的值
{
if(islistempty(l)==0)
return -1;///如果线性表是空的,就返回-1
if(x<1||x>l.nlength)
return -2;///如果所求的位置不在线性表内就返回-2
e=l.node[x-1];
return 1;
}
int elemloc(mylist l,int x)//求某个元素值对应的位置,直接返回下标
{
for(int i=0; i<l.nlength; i++)
{
if(l.node[i]==x)
return i;
}
return -1;
}
int priorelem(mylist l,elemtype x,elemtype &pre)//pre返回元素值为x元素的前驱元素
{
int location=elemloc(l,x);
if(location==-1)
return -2;///如果元素x不在线性表内,返回-2
if(location==0)
return -1;///如果元素的位置是第一个,没有前驱元素,返回-1
pre=l.node[location-1];
return 1;
}
int nextelem(mylist l,elemtype x,elemtype &next)//next返回元素值为x元素的后继元素
{
int location=elemloc(l,x);
if(location==-1)
return -2;///如果元素x不在线性表内,返回-2
if(location==l.nlength-1)
return -1;///如果元素的位置是最后一个,没有后继元素,返回-1
next=l.node[location+1];
return 1;
}
int listinsert(mylist &l,elemtype x,int loc)//在第loc位插入元素x
{
if(loc<1||loc>l.nlength)
return 0;///如果插入的位置不在线性表内,则返回0
if(l.nlength==l.nsize)///如果超过了最大长度,则要开辟新的内存空间
{
elemtype *temp=new elemtype[l.nsize];
for(int i=0; i<l.nlength; i++)
temp[i]=l.node[i];
delete[] l.node;
l.node=new elemtype[l.nsize+nstep];
for(int i=0;i<l.nsize;i++)
{
l.node[i]=temp[i];
}
}
for(int i=l.nlength;i>=loc;i--)
{
l.node[i]=l.node[i-1];
}
l.node[loc-1]=x;
l.nlength++;///插入之后记得把长度加一
return 1;
}
int listdelete(mylist &l,int loc)//删除第loc位置的元素
{
if(loc<1||loc>l.nlength)
return 0;///如果删除的位置不在线性表内,则返回0
for(int i=loc-1;i<l.nlength-1;i++)
{
l.node[i]=l.node[i+1];
}
l.nlength--;///删除之后记得把长度减一
return 1;
}
///type为0表示删除第一个,为1表示全删
int listdeletedata(mylist &l,elemtype x,int type)//删除元素值为x的元素
{
int flag=0;
for(int i=0;i<l.nlength;i++)
{
if(l.node[i]==x)
{
flag=1;
listdelete(l,i+1);
i--;///这个是重点,非常容易出错。
if(type==0)return 1;///return 1表示有元素x,return 0表示没有元素x
}
}
return flag;
/*if(flag==0)
return 0;
else
return 1;
*/
}
/*
关于线性表的连接有很多种,最基本的就是直接首尾相连,还有就是求A∪B
先省略这一步的实现
void listconnect(mylist l1,mylist l2,&mylist l)
*/
void scan(mylist &l,int n)//输入n个元素
{
l.nlength=n;
for(int i=0;i<n;i++)
{
cin>>l.node[i];
}
}
void print(mylist l)//输出线性表中所有的元素
{
for(int i=0;i<l.nlength;i++)
cout<<l.node[i]<<' ';
cout<<endl;
}
int main()
{
elemtype pre,next;
mylist List;
initlist(List);
scan(List,5);///暂且定为五个元素{1,2,3,4,5}
print(List);///0
listinsert(List,6,3);///1
print(List);
listdelete(List,4);///2
print(List);
listdeletedata(List,6,0);///3
print(List);
listinsert(List,5,4);///4
print(List);
listdeletedata(List,5,1);///5
print(List);
priorelem(List,2,pre);///6
nextelem(List,2,next);///7
cout<<pre<<endl;
cout<<next<<endl;
/*
至于为什么好多函数是int类型
是为了遇到一些不存在或者超出范围时的状况时,
可以判断出来。
*/
return 0;
}