链表的基本操作。
#include<iostream>
#include<cstring>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;
typedef int ElemType;
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status InitList(LinkList &L){//建立一个空链表
L=new LNode;
L->next=NULL;
return OK;
}
Status InputList(LinkList &L,ElemType n){//前插法输入链表中的数据
LNode *p,*r;//LNode *p与LinkList p的作用是一样的
int i;
// L=new LNode;
r=L;
cout<<"请输入"<<n<<"个数字:"<<endl;
for(i=0;i<n;i++){ //for(i=n-1;i>=0;i--)此为后插法
p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
return OK;
}
Status GetNumber(LinkList L,int i,ElemType &num){//根据在链表中的位置搜索该位置的数值
LNode *p;
int j;
j=0;
p=L->next;
while(p&&j<i){
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
num=p->data;
return OK;
}
Status GetAdress(LinkList L,ElemType num){//根据所给的数值输出该数字在链表中的位置
LNode *p;
int cas=1;
p=L->next;
while(p&&p->data!=num){
p=p->next;//printf("right\n");
++cas;
}
return cas;
}
Status InsertList(LinkList &L,int i,ElemType &num){//在链表中进行插入操作
LNode *p,*s;
int j=0;
p=L;
while(p&&j<i-1){
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
s=new LNode;
s->data=num;
s->next=p->next;
p->next=s;
return OK;
}
Status DeleteList(LinkList &L,int i,ElemType &n){//删除链表中的数据
LNode *p,*q;
p=L;
int j=0;
while(p->next&&j<i-1){
p=p->next;
++j;
// cout<<"ERROR"<<endl;
}
if(!(p->next)||j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
n=q->data;
delete q;
return OK;
}
void OutputList(LinkList L){//输出链表中的数据
LinkList p;
p=L->next;
while(p){
// cout<<ERROR;
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
// return OK;
}
int main(){
int temp,num_a,num_b,num_c,num_d;
LinkList L;
LinkList R;
int num_deal,flag;
cout<<"1. 建立链表\n";
cout<<"2. 输入数据\n";
cout<<"3. 按位置查找\n";
cout<<"4. 按值查找\n";
cout<<"5. 链表的插入\n";
cout<<"6. 链表的删除\n";
cout<<"7. 输出数据\n";
cout<<"0. 退出\n\n";
while(true){
cout<<"请输入你的选项:"<<endl;
cin>>temp;
if(temp==0)
break;
flag=0;
switch(temp){
case 1:
flag=InitList(L);
if(flag)
cout<<"链表建立成功!"<<endl;
else
cout<<"链表建立失败!"<<endl;
break;
case 2:
int ans_fir;
cout<<"请输入你想要输入的数据的个数:"<<endl;
cin>>ans_fir;
flag=InputList(L,ans_fir);
if(flag)
cout<<"操作成功!"<<endl<<endl;
else
cout<<"操作失败!"<<endl<<endl;
break;
case 3:
int ans_sec;
cout<<"请输入你所要查找的位置:"<<endl;
cin>>ans_sec;
flag=GetNumber(L,ans_sec-1,num_a);
if(flag)
cout<<"你所要查找的位置的数字为"<<num_a<<endl<<endl;
else
cout<<"搜索失败!"<<endl<<endl;
break;
case 4:
int ans_thi;
cout<<"请输入你所要查找的数字:"<<endl<<endl;
cin>>ans_thi;
flag=GetAdress(L,ans_thi);
if(flag)
cout<<"你所要查找的数字的位置为"<<flag<<endl<<endl;
else
cout<<"查找失败!"<<endl;
break;
case 5:
int ans_for,ans_fif;
cout<<"请输入你所要插入的位置和数字:"<<endl<<endl;
cin>>ans_for>>ans_fif;
flag=InsertList(L,ans_for,ans_fif);
if(flag)
cout<<"插入成功!"<<endl<<endl;
else
cout<<"插入失败!"<<endl<<endl;
break;
case 6:
int ans_six;
cout<<"请输入你所要删除的数字的位置:"<<endl<<endl;
cin>>ans_six;
flag=DeleteList(L,ans_six,num_c);
if(flag)
cout<<"你所要删除的数字为:"<<num_c<<endl<<endl;
else
cout<<"该数字无法删除!"<<endl<<endl;
break;
case 7:
OutputList(L);
break;
default:
cout<<"操作不合法!"<<endl<<endl;
break;
}
}
return 0;
}