注意:沒有使用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; }