1. 程式人生 > >資料結構之連結串列的基本操作

資料結構之連結串列的基本操作

連結串列的基本操作。
#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;
}