实验目的
1、掌握链表中元素的前驱、后续的概念。
2、掌握链表的建立、插入元素、删除表中某元素的操作。
3、对链表相应算法的时间复杂度进行分析。
4、理解链表数据结构的特点(优缺点)。
实验内容和要求
要求实现链表的操作集。其中
函数接口定义
void CreateList_L(LinkList &length,int n);//创建链表
void ListTraverse(LinkList &L);//遍历
Status PriorElem(LinkList &L,ElemType cur_e,ElemType &pre_e);//前驱
Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e);//后继
Status GetElem_L(LinkList L,int i,ElemType &e);//找元素
int LocateElem_L(LinkList L,ElemType &e);//定位元素
int ListLength(LinkList L);//求表长
Status ListInsert_L(LinkList &L,int i,ElemType e);//插入
Status ListDelete_L(LinkList &L,int i,ElemType &e);//删除
Status ListReverse(LinkList &L);//倒置
LinkList结构定义如下:
typedef struct LNode{//构造结构体
ElemType data;//数据域
struct LNode *next;//指针域
}LNode,*LinkList; //名称
测试程序样例
int main()
{
char select;
int quit=0;
int i;
ElemType e,pre_e,next_e;
ElemType cur_e=0;
LinkList L;
int n;
do
{
cout<<"---------------------------------\n";
cout<<“请选择操作编号\n\n”;
cout<<“1:创建链表 2:求前驱 3:求后继 \n”;
cout<<“4:定位元素 5:找元素 6:求表长 \n”;
cout<<“7:插入元素 8:删除元素 9:倒置\n”;
cout<<“0:结束\n”;
cout<<"---------------------------------\n";
cin>>select;
switch(select)
{
case ‘1’:
CreateList_L(L,n);
cout<<“正序遍历:\n”;
ListTraverse(L);
break;
case ‘2’:
cout<<“输入元素:”;
cin>>cur_e;
if(PriorElem(L,cur_e,pre_e))
cout<<“该元素前驱是:”<<pre_e<<endl;
else
cout<<“该元素不存在前驱\n”;
cout<<"\n";
break;
case ‘3’:
cout<<“输入元素:”;
cin>>cur_e;
if( NextElem(L,cur_e,next_e))
cout<<“该元素后继是:”<<next_e<<endl;
else
cout<<“该元素不存在后继\n”;
cout<<"\n";
break;
case ‘4’:
cout<<“输入所求元素的值:”;
cin>>e;
if(LocateElem_L(L,e)==ERROR){
cout<<“不存在该元素!\n”;}
else{
cout<<“所求元素的位置i=”<<LocateElem_L(L,e)<<endl;}
break;
case ‘5’:
cout<<“输入所求元素的位置i=”;
cin>>i;
if(GetElem_L(L,i,e)==ERROR){
cout<<“i值不合法\n”;}
else{
cout<<“第个”<<i<<“元素的值为:”<<e<<endl;}
break;
case ‘6’:
cout<<“链表长度:”<<ListLength(L)<<endl;
break;
case ‘7’:
cout<<“插入的位置i=”;
cin>>i;
cout<<“插入的元素e=”;
cin>>e;
if(ListInsert_L(L,i,e)==ERROR){
cout<<“i值不合法\n”;}
else
{
cout<<“插入后的链表:\n”;
ListTraverse(L);
}
break;
case ‘8’:
cout<<“删除位置:”;
cin>>i;
if(ListDelete_L(L,i,e)==ERROR){
cout<<“i值不合法\n”;}
else
{
cout<<“删除后的链表:\n”;
ListTraverse(L);
}
break;
case ‘9’:
ListReverse(L);
if(OK)
{
ListTraverse(L);
}
break;
case ‘0’:
cout<<“操作结束\n”;
break;
default: cout<<“输入编号出错\n”;
}
}while(select!=‘0’);
return 1;
}
/* 你的代码将被嵌在这里 */
输出样例
分别测试每个功能都能正常运行
代码
(6个函数的实现)
void CreateList_L(LinkList &L,int n)//创建链表
{
LinkList p;
int i;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
cout<<“链表的元素个数:\n”;
cin>>n;
cout<<“倒序输入:\n”;
for(i=n;i>0;–i){
p=(LinkList)malloc(sizeof(LNode));
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
//遍历
void ListTraverse(LinkList &L){
LinkList p = L->next;
while§ // p不为空时
{
cout<data<<" “;
p = p->next;
}
cout<<”\n";
}
//前驱
Status PriorElem(LinkList &L,ElemType cur_e,ElemType &pre_e)
{
int flag=0;
LinkList p=L->next;
if(!p) return ERROR;
else
{
for(p=L->next;p->next;p=p->next){
if(p->next->datacur_e){
pre_e=p->data;
flag=1;
}
}
if(flag0) return ERROR;
}
return pre_e;
}
//后继
Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e){
bool flag=0;
LinkList p = L->next;
if(!p) return ERROR;
else{
for(p=L->next;p->next;p=p->next){
if(p->data==cur_e){
next_e=p->next->data;
flag=1;
}
}
}
return next_e;
}
Status GetElem_L(LinkList L,int i,ElemType &e)//找元素
{
int j=1;
LinkList p = L->next;
while(p&&j<i){
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
e = p->data;
return OK;
}
//定位元素
int LocateElem_L(LinkList L,ElemType &e)
{
LinkList p = L->next;
int i=1;
while§{
if(p->data==e){
return i;
}
else{
p=p->next;
i++;
}
}
}
//求表长
int ListLength(LinkList L)
{
int i=0;
LinkList p;
p = L->next;
while§{
i++;
p=p->next;
}
return i;
}
//插入
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
LinkList s,p=L;
int j=0;
while(p&&j<i-1){
p=p->next;++j;
}
if(!p||j>i-1) return ERROR;
s = (LinkList)malloc(sizeof(LNode));
s->data=e;s->next=p->next;
p->next=s;
return OK;
}
//删除
Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
LinkList q,p=L;
int j=0;
while(p->next&&j<i-1){
p=p->next;++j;
}
if(!(p->next)||j>i-1)
return ERROR;
q = p->next;p->next = q->next;
e = q->data; free(q);
return OK;
}
//倒置
Status ListReverse(LinkList &L)
{
LinkList p,q,pr;
p=L->next;
q=NULL;
L->next = NULL;
while§{
pr = p->next;
p->next=q;
q=p;
p=pr;
}
L->next=q;
return OK;
}