資料結構之連結串列的基本操作
阿新 • • 發佈:2019-02-05
連結串列的基本操作。
#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; }