#include<iostream>
using namespace std;
typedef struct LNode
{
int data; //结点的数据域
struct LNode *next; //结点的指针域
}LNode,*LinkList; //LinkList为指向结构体LNode的指针类型
bool InitList(LinkList &L) //初始化
{
L = new LNode;
L->next=NULL;
L->data = 0; //不初始化数据域结果会无限循环 、
return true;
}
bool GetElem(LinkList &L,int i,int &e)
{
LNode *p=L->next;
int j=1;
while(p && j < i)
{
p=p->next;
j++;
}
if(!p||j>i)
return false;
e=p->data; //取值时通过e来取
return true;
}
int LocateElem(LinkList L,int e)
{
LNode *p=L->next;
int j=1;
while(p && p->data!= e)
{
p=p->next;
j++;
}
if(j>L->data)
return false;
return j;
}
bool ListInsert(LinkList &L,int i,int e)
{
LNode *p = L;
int j = 0;
while(p && (j<i-1))
{
p=p->next;
j++;
}
if(!p||j>i-1)
return false;
LNode *s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
L->data++;
return true;
}
bool ListDelete(LinkList &L,int i)
{
LNode *p=L;
int j = 0;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
if(!(p->next||j>i-1))
return false;
LNode *q; //以备释放
q=p->next;
p->next=q->next;
L->data--;
delete q;
return true;
}
//头插法创建链表
void CreateList_H(LinkList &L,int n)
{
L=new LNode; //分配空间
L->next=NULL; //头结点指针域置为空
L->data=0;
for(int i = 0;i<n;i++)
{
LNode *p=new LNode;
int m;
cin>>m;
p->data=m; //输入元素值赋给新结点*p的数据域
p->next=L->next;
L->next=p;
L->data++;
}
}
//尾插法创建链表
void CreateList_R(LinkList &L,int n)
{
L=new LNode;
L->next=NULL;
L->data=0;
LNode *r;
r=L;
for(int i=0;i<n;i++)
{
int m;
LNode *p=new LNode;
cin>>m;
p->data=m;
p->next=NULL;
r->next=p;
r=p;
L->data++;
}
}
void ClearList(LinkList &L)
{
LNode *p,*q;
p=L->next;
while(p)
{
q=p->next;
delete p;
p=q;
}
L->next=NULL;
}
int main()
{
cout << "实现单链表进行以下操作:\n"
<< "1、链表初始化\n"
<< "2、插入\n"
<< "3、头插创建n个数的链表\n"
<< "4、尾插创建n个数的链表\n"
<< "5、删除\n"
<< "6、取值\n"
<< "7、查找\n"
<< "8、销毁\n"
<< "0、退出系统\n";
int n;
LinkList L;
while(1)
{
int num;
int j,k;
cout<<"请输入操作序号:";
cin>>n;
switch(n)
{
case 1:
if(InitList(L))
cout<<"空链表已创建!\n";
break;
case 2:
cout<<"请输入要插入的位置及插入的数据元素:";
cin>>j>>k;
if(ListInsert(L,j,k))
cout<<"插入成功!\n";
else
cout<<"插入位置不合法!\n";
break;
case 3:
cout<<"请输入存储个数:";
cin>>num;
CreateList_H(L,num);
break;
case 4:
cout<<"请输入存储个数:";
cin>>num;
CreateList_R(L,num);
break;
case 5:
cout<<"请输入要删除元素的序号:";
cin>>j;
if(ListDelete(L,j))
cout<<"删除成功!\n";
else
cout<<"删除位置不合法!\n";
break;
case 6:
cout<<"请输入要取元素的位置:";
cin>>j;
if(GetElem(L,j,k))
{
cout<<"第"<<j<<"个位置的元素是"<<k<<endl;
}
else
cout<<"位置不合法!\n";
case 7:
cout<<"请输入要查找的值:";
cin>>k;
num=LocateElem(L,k);
if(num)
cout<<"在第"<<num<<"个!\n";
else
cout<<"没有找到该值!\n";
break;
case 8:
cout<<"链表已经销毁!自动退出程序!\n";
exit(0);
case 0:
exit(0);
}
cout<<"当前链表长度为"<<L->data<<endl;
cout<<"当前链表的数字信息是:\n";
for(int i=1;i<L->data;i++)
{
int e;
GetElem(L,i,e);
cout<<e<<" ";
}
cout<<endl;
}
return 0;
}
格式、内容借鉴:
1、博客:https://blog.csdn.net/lesileqin/article/details/88094845
2、《数据结构》严蔚敏