#include <iostream>
using namespace std;
typedef struct LNode{
int data;//数据域
struct LNode * next;//指针域
} LNode,*LinkList;//*LinkList为指向结构体LNode的指针类型
bool InitList_L(LinkList &L){//
L=new LNode;
if(!L){
return false;
}
L->next=NULL;
return true;
}
void CreateList_H(LinkList &L){//头插法
int n;
LinkList s;//定义一个指针变量
L=new LNode;
L->next=NULL;
cout<<"请输入元素个数"<<endl;
cin>>n;
cout<<"请依次输入元素:"<<endl;
cout<<"前插法"<<endl;
while(n--){
s=new LNode;
cin>>s->data;
s->next=L->next;
L->next=s;
}
}
void Listprint_L(LinkList L){
LinkList p;
p=L->next;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void CreateList_R(LinkList &L){
int n;
LinkList s,r;//定义一个指针变量
L=new LNode;
L->next=NULL;
r=L;
cout<<"请输入元素个数"<<endl;
cin>>n;
cout<<"请依次输入元素:"<<endl;
cout<<"尾插法"<<endl;
while(n--){
s=new LNode;
cin>>s->data;
s->next=NULL;
r->next=s;
r=s;
}
}
bool GetElem_L(LinkList L,int i,int &e){
int j;
LinkList p;
p=L->next;
j=1;
while(j<i&& p ){
p=p->next;
j++;
}
if(!p||j>i){
return false;
}
//j==i
e=p->data;
return true;
}
bool LocateElem_L(LinkList L,int e){
LinkList p;
p=L->next;
while(p&&p->data!=e ){
p=p->next;
}
if(!p){
return false;
}
return true;
}
bool ListInsert_L(LinkList &L,int i,int &e){
int j=0;
LinkList p,s;
p=L;
while(p && j<i-1){
p=p->next;
j++;
}
if(!p ||j>i-1){
return false;
}
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
bool ListDelete_L(LinkList &L,int i){
int j=0;
LinkList p,s,q;
p=L;
while((p->next)&&(j<i-1)){
p=p->next;
j++;
}
if(!p->next ||j>i-1){
return false;
}
q=p->next;
p->next=q->next;
delete q;
return true;
}
int main(){
int i,x,e,choose;
LinkList L;
cout<<"1. 初始化\n";
cout<<"2. 创建单链表(前插法)\n";
cout<<"3. 创建单链表(尾插法)\n";
cout<<"4. 取值\n";
cout<<"5. 查找\n";
cout<<"6. 插入\n";
cout<<"7. 删除\n";
cout<<"8. 输出\n";
cout<<"0. 退出\n";
choose=-1;
while(choose!=0)
{
cout<<"请输入数字选择:";
cin>>choose;
switch(choose)
{
case 1: //初始化一个空的单链表
if(InitList_L(L))
cout<<"初始化一个空的单链表!\n";
break;
case 2: //创建单链表(前插法)
CreateList_H(L);
cout<<"前插法创建单链表输出结果:\n";
Listprint_L(L);
break;
case 3: //创建单链表(尾插法)
CreateList_R(L);
cout<<"尾插法创建单链表输出结果:\n";
Listprint_L(L);
break;
case 4: //单链表的按序号取值
cout<<"请输入一个位置i用来取值:";
cin>>i;
if(GetElem_L(L,i,e))
{
cout<<"查找成功\n";
cout<<"第"<<i<<"个元素是:"<<e<<endl;
}
else
cout<<"查找失败\n\n";
break;
case 5: //单链表的按值查找
cout<<"请输入所要查找元素x:";
cin>>x;
if(LocateElem_L(L,x))
cout<<"查找成功\n";
else
cout<<"查找失败! "<<endl;
break;
case 6: //单链表的插入
cout<<"请输入插入的位置和元素(用空格隔开):";
cin>>i;
cin>>x;
if(ListInsert_L(L,i,x))
cout<<"插入成功.\n\n";
else
cout<<"插入失败!\n\n";
break;
case 7: //单链表的删除
cout<<"请输入所要删除的元素位置i:";
cin>>i;
if(ListDelete_L(L, i))
cout<<"删除成功!\n";
else
cout<<"删除失败!\n";
break;
case 8: //单链表的输出
cout<<"当前单链表的数据元素分别为:\n";
Listprint_L(L);
cout<<endl;
break;
}
}
return 0;
}