Ôn tập CDTL !

Thảo luận trong 'C/C++' bắt đầu bởi integer, 4 Tháng một 2011.

  1. Offline

    integer

    • Tiếu Ngạo Giang Hồ

    • :-?
    Số bài viết:
    1.695
    Đã được thích:
    1.313
    Điểm thành tích:
    900
    Dưới đây là 1 bài về danh sách đặc. Nhập xuất xóa chèn, có thêm 2 hàm chuyển danh sách đặc qua liên kết và ngược lại. 2 thuật toán tìm kiếm bằng đệ quy và không đệ quy.
    Mã:
    #include<iostream>
    #include<conio.h>
    #include<stdio.h>
    #include<string.h>
    #define max 10
    using namespace std;
    typedef struct
    {
        char ten[30],masv[10];
        int tuoi;
        float diem;
    }danhsach;
    typedef struct node
    {
        char masv[10];
        node *link;
    }dslk;
    typedef struct
    {
        char masv[10];
    }dsd;
    void nhap(danhsach sv[],
              int &n)
    {
        cout<<"\nNhap so sinh vien: ";
        cin>>n;cin.get();
        for(int i=0;i<n;i++)
        {
            cout<<"\nNhap sv thu: "<<i+1;
            cout<<"\nNhap ten: ";
            cin>>sv[i].ten;cin.get();
            cout<<"\nNhap masv: ";
            cin>>sv[i].masv;cin.get();
            cout<<"\nNhap tuoi: ";
            cin>>sv[i].tuoi;cin.get();
            cout<<"\nNhap diem: ";
            cin>>sv[i].diem;cin.get();
        }
    }
    void xuat(danhsach sv[],int n)
    {
        cout<<"\nTen\tMa sv\tTuoi\tDiem\n";
        for(int i=0;i<n;i++)
        {
            cout<<sv[i].ten<<"\t"<<sv[i].masv<<"\t"<<sv[i].tuoi<<"\t"<<sv[i].diem<<"\n";
        }
    }
    void chen(danhsach sv[],int &n)
    {
        if(n<max)
        {
            danhsach tmp[1];
            int x;
            cout<<"\nNhap gia tri can chen";
                cout<<"\nNhap ten: ";
                cin>>tmp[0].ten;cin.get();
                cout<<"\nNhap masv: ";
                cin>>tmp[0].masv;cin.get();
                cout<<"\nNhap tuoi: ";
                cin>>tmp[0].tuoi; cin.get();
                cout<<"\nNhap diem: ";
                cin>>tmp[0].diem; cin.get();
            cout<<"\nNhap vi tri can chen: ";//vi tri bat dau tu 0
            cin>>x;
            if(x>=0 && x<=n)
            {
                for(int i=x;i<=n;i++)
                    sv[i+1]=sv[i];
                n++;
                sv[x]=tmp[0];
            }
            else
                cout<<"\nVi tri ko hop le!";
        }
        else
            cout<<"\nDanh sach day.";
    }
    void xoa(danhsach sv[],int &n)
    {
        int x;
        cout<<"\nXoa sinh vien thu: ";
        cin>>x;cin.get();
        if(x>=0 && x<= n)
        {
            for(int i=x;i<=n;i++)
                sv[i]=sv[i+1];
            n--;
        }
        else
            cout<<"\nVi tri ko hop le !";
    }
    /*int tknp(int l,int r,danhsach sv[],char x[])//de quy
    {
        int loc;
        if(l>r)
            loc=0;
        int m=(l+r)/2;
        if(strcmp(x,sv[m].masv)<0)
            loc=tknp(l,m-1,sv,x);
        if(strcmp(x,sv[m].masv)>0)
            loc=tknp(m+1,r,sv,x);
        else
            loc=m;
        return loc;
    }*/
    int tknp(danhsach sv[],int n,char x[]) //ko de quy
    {
        int l=0, r=n;
        while(l<=r)
        {
            int m=(l+r)/2;
            if(strcmp(x,sv[m].masv)<0)
                r=m-1;
            else
                if(strcmp(x,sv[m].masv)>0)
                    l=m+1;
                else
                    return m;
        }return -1;
    }
    int unexchange(dslk **T,dsd d[])
    {
        dslk *P;
        P=*T;
        int i=0;
        while(P!=NULL)
        {
            strcpy(d[i].masv,P->masv);
            i++;
            P=P->link;
        }
    }
    int exchange(dslk **T,danhsach sv[],int n,char x[])
    {
        dslk *P;
        P=new dslk;
        strcpy(P->masv,x);
        P->link=(*T);
        (*T)=P;
    
    }
    void indslk(dslk **T)
    {
        dslk *P;
        P=*T;
        while(P!=NULL)
        {
            cout<<P->masv<<"\t";
            P=P->link;
        }
    }
    char *tktt(dslk *T,char x[])//de quy
    {
        if(T==NULL)
            return 0;
        else
            if(strcmp(T->masv,x)==0)
                {
                    return T->masv;
                }
            else
                tktt(T->link,x);
    
    }
    /*int tktt(danhsach sv[],int n,char x[])// khong de quy
    {
        int i=0;
        strcpy(sv[n].masv,x);
        while(strcmp(sv[i].masv,sv[n].masv)!=0)
            i++;
        if(i<n)
            return i;
        return -1;
    }*/
    main()
    {
        dslk *T;
        T=NULL;
        danhsach sv[max];
        dsd d[max];
        int n;
        nhap(sv,n);
        //xuat(sv,n);
        //chen(sv,n);
        xuat(sv,n);
        for(int i=0;i<n;i++)
            exchange(&T,sv,n,sv[i].masv);//chuyen qua ds lk
        cout<<"\nDanh sach lien ket ma sv: ";
        indslk(&T);
        cout<<"\nChuyen danh sach lien ket qua ds dac: ";
        unexchange(&T,d);
        for(int k=0;k<n;k++)
            cout<<d[k].masv<<"\t";
        char s[10];
        cout<<"\nNhap ma sv can tim kiem: ";
        cin>>s;
        cout<<"\nTim thay: "<<tktt(T,s);
    }
    
    
    Hàm tìm kiếm tuần tự sau chỉ dùng 1 phép so sánh, đơn giản hơn hàm trong silde các bạn đang học.
    Tư tưởng: dùng giá trị của mảng tại vị trí n làm chốt, giá trị bằng giá trị cần tìm kiếm. nhằm giảm bớt 1 phép so sánh.
    Mã:
    /*int tktt(danhsach sv[],int n,char x[])// khong de quy
    {
        int i=0;
        strcpy(sv[n].masv,x);
        while(strcmp(sv[i].masv,sv[n].masv)!=0)
            i++;
        if(i<n)
            return i;
        return -1;
    }*/
    zphuoocm, minhtam, Chiefree1 người khác thích bài này.
  2. Offline

    Chiefree

    • Thành viên sáng lập

    Số bài viết:
    438
    Đã được thích:
    268
    Điểm thành tích:
    220

    Cách này hay. Áp dụng cho tìm kiếm chuỗi.
    Còn tìm kiếm số thì dùng cách kia.
    minhtam thích bài này.
  3. Offline

    minhtam

    • Windows 98

    Số bài viết:
    460
    Đã được thích:
    177
    Điểm thành tích:
    140
    còn phần ôn tập nào thì đưa lên lun nà:simper:

Chia sẻ trang này

Advertising: Linux system admin | nukeviet | nukeviet 4 | Upload ảnh miễn phí