领会顺序表存储结构和掌握顺序表中的各种基本运算算法设计
实现顺序表的各种基本运算和整体建表算法(假设顺序表的元素类型 ElemType 为 char)
程序要求:
1.初始化顺序表L;
2.依次插入A、B、C、D、E元素;
3.输出顺序表L;
4.判断顺序表L的长度;
5.判断顺序表L是否为空表;
6.根据用户的输入的位置,输出相应顺序表L的元素;
7.根据用户的输入的元素,输出相应顺序表L元素的位置;
8.根据用户的输入的位置和元素,对顺序表L插入新的元素;
9.输出顺序表L;
10.根据用户的输入的位置,删除顺序表L中对应的元素;
11.输出顺序表L;
12.释放顺序表L;
-------------------------------------------------------------------------------------------------------------------
注意:
1.ElemType e 与 ElemType &e的区别
2.注意逻辑序号和物理序号的转换
----------------------------------------------------------------------------------------------
定义线性表的结构体类型
#include <iostream.h>
#define MaxSize 100
typedef char ElemType;
typedef struct
{
ElemType data[MaxSize];
int length;
} SqList; //定义线性表结构体类型
1.初始化线性表函数
//初始化线性表
void InitList(SqList *&L) //引用型指针
{
L= new SqList; /*分配存放线性表的空间*/
L->length=0;
}
2.建立线性表函数
//建立线性表
void CreateList(SqList *&L,ElemType a[],int n)
{
for (int i=0;i<n;i++)
L->data[i]=a[i];
L->length=n;
}
3.销毁线性表函数
//销毁线性表
void DestroyList(SqList *&L)
{
delete L;
}
4.判定线性表是否为空表函数
如果线性表为空表 return true
如果线性表不为空表 return false
//判定是否为空表
bool ListEmpty(SqList *L)
{
return(L->length==0);
}
5.求线性表的长度函数
//求线性表的长度
int ListLength(SqList *L)
{
return(L->length);
}
6.输出线性表函数
void DispList(SqList *L)
{
if (ListEmpty(L))
return;
for (int i=0;i<L->length;i++)
cout<<L->data[i]<<" ";
cout<<endl;
}
7.求某个数据元素值
此时 i 为逻辑序号
通过 i-1 转化为物理序号
//求某个数据元素值
bool GetElem(SqList *L,int i,ElemType &e)
{
if (i<1 || i>L->length)
return false;
e=L->data[i-1];
return true;
}
8.按元素值查找
//按元素值查找
int LocateElem(SqList *L, ElemType e)
{
int i=0;
while (i<L->length && L->data[i]!=e)
i++;
if (i>=L->length)
return 0;
else
return i+1;
}
9.插入数据元素
//插入数据元素
bool ListInsert(SqList *&L,int i,ElemType e)
{
if (i<1 || i>L->length+1)
return false;
i--; /*将顺序表逻辑位序转化为elem下标即物理位序*/
for (int j=L->length;j>i;j--)/*将data[i]及后面元素后移一个位置*/
L->data[j]=L->data[j-1];
L->data[i]=e; //将新元素插入该位置
L->length++; /*顺序表长度增1*/
return true;
}
10.删除数据元素
//删除数据元素
bool ListDelete(SqList *&L,int i,ElemType &e)
{
int j;
if (i<1 || i>L->length)
return false;
i--; /*将顺序表逻辑位序转化为elem下标即物理位序*/
e=L->data[i];
for (j=i;j<L->length-1;j++) L->data[j]=L->data[j+1];
/*将data[i]之后的元素前移一个位置*/
L->length--; /*顺序表长度减1*/
return true;
}
----------------------------------------------------------------------------------------------
主函数
建表使用 ListInsert 函数 或者 CreateList 函数都可以
void main()
{
SqList *L1;
cout<<"1.初始化顺序表:"<<endl;InitList(L1);
cout<<"\n2.尾插法建表:"<<endl;
ElemType a[5]={'A','B','C','D','E'};
for(int i=0;i<5;i++)
if(!ListInsert(L1,i+1,a[i]))
cout<<"插入失败!";
cout<<"\n3.顺序表的元素为:";
DispList(L1);
cout<<"\n4.该顺序表的长度为:"<<ListLength(L1)<<endl;
cout<<"\n5.该顺序表";
if(ListEmpty(L1))
cout<<"为空!"<<endl;
else
cout<<"不为空!"<<endl;
cout<<"\n6.取元素";
ElemType temp;cout<<"请输入取的位置:";int k;cin>>k;
if(GetElem(L1,k,temp))
cout<<"取值成功,该顺序表的第"<<k<<"个元素的值为:"<<temp<<endl;
else
cout<<"取值失败,你输入的位置"<<k<<"越界:"<<endl;
cout<<"\n7.查找元素:"<<endl<<"请输入查找元素的值:";cin>>temp;
if(LocateElem(L1,temp))
cout<<"输出元素'"<<temp<<"'的位置为:"<<LocateElem(L1,temp)<<endl;
else
cout<<"元素'"<<temp<<"'不存在."<<endl;
cout<<"\n8.在顺序表指定位置插入元素 :"<<endl;
cout<<"请输入插入的位置:";cin>>k;
cout<<"请输入插入元素的值:";cin>>temp;
if(ListInsert(L1,k,temp))
cout<<"插入成功"<<endl;
else
cout<<"插入失败!"<<endl;
cout<<"\n9.输出顺序表"<<endl;
DispList(L1);
cout<<"\n10.删除顺序表指定位置的元素"<<endl;
cout<<"请输入删除的位置:";cin>>k;
if(ListDelete(L1,k,temp))
cout<<"删除成功,删除的元素为:"<<temp<<endl;
else
cout<<"删除失败!"<<endl;
cout<<"\n11.输出顺序表"<<endl;
DispList(L1);
cout<<"\n12.释放顺序表"<<endl;
DestroyList(L1);
}