1. 程式人生 > >順序表的增刪改查操作

順序表的增刪改查操作

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define Elem int
#define status int
#define ok 1
#define no 0
#define list_int_size 100
#define listincrement 100
Elem * newbase,*p,*q;
typedef struct List{
    int length;//長度
    int listlength;//儲存容量
    Elem * elem;//陣列指標

};
//順序表的建立初始化
status init_list(List &l){
    l.elem=(Elem *)malloc(list_int_size*sizeof(Elem));//分配儲存空間
    if(!l.elem) exit(no);//儲存空間失敗
    l.length=0;
    l.listlength=list_int_size;
    return ok;
}
//順序表的插入
status list_insert(List &l,int i,Elem e){
    if(i<1||i>l.length+1) return no;
    if(l.length>l.listlength)//如果儲存空間不夠
    {
        newbase=(Elem *)realloc(l.elem,(l.listlength+listincrement)*sizeof(Elem));
        if(!newbase) exit(no);
        l.elem=newbase;//新的基地址
        l.listlength+=listincrement;
    }
    q=&(l.elem[i-1]);
    for(p=&(l.elem[l.length-1]);p>=q;p--){
        *(p+1)=*p;
    }
    *q=e;
    l.length++;
    return ok;

    }
    //順序表的刪除
     status list_delete(List &l,int i){
        if(i<0||i>l.length) return no;
        q=&(l.elem[l.length-1]);
        int e;
         e=l.elem[i-1];
        for(p=&(l.elem[i-1]);p<=q;p++){
            *p=*(p+1);
        }

         l.length--;
        return ok;
     }
     //順序表的修改
     status list_modify(List &la,int i,Elem e){
        if(i<0||i>la.length) return no;
         la.elem[i-1]=e;
         return 1;
     }
     //順序表的查詢
    status list_find(List la,Elem e){
        for(int i=0;i<la.length;i++){
            if(la.elem[i]==e)
                return i+1;
        }
        return no;
    }

     //順序表的合併,la,lb
     void merge_list(List &la,List lb){
         for(int i=0;i<la.length;i++){
             for(int  j=0;j<lb.length;j++){
                   // cout<<list_find(la,lb.elem[j])<<endl;
                if(list_find(la,lb.elem[j])==0){//如果la中不含lb中的某個元素,則將該元素插入到la中
                    list_insert(la,la.length+1,lb.elem[j]);

                }
             }
         }
     }
     //順序表的差    A-B
     void list_cha(List &A,List B,List &C){
         for(int i=0;i<A.length;i++){

                if(list_find(B,A.elem[i])==0){
                    list_insert(C,C.length+1,A.elem[i]);
                }

         }
     }
     //順序表的交
     void list_jiao(List &la,List lb,List &lc){
          for(int i=0;i<la.length;i++){
             for(int  j=0;j<lb.length;j++){
                //if(list_find(la,lb.elem[j])==1){
                    if(la.elem[i]==lb.elem[j])
                    list_insert(lc,lc.length+1,lb.elem[j]);
                }
             }
         }

     //順序表的顯示
     void show(List L){
            int k;
            for(int i=0;i<L.length;i++)
            cout<<L.elem[i]<<" ";
            cout<<endl;

     }
     //順序表的釋放
     void list_destroy(List &l){
             free(l.elem);
            l.length=0;
     }
     int main(){
     List L,la,lb,lc,ld,le;
     init_list(la);
     init_list(lb);
     init_list(lc);
     init_list(ld);
     init_list(le);
         for(int i=0;i<10;i++){
            la.elem[i]=i;
            lb.elem[i]=i+4;
            ld.elem[i]=i;
            le.elem[i]=i;
        }
         la.length=5;
         lb.length=5;
         ld.length=5;
         le.length=5;
         lc.length=0;
    int i,res,temp,a,b,c,e,m,n,flags;
    flags=-1;
    while(flags!=0)
    {
        cout<<"請選擇:";
        cout<<"1. 建立順序表  2. 輸入資料 3. 查詢 4. 插入  5. 刪除 6.修改資料 7. 輸出資料  8.輸出la和lb的資料  9.la和lb的並集  10.la和lb的交集  11.la和lb的差集  0. 退出"<<endl;
        cin>>flags;
        switch(flags)
        {
        case 1:
            if(init_list(L))                        //建立順序表
                cout<<"成功建立順序表\n\n";
            else
                cout<<"順序表建立失敗\n\n";
            break;
        case 2:                                        //輸入10個數
            cout<<"請輸入5個不同的數:\n";
            for(i=0;i<5;i++)
                cin>>L.elem[i];
            L.length=5;
            cout<<endl;
            break;
        case 3:                                        //順序表的查詢
            cout<<"請輸入所要查詢的數:";
            cin>>e;                            //輸入e,代表所要查詢的數值
            temp=list_find(L,e);
            if(temp!=0)
                cout<<e<<" 是第 "<<temp<<"個數.\n\n";
            else
                cout<<"ld查詢失敗!沒有這樣的數\n\n";
            break;
        case 4:                                        //順序表的插入
            cout<<"請輸入兩個數,分別代表插入的位置和插入數值:";
            cin>>a>>b;                //輸入a和b,a代表插入的位置,b代表插入的數值
            if(list_insert(L,a,b))
                cout<<"插入成功.\n\n";
            else
                cout<<"I插入失敗.\n\n";
            break;
        case 5:                                        //順序表的刪除
            cout<<"請輸入所要刪除的數的位置:";
            cin>>c;
                                //輸入c,代表要刪除數的位置
            if(list_delete(L,c))
                cout<<"刪除成功"<<endl;
            else
                cout<<"刪除失敗.\n\n";
            break;
        case 6:
            cout<<"輸入修改的位置和修改成的值:";
            cin>>m>>n;
            list_modify(L,m,n);
            break;
        case 7:
            show(L);
            break;
        case 8:
            cout<<"第一個順序表為:";
            show(ld);
            cout<<"第二個順序表為:";
            show(lb);
            break;
        case 9:
        merge_list(la,lb);
        cout<<"la和lb的並集:";
        show(la);
            break;
        case 10:
        list_jiao(ld,lb,lc);
        cout<<"la和lb的交集:";
        show(lc);
        list_destroy(lc);
        lc.length=0;
            break;
        case 11:
        list_cha(le,lb,lc);
        cout<<"la和lb的差集:";

        show(lc);
        list_destroy(lc);
            break;
        case 0:
            return 0;
        }
    }
}