📄 main_slinklist.cpp
字号:
#include"c1.h"
typedef int ElemType;
// c2-2.h 线性表的单链表存储结构
struct LNode
{
ElemType data;
LNode *next;
};
typedef LNode *LinkList; // 另一种定义LinkList的方法
char pause;
void handle_choice(int choice);//菜单选择
LinkList L;
//bo2-2.cpp
Status comp(ElemType c1,ElemType c2)
{ // 数据元素判定函数(相等为TRUE,否则为FALSE)
if(c1==c2)
return TRUE;
else
return FALSE;
}
void visit(ElemType c) // 访问操定为:输出元素值
{
cout<<c<<ends;
}
void CreateList(LinkList &L,int n) // 算法2.11
{ // 逆位序(插在表头)输入n个元素的值,建立带表头结构的单链线性表L
int i;
LinkList p;
system("cls");//清屏
L=new(LNode);
L->next=NULL; // 先建立一个带头结点的单链表
cout<<"请输入"<<n<<"数据元素"<<endl;//将创建的链表中数据元素的个数
for(i=n;i>0;--i)
{
p=new(LNode); // 生成新结点
cin>>p->data; // 输入元素值
p->next=L->next; // 插入到表头
L->next=p;
}
}
int ListLength(LinkList L)
{ // 初始条件:线性表L已存在。操作结果:返回L中数据元素个数
int i=0;
system("cls");
LinkList p=L->next; // p指向第一个结点
while(p) // 没到表尾
{
i++;
p=p->next;
}
return i;
}
Status GetElem(LinkList L,int i,ElemType &e) // 算法2.8
{ // L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
int j=1; // j为计数器
LinkList p=L->next; // p指向第一个结点
system("cls");
while(p&&j<i) // 顺指针向后查找,直到p指向第i个元素或p为空
{
p=p->next;
j++;
}
if(!p||j>i) // 第i个元素不存在
return ERROR;
e=p->data; // 取第i个元素
return OK;
}
int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{ // 初始条件: 线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
// 操作结果: 返回L中第1个与e满足关系compare()的数据元素的位序。
// 若这样的数据元素不存在,则返回值为0
int i=0;
LinkList p=L->next;
system("cls");
while(p)
{
i++;
if(compare(p->data,e)) // 找到这样的数据元素
return i;
p=p->next;
}
return 0;
}
Status ListInsert(LinkList &L,int i,ElemType e) // 算法2.9。
{ // 在带头结点的单链线性表L中第i个位置之前插入元素e
int j=0;
LinkList p=L,s;
system("cls");
while(p&&j<i-1) // 寻找第i-1个结点
{
p=p->next;
j++;
}
if(!p||j>i-1) // i小于1或者大于表长
return ERROR;
s=new(LNode); // 生成新结点
s->data=e; // 插入L中
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete(LinkList &L,int i,ElemType &e) // 算法2.10。
{ // 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
int j=0;
LinkList p=L,q;
system("cls");
while(p->next&&j<i-1) // 寻找第i个结点,并令p指向其前趋
{
p=p->next;
j++;
}
if(!p->next||j>i-1) // 删除位置不合理
return ERROR;
q=p->next; // 删除并释放结点
p->next=q->next;
e=q->data;
delete(q);
return OK;
}
Status ListTraverse(LinkList L,void(*vi)(ElemType))
// vi的形参类型为ElemType,与bo2-1.cpp中相应函数的形参类型ElemType&不同
{ // 初始条件:线性表L已存在
// 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败
LinkList p=L->next;
system("cls");
while(p)
{
vi(p->data);
p=p->next;
}
cout<<endl;
//cin.get(pause);
//system("pause");
return OK;
}
Status DestroyList(LinkList &L)
{ // 初始条件:线性表L已存在。操作结果:销毁线性表L
LinkList q;
while(L)
{
q=L->next;
delete(L);
L=q;
}
return OK;
}
//主函数
int main()
{
system("cls");//执行系统命令cls,清屏
int choice;
//cin.get(pause);
do
{//显示主菜单
//system("cls");
cout<<"1-创建单链表\n";
cout<<"2-在单链表第i个位置插入元素\n";
cout<<"3-删除单链表中第i个位置的元素\n";
cout<<"4-返回第i个元素的值\n";
cout<<"5-查找元素\n";
cout<<"6-显示单链表\n";
cout<<"7-测试表长\n";
cout<<"8-退出\n";
cout<<"Enter choice:";
cin>>choice;
handle_choice(choice);//Call function to direct flow based on choice
}while(choice!=8);//Repeat menu until user chooses to exit
return 0;
}//end of main function
void handle_choice(int choice) //根据用户选择调用对应处理函数
{ int i,e;
switch(choice)
{
case 1://If choice was to add a record to the database
cout<<"请输入要创建的单链表中结点个数:";
cin>>i;//将创建的链表中数据元素的个数
cout<<endl;
CreateList(L,i);
break;
case 2://If choice was to display all records in the database
cout<<"请输入插入位置:";
cin>>i;//将创建的链表中数据元素的个数
cout<<endl;
cout<<"请输入插入元素的值:";
cin>>e;//将创建的链表中数据元素的个数
cout<<endl;
ListInsert(L,i,e);
break;
case 3://If choice was to
cout<<"请输入删除位置:";
cin>>i;//将创建的链表中数据元素的个数
cout<<endl;
ListDelete(L,i,e);
cout<<"被删除元素为:"<<e<<endl;
cin.get(pause);
system("pause");
break;
case 4://If choice was to
cout<<"请输入要查询的元素位置:";
cin>>i;
GetElem(L,i,e);
cout<<"第"<<i<<"个元素值为:"<<e<<endl;
cin.get(pause);
system("pause");
break;
case 5://If choice was to
cout<<"请输入要查询的元素值:";
cin>>e;//
i=LocateElem(L,e,comp);
cout<<"查询元素"<<e<<"位于链表的位置为:"<<i<<endl;
cin.get(pause);
system("pause");
break;
case 6://
ListTraverse(L,visit);
cout<<endl;
cin.get(pause);
system("pause");
break;
case 7://If choice was to
i=ListLength(L);
cout<<"该链表长为:"<<i<<endl;
cin.get(pause);
system("pause");
break;
case 8:
DestroyList(L);
break;
default://If any other(invalid) choice was entered,display error message
cout<<"Invalid choice\n";
break;
}
}//end of function handle_choice
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -