#include<iostream.h>
#include<stdlib.h>
typedef int ElemType;
struct List
{
ElemType *list; //存线性表元素的动态存储空间的指针
int size; //存线性表长度
int MaxSize; //规定list数组的长度
};
//初始化L为空
void InitList(List &L)
{
L.MaxSize=10; //初始化长度
L.list=new ElemType[L.MaxSize]; //动态分配空间
if(L.list==NULL)
{
cout<<"动态储存空间用完,退出运行!"<<endl;
exit(1);
}
L.size = 0; //置线性表长度为0,即为空表
}
//清除L中所有元素
void ClearList(List &L)
{
if(L.list!=NULL)
{
delete []L.list;
L.list=NULL;
}
L.MaxSize=0;
L.size=0;
}
//返回L的长度
int LenthList(List &L)
{
return L.size;
}
//判断L是否为空
bool EmptyList(List &L)
{
return L.size==0;
}
//返回L中第pos个元素的值
ElemType GetList(List &L, int pos)
{
if(pos<1 || pos>L.size)
{
cerr<<"pos值无效!"<<endl;
}
return L.list[pos-1];
}
//遍历输出L中的所以元素
void TraverseList(List &L)
{
for(int i=0; i<L.size; i++)
{
cout<<L.list[i]<<' ';
}
cout<<endl;
}
//从L中查找并返回元素
bool FindList(List &L, ElemType item)
{
for(int i=0; i<L.size; i++)
{
if(L.list[i]==item)
{
item=L.list[i];
return true;
}
}
return false;
}
//修改L中的元素
bool UpdateList(List &L, const ElemType item)
{
for(int i=0; i<L.size; i++)
{
if(L.list[i]==item)
{
L.list[i]=item; //更新
return true;
}
}
return false;
}
//向L中插入元素
bool InsertList(List &L, ElemType item, int pos)
{
//判断pos的值是否合法
if(pos<-1 || pos>L.size+1)
{
cout<<"pos的值不合法!"<<endl;
return false;
}
int i; //循环变量
//判断插入的位置
if(pos==0) //顺序插入
{
for(i=0; i<L.size; i++)
{
if(L.list[i]>item)
break;
}
pos=i+1;
}
else if(pos==-1) //插入表尾
{
pos=L.size+1;
}
//如果空间用完,则重新分配大一倍的储存空间
if(L.size==L.MaxSize)
{
int k=sizeof(ElemType); //计算每个元素储存空间的长度
L.list=(ElemType*)realloc(L.list, 2*L.MaxSize*k);
if(L.list==NULL)
{
cout<<"可以空间用完,退出运行!"<<endl;
exit(1);
}
L.MaxSize=2*L.MaxSize; //把线性表的空间大小修改为新的长度
}
//待插入位置的后续位置元素依次后移
for(i=L.size-1; i>=pos-1; i--)
{
L.list[i+1]=L.list[i];
}
//把item的值赋给已空出的下标为pos-1的位置
L.list[pos-1]=item;
L.size++; //线性表的长度加1
return true; //返回真,表示插入成功
}
//从L中删除元素
bool DeleteList(List &L, ElemType item, int pos)
{
if(L.size==0) //检查线性表是否为空
{
cout<<"线性表为空,删除无效!"<<endl;
return false;
}
//判断pos的值是否合法
if(pos<-1 || pos>L.size+1)
{
cout<<"pos的值不合法!"<<endl;
return false;
}
int i; //循环变量
//判断删除的位置
if(pos==0) //按值删除
{
for(i=0; i<L.size; i++)
{
if(L.list[i]==item)
break;
}
if(i==L.size) return false; //无元素可删除
pos=i+1;
}
else if(pos==-1) //删除表尾元素
{
pos=L.size;
}
item=L.list[pos-1]; //将被删除元素的值赋给变参item带回
//待删除位置的后续位置元素依次前移
for(i=pos; i<L.size; i++)
{
L.list[i-1]=L.list[i];
}
L.size--; //线性表的长度减1
//如果剩余空间过大,进行缩小
if(float(L.size)/L.MaxSize<0.4 && L.size>10)
{
int k= sizeof(ElemType);
L.list=(ElemType*)realloc(L.list, L.MaxSize*k/2);
}
L.MaxSize=L.MaxSize/2; //把线性表的空间大小修改为新的长度
return true; //返回真,表示删除成功
}
//对L中的所元素按给定条件进行排序
void SortList(List &L)
{
int i,j;
ElemType x;
for(i=1; i<L.size; i++) //共循环n-1次
{
x=L.list[i]; //把无序表中的第一个元素暂存x中
for(j=i-1; j>=0; j--) //向前属性进行比较和移动
{
if(x<L.list[j])
L.list[j+1]=L.list[j];
else break;
}
L.list[j+1]=x; //把x写入到已经空出的位置
}
}
//主函数
void main()
{
int a[12]={3,6,9,12,15,18,21,24,27,30,33,36};
int i;
ElemType x;
List t;
InitList(t);
for(i=0; i<12; i++)
{
InsertList(t,a[i],i+1);
}
InsertList(t,48,13);
InsertList(t,40,0);
cout<<GetList(t,4)<<' '<<GetList(t,9)<<endl;
TraverseList(t);
cout<<"输入待查找的元素值:";
cin>>x;
if(FindList(t,x)) cout<<"查找成功!"<<endl;
else cout<<"查找失败!"<<endl;
cout<<"输入带删除元素的值:";
cin>>x;
if(DeleteList(t,x,0)) cout<<"删除成功!"<<endl;
else cout<<"删除失败!"<<endl;
TraverseList(t);
cout<<"按值插入,输入待插入的元素的值:";
cin>>x;
if(InsertList(t,x,0)) cout<<"插入成功!"<<endl;
else cout<<"插入失败!"<<endl;
TraverseList(t);
cout<<"线性表的长度:"<<LenthList(t)<<endl;
if(EmptyList(t)) cout<<"线性表为空!"<<endl;
else cout<<"线性表不空!"<<endl;
ClearList(t);
}
运行结果: