小武老师布置的题,让我们分别用顺序表和链表的形式完成一些操作,虽然本人还没验收但还是发这篇博客吧,我就是这么任性。
实验内容
该程序的功能是对元素类型为整型的顺序表进行一些操作。该程序包括顺序表结构类型的定义以及对顺序表操作的具体的函数定义和主函数。
此题我使用了一些对于界面好看点的程序代码,这还是gyy以前教的,在此表以感谢。
用顺序表实现
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
enumoperation{InitLists=1,CreateLists,DispLists,ListLengths,ListEmptys,GetElems,LocateElems,ListInserts,ListDeletes,DestroyLists,
ListPriors,ListNexts,ListFulls,quit};
//枚举类型用于菜单选择结果
typedef struct
{
char data[100];
int length;
}SqList;
operation Menu();//菜单函数
void InitList(SqList *L); //初始化
void CreateList(SqList *L); //创建
void DispList(SqList *L); //输出
void ListLength(SqList *L); //求长度
void ListEmpty(SqList *L); //判断是否为空
void GetElem(SqList *L);//输出第i个元素
void LocateElem(SqList *L);//输出a的位置
void ListInsert(SqList *L);//在第i个位置插入元素e
void ListDelete(SqList *L); //删除第i个元素
void DestroyList(SqList *L); //释放线性表
void Description();
void ListPrior(SqList *L);/*求顺序表中元素的前驱*/
void ListNext(SqList *L);/*求顺序表中元素的后继*/
void ListFull(SqList *L);/*检查顺序表是否为满 */
int main()
{
operationmenu_choice; //存放菜单选择项
string str1="ok",str2;
cout<<"\t\t"<<"欢迎新用户体验者,继续操作请输入ok"<<endl;
cout<<"\t\t\t\t";
cin>>str2;
if(str1==str2)
{
SqList *L=(SqList*)malloc(sizeof(SqList));
L->length=0;
Description();//菜单具体描述
do //循环现实直到用户退出程序
{
menu_choice=Menu(); //菜单显示及用户选择
switch(menu_choice) //用户选择功能匹配
{
caseInitLists:cout<<"\t\t\t"<<" "<<"1 初始化顺序表"<<endl;
InitList(L);
break;
caseCreateLists:cout<<"\t\t\t"<<" "<<"2 采用尾插法依次插入元素"<<endl;
CreateList(L);
break;
caseDispLists:cout<<"\t\t\t"<<" "<<"3 输出顺序表"<<endl;
DispList(L);
break;
case ListLengths:cout<<"\t\t\t"<<" "<<"4 输出顺序表长度"<<endl;
ListLength(L);
break;
caseListEmptys:cout<<"\t\t\t"<<" "<<"5 判断顺序表是否为空"<<endl;
ListEmpty(L);
break;
caseGetElems:cout<<"\t\t\t"<<" "<<"6 输出顺序表指定元素"<<endl;
GetElem(L);
break;
caseLocateElems:cout<<"\t\t\t"<<" "<<"7 输出元素的位置"<<endl;
LocateElem(L);
break;
caseListInserts:cout<<"\t\t\t"<<" "<<"8 在指定位置插入元素"<<endl;
ListInsert(L);
break;
case ListDeletes:cout<<"\t\t\t"<<" "<<"9 删除指定位置的元素"<<endl;
ListDelete(L);
break;
case DestroyLists:cout<<"\t\t\t"<<" "<<"10 释放顺序表"<<endl;
DestroyList(L);
break;
case ListPriors:cout<<"\t\t\t"<<" "<<"11 求给定元素的前驱"<<endl;
ListPrior(L);
break;
case ListNexts:cout<<"\t\t\t"<<" "<<"12 求给定元素的后继"<<endl;
ListNext(L);
break;
case ListFulls:cout<<"\t\t\t"<<" "<<"13 判断线性表是否已满"<<endl;
ListFull(L);
break;
case quit:cout<<"\t\t\t"<<" "<<"14 退出"<<endl;
break;
}
}while(menu_choice!=quit);
}
return 0;
}
void Description()//菜单具体描述
{
cout<<endl<<endl;
cout<<"\t\t\t" <<" "<<"操作菜单"<<endl;
cout<<"\t\t\t" <<" "<<"1 初始化线性表"<<endl;
cout<<"\t\t\t" <<" "<<"2 采用尾插法依次插入元素"<<endl;
cout<<"\t\t\t" <<" "<<"3 输出线性表"<<endl;
cout<< "\t\t\t" <<" "<<"4 输出线性表长度"<<endl;
cout<<"\t\t\t" <<" "<<"5 判断线性表是否为空"<<endl;
cout<<"\t\t\t" <<" "<<"6 输出线性表指定元素"<<endl;
cout<<"\t\t\t" <<" "<<"7 输出元素的位置"<<endl;
cout<<"\t\t\t" <<" "<<"8 在指定位置插入元素"<<endl;
cout<<"\t\t\t" <<" "<<"9 删除指定位置的元素"<<endl;
cout<<"\t\t\t" <<" "<<"10 释放线性表"<<endl;
cout<<"\t\t\t" <<" "<<"11 求给定元素的前驱"<<endl;
cout<<"\t\t\t" <<" "<<"12 求给定元素的后继"<<endl;
cout<<"\t\t\t" <<" "<<"13 判断线性表是否已满"<<endl;
cout<<"\t\t\t"<<" "<<"14 退出"<<endl;
}
//菜单函数
operation Menu()//菜单操作指定功能
{
intchoice;
cout<<endl<<endl<<"\t\t\t"<<" "<<"请输入功能序号:";
cin>>choice;
returnoperation(choice);
}
void InitList(SqList *L)
{
L->length=0;
cout<<"\t\t\t"<<" "<<"初始化顺序表完毕"<<endl;
}
void CreateList(SqList *L)
{
cout<<"\t\t\t"<<" "<<"先给出输入元素的个数:";
int n;
cin>>n;
cout<<"\t\t\t"<<" "<<"下面依次输入元素:";
for(int i=L->length;i<L->length+n;i++)
cin>>L->data[i];
L->length=L->length+n;
cout<<"\t\t\t"<<" "<<"操作完毕"<<endl;
}
void DispList(SqList *L)
{
if(L->length==0)
{
cout<<"\t\t\t"<<" "<<"顺序表是空表,请选择其他操作"<<endl;
return;
}
cout<<"\t\t\t"<<" "<<"顺序表的元素依次是:";
for(int i=0;i<L->length;i++)
cout<<L->data[i]<<" ";
cout<<endl;
cout<<"\t\t\t"<<" "<<"操作完毕"<<endl;
}
void ListLength(SqList *L)
{
cout<<"\t\t\t"<<" "<<"顺序表的长度是:"<<L->length<<endl;
}
void ListEmpty(SqList *L)
{
if(L->length==0)
cout<<"\t\t\t"<<" "<<"此表是空表"<<endl;
else
cout<<"\t\t\t"<<" "<<"此表不是空表"<<endl;
}
void GetElem(SqList *L)
{
if(L->length==0)
{
cout<<"\t\t\t"<<" "<<"顺序表是空表,请选择其他操作"<<endl;
return;
}
cout<<"\t\t\t"<<" "<<"给出指定位置:";
int i;
while(cin>>i)
{
if(i<1||i>L->length)
cout<<"\t\t\t"<<" "<<"给出位置错误请重新输入:";
else
{
cout<<"\t\t\t"<<" "<<"第"<<i<<"个位置的元素是:"<<L->data[i-1]<<endl;
break;
}
}
}
void LocateElem(SqList *L)
{
if(L->length==0)
{
cout<<"\t\t\t"<<" "<<"顺序表是空表,请选择其他操作"<<endl;
return;
}
cout<<"\t\t\t"<<" "<<"给出要查找的元素:";
char a;
while(cin>>a)
{
int i;
for(i=0;i<L->length;i++)
if(L->data[i]==a)
{
cout<<"\t\t\t"<<" "<<"该元素所在的位置是:"<<i+1<<endl;
cout<<"\t\t\t"<<" "<<"操作完毕"<<endl;
break;
}
if(i>=L->length)
{
cout<<"\t\t\t"<<" "<<"元素"<<a<<"不在此顺序表中";
cout<<"请重新输入:";
}
}
}
void ListInsert(SqList *L)
{
int i;
char e;
cout<<"\t\t\t"<<" "<<"给出要插入的位置i和所插入的元素e :";
cin>>i>>e;
if(i<1||i>L->length+1)
{cout<<"\t\t\t"<<" "<<"位置错误"<<endl;return;}
i--;
for(int j=L->length;j>i;j--)
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length++;
cout<<"\t\t\t"<<" "<<"操作完毕"<<endl;
}
void ListDelete(SqList *L)
{
if(L->length==0)
{
cout<<"\t\t\t"<<" "<<"顺序表是空表,请选择其他操作"<<endl;
return;
}
int i;
cout<<"\t\t\t"<<" "<<"指定删除元素的位置:";
cin>>i;
if(i<1||i>L->length+1)
{cout<<"\t\t\t"<<" "<<"位置错误"<<endl;return;}
i--;
for(int j=i;j<L->length-1;j++)
L->data[j]=L->data[j+1];
L->length--;
cout<<"\t\t\t"<<" "<<"操作完毕"<<endl;
}
void DestroyList(SqList *L)
{
delete (L);
cout<<"\t\t\t"<<" "<<"释放顺序表完毕"<<endl;
}
void ListPrior(SqList *L)/*求顺序表中元素的前驱*/
{
if(L->length==0)
{
cout<<"\t\t\t"<<" "<<"顺序表是空表,请选择其他操作"<<endl;
return;
}
cout<<"\t\t\t"<<" "<<"给出指定的元素:";
char e;
int i;
cin>>e;
for(i=0;i<L->length;i++)
if(L->data[i]!=e)
i++;
if(i>=L->length)
{
cout<<"\t\t\t"<<" "<<"该元素不存在"<<endl;
return;
}
if(i==0)
{
cout<<"\t\t\t"<<" "<<"该元素的前驱不存在"<<endl;
return;
}
else
cout<<"\t\t\t"<<" "<<"该元素的前驱是"<<L->data[i-1]<<endl;
}
void ListNext(SqList *L)/*求顺序表中元素的后继*/
{
if(L->length==0)
{
cout<<"\t\t\t"<<" "<<"顺序表是空表,请选择其他操作"<<endl;
return;
}
cout<<"\t\t\t"<<" "<<"给出指定的元素:";
char e;
int i;
cin>>e;
for(i=0;i<L->length;i++)
if(L->data[i]==e)
{i++;break;}
if(i>=L->length)
{
cout<<"\t\t\t"<<" "<<"该元素不存在"<<endl;
return;
}
if(i==L->length-1)
{
cout<<"\t\t\t"<<" "<<"该元素的后继不存在"<<endl;
return;
}
else
cout<<"\t\t\t"<<" "<<"该元素的后继是"<<L->data[i+1]<<endl;
}
void ListFull(SqList *L)/*检查顺序表是否为满 */
{
if(L->length==99)
cout<<"\t\t\t"<<" "<<"该顺序表已满"<<endl;
else
cout<<"\t\t\t"<<" "<<"该顺序表未满"<<endl;
}
用链表实现
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
enumoperation{InitLists=1,CreateLists,DispLists,ListLengths,ListEmptys,GetElems,LocateElems,ListInserts,ListDeletes,DestroyLists,
ListPriors,ListNexts,ListFulls,quit};
//枚举类型用于菜单选择结果
typedef struct LNode
{
char data;
struct LNode *next;
}LinkList;
operation Menu();//菜单函数
void InitList(LinkList *L); //初始化
void CreateList(LinkList *L); //创建
void DispList(LinkList *L); //输出
void ListLength(LinkList *L); //求长度
void ListEmpty(LinkList *L); //判断是否为空
void GetElem(LinkList *L);//输出第i个元素
void LocateElem(LinkList *L);//输出a的位置
void ListInsert(LinkList *L);//在第i个位置插入元素e
void ListDelete(LinkList *L); //删除第i个元素
void DestroyList(LinkList *L); //释放线性表
void Description();
void ListPrior(LinkList *L);
void ListNext(LinkList *L);
void ListFull(LinkList *L);
int main()
{
operationmenu_choice; //存放菜单选择项
string str1="ok",str2;
cout<<"\t\t"<<"欢迎新用户体验者,继续操作请输入ok"<<endl;
cout<<"\t\t\t\t";
cin>>str2;
if(str1==str2)
{
LinkList *L=(LinkList*)malloc(sizeof(LinkList));
L->next=NULL;
Description();//菜单具体描述
do //循环现实直到用户退出程序
{
menu_choice=Menu(); //菜单显示及用户选择
switch(menu_choice) //用户选择功能匹配
{
caseInitLists:cout<<"\t\t\t"<<" "<<"1 初始化链表"<<endl;
InitList(L);
break;
caseCreateLists:cout<<"\t\t\t"<<" "<<"2 采用尾插法依次插入元素"<<endl;
CreateList(L);
break;
caseDispLists:cout<<"\t\t\t"<<" "<<"3 输出链表"<<endl;
DispList(L);
break;
case ListLengths:cout<<"\t\t\t"<<" "<<"4 输出链表长度"<<endl;
ListLength(L);
break;
caseListEmptys:cout<<"\t\t\t"<<" "<<"5 判断链表是否为空"<<endl;
ListEmpty(L);
break;
caseGetElems:cout<<"\t\t\t"<<" "<<"6 输出链表指定元素"<<endl;
GetElem(L);
break;
caseLocateElems:cout<<"\t\t\t"<<" "<<"7 输出元素的位置"<<endl;
LocateElem(L);
break;
caseListInserts:cout<<"\t\t\t"<<" "<<"8 在指定位置插入元素"<<endl;
ListInsert(L);
break;
case ListDeletes:cout<<"\t\t\t"<<" "<<"9 删除指定位置的元素"<<endl;
ListDelete(L);
break;
case DestroyLists:cout<<"\t\t\t"<<" "<<"10 释放链表表"<<endl;
DestroyList(L);
break;
case ListPriors:cout<<"\t\t\t"<<" "<<"11 求给定元素的前驱"<<endl;
ListPrior(L);
break;
case ListNexts:cout<<"\t\t\t"<<" "<<"12 求给定元素的后继"<<endl;
ListNext(L);
break;
case ListFulls:cout<<"\t\t\t"<<" "<<"13 判断线性表是否已满"<<endl;
ListFull(L);
break;
case quit:cout<<"\t\t\t"<<" "<<"14 退出"<<endl;
break;
}
}while(menu_choice!=quit);
}
return 0;
}
void Description()//菜单具体描述
{
cout<<endl<<endl;
cout<<"\t\t\t" <<" "<<"操作菜单"<<endl;
cout<<"\t\t\t" <<" "<<"1 初始化链表"<<endl;
cout<<"\t\t\t" <<" "<<"2 采用尾插法依次插入元素"<<endl;
cout<<"\t\t\t" <<" "<<"3 输出链表"<<endl;
cout<< "\t\t\t" <<" "<<"4 输出链表长度"<<endl;
cout<<"\t\t\t" <<" "<<"5 判断链表是否为空"<<endl;
cout<<"\t\t\t" <<" "<<"6 输出链表指定元素"<<endl;
cout<<"\t\t\t" <<" "<<"7 输出元素的位置"<<endl;
cout<<"\t\t\t" <<" "<<"8 在指定位置插入元素"<<endl;
cout<<"\t\t\t" <<" "<<"9 删除指定位置的元素"<<endl;
cout<<"\t\t\t" <<" "<<"10 释放链表"<<endl;
cout<< "\t\t\t" <<" "<<"11 求给定元素的前驱"<<endl;
cout<<"\t\t\t" <<" "<<"12 求给定元素的后继"<<endl;
cout<<"\t\t\t" <<" "<<"13 判断线性表是否已满"<<endl;
cout<<"\t\t\t"<<" "<<"11 退出"<<endl;
}
//菜单函数
operation Menu()//菜单操作指定功能
{
intchoice;
cout<<endl<<endl<<"\t\t\t"<<" "<<"请输入功能序号:";
cin>>choice;
returnoperation(choice);
}
void InitList(LinkList *L)
{
L->next=NULL;
cout<<"\t\t\t"<<" "<<"初始化链表完毕"<<endl;
}
void CreateList(LinkList *L)
{
cout<<"\t\t\t"<<" "<<"先给出输入元素的个数:";
int n;
cin>>n;
cout<<"\t\t\t"<<" "<<"下面依次输入元素:";
LinkList *p=L;
for(int i=1;i<=n;i++)
{
LinkList *s=(LinkList*)malloc(sizeof(LinkList));
cin>>s->data;
p->next=s;
p=s;
}
p->next=NULL;
cout<<"\t\t\t"<<" "<<"操作完毕"<<endl;
}
void DispList(LinkList*L)
{
if(L->next==NULL)
{
cout<<"\t\t\t"<<" "<<"链表是空表,请选择其他操作"<<endl;
return;
}
cout<<"\t\t\t"<<" "<<"链表的元素依次是:";
LinkList *p=L->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
cout<<"\t\t\t"<<" "<<"操作完毕"<<endl;
}
void ListLength(LinkList *L)
{
int n=0;
LinkList *p=L->next;
while(p!=NULL)
{
n++;
p=p->next;
}
cout<<"\t\t\t"<<" "<<"链表的长度是:"<<n<<endl;
}
void ListEmpty(LinkList *L)
{
if(L->next==NULL)
cout<<"\t\t\t"<<" "<<"此表是空表"<<endl;
else
cout<<"\t\t\t"<<" "<<"此表不是空表"<<endl;
}
void GetElem(LinkList *L)
{
if(L->next==NULL)
{
cout<<"\t\t\t"<<" "<<"链表是空表,请选择其他操作"<<endl;
return;
}
cout<<"\t\t\t"<<" "<<"给出指定位置:";
int i;
while(cin>>i)
{
int j=0;
LinkList *p=L;
while(j<i&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL||i==0)
cout<<"\t\t\t"<<" "<<"给出位置错误请重新输入:";
else
{
cout<<"\t\t\t"<<" "<<"第"<<i<<"个位置的元素是:";
cout<<p->data<<endl;
break;
}
}
}
void LocateElem(LinkList *L)
{
if(L->next==NULL)
{
cout<<"\t\t\t"<<" "<<"链表是空表,请选择其他操作"<<endl;
return;
}
cout<<"\t\t\t"<<" "<<"给出要查找的元素:";
char a;
while(cin>>a)
{
int i=1;
LinkList *p=L->next;
while(p!=NULL&&p->data!=a)
{p=p->next;i++;}
if(p==NULL)
{
cout<<"\t\t\t"<<" "<<"元素"<<a<<"不在此顺序表中";
cout<<"请重新输入:";
}
else
{
cout<<"\t\t\t"<<" "<<"该元素所在的位置是:"<<i<<endl;
cout<<"\t\t\t"<<" "<<"操作完毕"<<endl;
break;
}
}
}
void ListInsert(LinkList *L)
{
int i,j=0;
char e;
cout<<"\t\t\t"<<" "<<"给出要插入的位置i和所插入的元素e :";
cin>>i>>e;
LinkList *p=L;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL||i==0)
{cout<<"\t\t\t"<<" "<<"位置错误"<<endl;return;}
else
{
LinkList *s=(LinkList*)malloc(sizeof(LinkList));
s->data=e;
s->next=p->next;
p->next=s;
cout<<"\t\t\t"<<" "<<"操作完毕"<<endl;
}
}
void ListDelete(LinkList *L)
{
if(L->next==NULL)
{
cout<<"\t\t\t"<<" "<<"链表是空表,请选择其他操作"<<endl;
return;
}
int i,j=0;
cout<<"\t\t\t"<<" "<<"指定删除元素的位置:";
cin>>i;
LinkList *p=L,*q;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL||i==0)
{cout<<"\t\t\t"<<" "<<"位置错误"<<endl;return;}
else
{
q=p->next;
if(q==NULL)
{cout<<"\t\t\t"<<" "<<"位置错误"<<endl;return;}
p->next=q->next;
free(q);
cout<<"\t\t\t"<<" "<<"操作完毕"<<endl;
}
}
void DestroyList(LinkList *L)
{
LinkList *pre=L,*p=L->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=p->next;
}
free(pre);
cout<<"\t\t\t"<<" "<<"释放链表完毕"<<endl;
}
void ListPrior(LinkList*L)
{
LinkList *pre=L,*p=L->next;
if(L->next==NULL)
{
cout<<"\t\t\t"<<" "<<"链表是空表,请选择其他操作"<<endl;
return;
}
cout<<"\t\t\t"<<" "<<"给出指定的元素:";
char e;
cin>>e;
while(p->data!=e&&p!=NULL)
{
pre=p;
p=p->next;
}
if(p==NULL)
{
cout<<"\t\t\t"<<" "<<"该元素不存在"<<endl;
return;
}
if(pre==L)
{
cout<<"\t\t\t"<<" "<<"该元素的前驱不存在"<<endl;
return;
}
else
cout<<"\t\t\t"<<" "<<"该元素的前驱是"<<pre->data<<endl;
}
void ListNext(LinkList *L)
{
LinkList *pre=L->next,*p=pre->next;
if(L->next==NULL)
{
cout<<"\t\t\t"<<" "<<"链表是空表,请选择其他操作"<<endl;
return;
}
cout<<"\t\t\t"<<" "<<"给出指定的元素:";
char e;
cin>>e;
while(pre->data!=e&&pre!=NULL)
{
pre=p;
p=p->next;
}
if(pre==NULL)
{
cout<<"\t\t\t"<<" "<<"该元素不存在"<<endl;
return;
}
if(pre->next==NULL)
{
cout<<"\t\t\t"<<" "<<"该元素的后继不存在"<<endl;
return;
}
else
cout<<"\t\t\t"<<" "<<"该元素的后继是"<<p->data<<endl;
}
void ListFull(LinkList *L)
{
cout<<"\t\t\t"<<" "<<"由于链表是动态开辟的所以除非内存不够用否则不会满"<<endl;
}