注意:沒有使用malloc和free;加了一個頭文件,用於清屏和暫停;還有就是一個錯誤特別容易被忽略,那就是主函數中聲明了LinkList p,然后就直接創建鏈表,忘了給p分配空間。一定要先初始化鏈表再建立。以下代碼說白了就是一個個的函數堆出來的,只是要注意函數的參數有時候有引用符&,有時候沒有,我總結了一個便於記憶的小技巧:如果你想要對鏈表做出任何改變,請一定加上&;如果你對鏈表不想做出改變,就可以不用加,無論你加還是不加,為了保險,可以都加上。如果擅長用指針的話,就忽略從此段話!!!!!
#include<iostream>
#include<cstdlib>
using namespace std;
struct LNode{
int data;
LNode* next;
};
typedef LNode *LinkList;
//函數聲明
void show();
void InitList(LinkList &L);
int CreateList(LinkList &L,int n);
int InsertList(LinkList &L,int index,int e);
string GetElem(LinkList L,int index,int &e);
int deleteList(LinkList &L,int index,int &e);
void PrintList(LinkList L);
int main(){
int action,length,index,result,e;
string res;
LinkList L;
show();
while(cin>>action){
switch(action){
case 1://初始化鏈表
system("cls");
InitList(L);
break;
case 2://建立鏈表
system("cls");
cout<<"請輸入鏈表的長度:"<<endl;
cin>>length;
result=CreateList(L,length);
if(!result){
cout<<"創建鏈表失敗!"<<endl;
} else {
cout<<"創建鏈表成功!"<<endl;
}
break;
case 3://向鏈表中插入數據
system("cls");
cout<<"請輸入想要插入的位置和插入元素的值:"<<endl;
cin>>index>>e;
InsertList(L,index,e);
break;
case 4://獲取索引為index的元素值
system("cls");
cout<<"請輸入索引:"<<endl;
cin>>index;
res=GetElem(L,index,e);
if(res=="yes"){
cout<<"第"<<index<<"個數是"<<e<<endl;
} else {
cout<<"未找到該索引的值"<<endl;
}
break;
case 5://刪除索引為index的值
system("cls");
cout<<"請輸入想要刪除的數的索引:"<<endl;
cin>>index;
deleteList(L,index,e);
cout<<"第"<<index<<"個元素已經被刪除!"<<endl;
break;
case 6://打印鏈表
system("cls");
cout<<"鏈表內容為:"<<endl;
PrintList(L);
break;
case 7://退出
return 0;
}
system("pause");//暫停
system("cls");//清屏
show();
}
}
//主界面
void show(){
cout<<"+----------------------------------------+"<<endl;
cout<<"| |"<<endl;
cout<<"| 1->初始化鏈表 |"<<endl;
cout<<"| 2->創建鏈表 |"<<endl;
cout<<"| 3->插入結點 |"<<endl;
cout<<"| 4->查找結點 |"<<endl;
cout<<"| 5->刪除節點 |"<<endl;
cout<<"| 6->打印鏈表 |"<<endl;
cout<<"| 7->退出 |"<<endl;
cout<<"| |"<<endl;
cout<<"+----------------------------------------+"<<endl;
}
//初始化鏈表
void InitList(LinkList &L){
L=new LNode;
cout<<"鏈表初始化成功!"<<endl;
}
//創建鏈表
//尾插法,最先進入的元素在最末尾
//int CreateList(LinkList &L,int n){
// cout<<"請依次輸入結點的值:"<<endl;
// L->next=NULL;
// int i;
// for(i=0;i<n;i++){
// LinkList p=new LNode;
// cin>>p->data;
// p->next=L->next;
// L->next=p;
// }
// if(i!=n){
// return 0;//失敗
// } else {
// return 1;//成功
// }
//}
//正序創建,按照輸入順序存儲
int CreateList(LinkList &L,int length){
cout<<"請依次輸入結點的值:"<<endl;
LinkList p,q;
L->next=NULL;
p=L;
for(int i=0,x;i<length;i++){
LinkList q=new LNode;
cin>>x;
q->data=x;
p->next=q;
p=p->next;
}
p->next=NULL;
return 1;
}
//獲取第i個結點的值
string GetElem(LinkList L,int i,int &e){
LinkList p;
p=L->next;
int j=1;
while(p&&j<i){
p=p->next;
j++;
}
if(!p||j>i){
return "no";//未找到
} else {
e=p->data;
return "yes";//找到
}
}
//將值為e的結點插入到第i個位置
int InsertList(LinkList &L,int i,int e){
LinkList p;
p=L;
int j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(!p||j>i-1){
return 0; //失敗
} else {
LinkList s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return 1;//成功
}
}
//刪除第i個結點,並將結點的值保存到e中
int deleteList(LinkList &L,int i,int &e){
LinkList p,q;
p=L;
int j=0;
while(p->next&&j<i-1){
p=p->next;
j++;
}
if(!(p->next)&&j>i-1){
return 0;
}
q=p->next;
p->next=q->next;
e=q->data;
delete q;//釋放q結點,節約空間
return e;
}
//打印鏈表
void PrintList(LinkList L){
LinkList p;
p=L;
while(p->next){
p=p->next;
cout<<p->data<<" ";
}
cout<<endl;
}
