#include<iostream> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; //Status 是函數返回值類型,其值是函數結果狀態代碼。 typedef int ElemType; //ElemType 爲可定義的數據類型,此設爲int類型 typedef struct LNode { ElemType data; //結點的數據域 struct LNode *next; //結點的指針域 }LNode,*LinkList; //LinkList爲指向結構體LNode的指針類型 Status InitList_L(LinkList &L){ //算法2.5 單鏈表的初始化 //構造一個空的單鏈表L L=new LNode; //生成新結點作爲頭結點,用頭指針L指向頭結點 L->next=NULL; //頭結點的指針域置空 return OK; } Status GetElem_L(LinkList L,int i,ElemType &e){ //算法2.6 按序號查找 //在帶頭結點的單鏈表L中查找第i個元素 int j; LNode *p; p=L->next;j=1; //初始化,p指向第一個結點,j爲計數器 while(j<i&&p){ //順鏈域向後掃描,直到p指向第i個元素或p爲空 p=p->next;++j; } if(!p || j>i) return ERROR; //第i個元素不存在 e=p->data; //取第i個元素 return OK; } //GetElem_L LNode *LocateElem_L(LinkList L,ElemType e){ //算法2.7 按值查找 //在帶頭結點的單鏈表L中查找值爲e的元素 LNode *p; p=L->next; while(p&&p->data!=e) p=p->next; //尋找滿足條件的結點 return p; //返回L中的值爲e的數據元素的位置,查找失敗返回NULL } //LocateElem_L Status ListInsert_L(LinkList &L,int i,ElemType &e){ //算法2.8 單鏈表的插入 //在帶頭結點的單鏈表L中第i個位置之前插入元素e int j; LNode *p,*s; p=L;j=0; while(p && j<i-1){p=p->next;++j;} //尋找第i-1個結點 if(!p||j>i-1) return ERROR; //i大於表長+1或者小於1 s=new LNode; //生成新結點s s->data=e; //將結點s的數據域置爲e s->next=p->next; //將結點s插入L中 p->next=s; return OK; } //ListInsert_L Status ListDelete_L(LinkList &L,int i,ElemType &e){ //算法2.9 單鏈表的刪除 //在帶頭結點的單鏈表L中,刪除第i個位置,並由e返回值 LNode *p,*q; int j; p=L;j=0; while(p->next && j<i-1){p=p->next;++j;} //尋找第i-1個結點 if(!(p->next) || j>i-1) return ERROR; //i大於表長+1或者小於1 q=p->next; //臨時保存被刪結點的地址以備釋放 p->next=q->next; //改變刪除結點前驅結點的指針域 e=q->data; //保存刪除結點的數據域 delete q; //釋放刪除結點的空間 return OK; } //ListDelete_L void CreateList_F(LinkList &L,int n){ //算法2.10 前插法創建單鏈表 //逆位序輸入n個元素的值,建立到頭結點的單鏈表L LNode *p; L=new LNode; L->next=NULL; //先建立一個帶頭結點的空鏈表 cout<<"請輸入 "<<n<<" 個數:\n"; for(int i=n;i>0;--i){ p=new LNode; //生成新結點 cin>>p->data; //輸入元素值 p->next=L->next;L->next=p; //插入到表頭 } } //CreateList_F void CreateList_L(LinkList &L,int n){ //算法2.11 後插法創建單鏈表 //正位序輸入n個元素的值,建立到頭結點的單鏈表L LNode *r,*p; L=new LNode; L->next=NULL; //先建立一個帶頭結點的空鏈表 r=L; //尾指針r指向頭結點 cout<<"請輸入 "<<n<<" 個數:\n"; for(int i=0;i<n;i++){ p=new LNode; //生成新結點 cin>>p->data; //輸入元素值 p->next=NULL;r->next=p; //插入到表尾 r=p; //r指向新的尾結點 } } //CreateList_L int main() { int res,a,b,choose; LNode *L,*p; 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"; choose=-1; while(choose!=0) { cout<<"請選擇:"; cin>>choose; switch(choose) { case 1: //建立一個單鏈表 if(InitList_L(L)) cout<<"成功建立鏈表!\n\n"; break; case 2: //使用後插法創建單鏈表 CreateList_L(L,10); cout<<"成功創建鏈表!\n\n"; break; case 3: //單鏈表的按序號查找 cout<<"請輸入一個位置用來查找:"; cin>>a; if(GetElem_L(L,a,res)) cout<<"查找成功!第"<<a<<"個數是:"<<res<<"\n\n"; else cout<<"查找失敗\n\n"; break; case 4: //單鏈表的按值查找 cout<<"請輸入一個數值用來查找:"; cin>>b; if(LocateElem_L(L,b)!=NULL) cout<<"查找成功\n\n"; else cout<<"查找失敗! "<<b<<" 沒有找到\n\n"; break; case 5: //單鏈表的插入 cout<<"請輸入兩個數分別代表插入的位置和數值:"; cin>>a>>b; if(ListInsert_L(L,a,b)) cout<<"成功將"<<b<<"插在第"<<a<<"個位置\n\n"; else cout<<"插入失敗!\n\n"; break; case 6: //單鏈表的刪除 cout<<"請輸入一個位置用來刪除:"; cin>>a; if(ListDelete_L(L,a,res)) cout<<"刪除成功!被刪除的數是:"<<res<<"\n\n"; else cout<<"刪除失敗!\n\n"; break; case 7: //單鏈表的輸出 cout<<"現在鏈表裏的數分別是:\n"; p=L->next; while(p) { cout<<p->data<<" "; p=p->next; } cout<<endl; break; } } return 0; }