//简单实现单链表
#include<iostream>
using namespace std;
typedef struct LNode{
int data; //数据域
struct LNode *next; //指针域
}LNode,*Linklist;
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;
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++)
{
int m;
LNode *p=new LNode;
cin >> m;
p->data=m;
p->next=L->next;
L->next=p;
L->data++;
}
}
//尾插
void CreateList_R(Linklist &L,int n)
{
L=new LNode;
L->data=0;
L->next=NULL;
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++;
}
}
//插入
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; //存储p->next 为了一会儿释放
q=p->next;
p->next=q->next;
L->data--;
delete q;
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;
}
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 << "-------------------------------------\n";
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";
break;
case 7:
cout << "请输入要找的值:";
cin >> k;
num=LocateElem(L,k);
if(num)
cout << "在第" << num << "个!\n";
else
cout << "没有找到该值!\n";
break;
case 8:
cout << "链表已经销毁!自动退出程序!\n";
exit(0);
default :
exit(0);
}
cout << "--------------------------------------------\n";
cout << "当前链表的长度是" << L->data << "!\n";
cout << "当前链表的数字信息是:\n";
for(int i=1;i<=L->data;i++)
{
int e;
GetElem(L,i,e);
cout << e << " ";
}
cout << "\n";
}
return 0;
}