Danh sách liên kết đơn - CTDL

Thảo luận trong 'Thuật toán' bắt đầu bởi takechij, 28 Tháng ba 2011.

  1. Offline

    takechij

    • Windows 98

    • Try so hard
    Số bài viết:
    386
    Đã được thích:
    165
    Điểm thành tích:
    140
    Hiện dân mạng tụi mình đang học môn cấu trúc dữ liệu, với vốn kiến thức nông cạn về lập trình, mình xin mạo muội post một số bài về danh sách liên kết đơn (p/s: chỉ mới học tới đây thôi :D) mong được sự góp ý của mọi người nhé
    Với code bên dưới các bạn có thể custom thành bài về danh sách sinh viên hoặc tuơng tự... :)
    Code dưới đây mình sửa lại cho giống như cách viết trong giáo trình CTDL, tức là khi khai báo ta dùng các dấu "**" và "*"

    PHP:
    #include<iostream>
    using namespace std;

    //Khai bao cau truc
    struct node
    {
        
    int pt;
        
    struct node *next;
    };

    typedef node list;
    list *
    first,*ds2,*last;

    //Xoa sach cac node trong danh sach va khoi tao danh sach
    void clear_list(list **first)
    {
        list *
    p=*first;
        while(*
    first!=NULL)
        {
            *
    first=p->next;
            
    delete(p);
            
    p=*first;
        }
    }

    //In danh sach
    void print_list(list *first)
    {
        if(
    first==NULL)
            
    cout << "\nDanh sach rong";
        else
        {
            list *
    p=first;
            
    cout << "\nDanh sach:\n ";
            while(
    p!=NULL)
            {
                
    cout << p->pt << "\t";
                
    p=p->next;
            }
        }
    }

    //Dem so phan tu trong danh sach
    int count_list(list *first)
    {
        list *
    p=first;
        
    int c=1;
        while(
    p->next!=NULL)
        {
            
    p=p->next;
            
    c++;
        }
        return 
    c;
    }

    //Tinh tong gia tri cac phan tu trong danh sach
    int sum_list(list *first)
    {
        list *
    p=first;
        
    int s=0;
        if(
    first==NULL)
        {
            
    cout << "\nDanh sach rong\n";
            return 
    0;
        }
        else
        {
            while(
    p!=NULL)
            {
                
    s=s+p->pt;
                
    p=p->next;
            }
        }
        return 
    s;
    }

    //Tinh gia tri trung binh cac phan tu trong danh sach
    float avg_list(list *first)
    {
        list *
    p=first;
        
    float avg;
        if(
    first==NULL)
        {
            
    cout << "\nDanh sach rong\n";
            return 
    0;
        }
        return 
    avg=(float)sum_list(p)/(float)count_list(p);
    }

    //Tra ve node nam o vi tri n
    list *position_node(list *first,int n)
    {
        list *
    p=first;
        
    int c=1;
        while(
    c<n)
        {
            
    p=p->next;
            
    c++;
        }
        return 
    p;
    }

    //Chen vao dau danh sach
    void insert_first(list **firstint data)
    {
        list *
    p;
        
    p=new node;
        
    p->pt=data;
        
    p->next=*first;
        *
    first=p;
    }

    //Chen cuoi danh sach
    void insert_last(int data)
    {
        list *
    p;
        
    p=new node;
        
    p->pt=data;
        
    last->next=p;
        
    last=p;
        
    p->next=NULL;
    }

    //Ham chen node vao danh sach
    void insert_node(list **first)
    {
        
        
    int n,x,c;
        list *
    p=*first;
        if(
    p==NULL)
            
    cout << "\nDanh sach rong";
        else
        {
            
    cout << "\nNhap vi tri can chen: ";
            
    cin >> n;
            
    c=count_list(p);
            if(
    n<|| n>(c+1))
                
    cout << "\nVi tri khong hop le";
            else
            {
                
    cout << "\nNhap gia tri cho phan tu: ";
                
    cin >> x;
                if(
    n==1)
                    
    insert_first(first,x);
                else
                {
                    
    c=count_list(p);
                    if(
    n==c+1)
                        
    insert_last(x);
                    else
                    {
                        list *
    q;
                        
    q=new node;
                        
    q->pt=x;
                        
    q->next=position_node(p,n-1)->next;
                        
    position_node(p,n-1)->next=q;
                    }
                }
            }
        }
    }

    //Xoa node dau danh sach
    void del_first(list **first)
    {
        list *
    p;
        
    p=*first;
        *
    first=p->next;
    }

    //Xoa node cuoi danh sach
    void del_last(list **first)
    {
        list *
    p=*first;
        
    int c=1;
        
    int n=count_list(p);
        while(
    c<n-1)
        {
            
    p=p->next;
            
    c++;
        }
        
    delete(last);
        
    last=p;
        
    p->next=NULL;
    }

    //Xoa 1 node bat ki trong danh sach
    void del_node(list **first)
    {
        list *
    p=*first;
        
    int n,c;
        if(*
    first==NULL)
            
    cout << "\nDanh sach rong";
        else
        {
            
    cout << "\nNhap vi tri can xoa: ";
            
    cin >> n;
            
    c=count_list(p);
            if(
    n<|| n>c+1)
                
    cout << "\nVi tri khong hop le";
            else
            {
                if(
    n==1)
                    
    del_first(first);
                else
                {
                    
    c=count_list(p);
                    if(
    n==c)
                        
    del_last(first);
                    else
                    {
                        list *
    q,*t;
                        
    q=position_node(p,(n-1));
                        
    t=position_node(p,n);
                        
    q->next=t->next;
                        
    delete(t);
                    }
                }
            }
        }
    }

    //Dao nguoc danh sach
    void reverse_list(list **first)
    {
        if(*
    first==NULL)
            return;
        list *
    current,*previous,*f=*first;
        
    current=NULL;
        
    previous=NULL;
        while(
    f!=NULL)
        {
            
    current=f;
            
    f=f->next;
            
    current->next=previous;
            
    previous=current;
        }
        *
    first=current;
    }

    //Tim min
    list *min_list(list *first)
    {
        list *
    p=first,*min=p;
        while(
    p)
        {
            if(
    p->pt<min->pt)
                
    min=p;
            else
                
    p=p->next;
        }
        return 
    min;
    }

    //Sap xep tang dan
    void sort_list(list **first)
    {
        list *
    p=*first,*q;
        
    int tmp;
        while(
    p->next)
        {
            
    q=min_list(p);
            
    tmp=p->pt;
            
    p->pt=q->pt;
            
    q->pt=tmp;
            
    p=p->next;
        }
    }

    //Tao danh sach moi
    void create_list(list **first)
    {
        
    int n;
        list *
    p;
        
    cout << "\nNhap gia tri: ";
        
    cin >> n;flushall();
        while(
    n!=0)
        {
            
    p=new node;
            
    p->pt=n;
            if(*
    first==NULL)
                *
    first=p;
            else
                
    last->next=p;
            
    last=p;
            
    p->next=NULL;
            
    cout << "\nNhap gia tri: ";
            
    cin >> n;flushall();
        }
    }


    //Menu chuong trinh
    int menu()
    {
        
    int n;
        do
        {
            
    cout << "\n1. Tao danh sach";
            
    cout << "\n2. In danh sach";
            
    cout << "\n3. Xoa phan tu";
            
    cout << "\n4. Chen phan tu vao danh sach";
            
    cout << "\n5. Dao nguoi danh sach";
            
    cout << "\n6. Tinh tong gia tri cac phan tu trong danh sach";
            
    cout << "\n7. Tinh gia tri trung binh gia tri cac phan tu trong danh sach";
            
    cout << "\n8. Dem so phan tu trong danh sach";
            
    cout << "\n9. Nhap tiep vao danh sach";
            
    cout << "\n10. In ra phan tu co gia tri nho nhat trong danh sach";
            
    cout << "\n11. Sap xep danh sach tang dan";
            
    cout << "\n12. Xoa toan bo danh sach";
            
    cout << "\n\n0. Thoat chuong trinh";
            
    cout << "\n\n\tMoi ban chon tinh nang: ";
            
    cin >> n;
        }
        while(
    n<|| n>12);
        return 
    n;
    }

    //Chuong trinh chinh
    void main()
    {    
        
    int chucnang;
        do
        {
            
    chucnang=menu();
            
    flushall();
            switch(
    chucnang)
            {
            case 
    0:
                {break;}
            case 
    1:
                {
    system("cls");clear_list(&first);create_list(&first);system("cls");//create_new_list(ds2);
                
    break;}
            case 
    2:
                {
    system("cls");print_list(first);getch();break;}
            case 
    3:
                {
    system("cls");del_node(&first);getch();break;}
            case 
    4:
                {
    system("cls");insert_node(&first);getch();break;}
            case 
    5:
                {
    system("cls");reverse_list(&first);getch();break;}
            case 
    6:
                {
    system("cls");cout << "\nTong gia tri cac phan tu trong danh sach: "<<sum_list(first);getch();break;}
            case 
    7:
                {
    system("cls");cout << "\nGia tri trung binh cac phan tu trong danh sach: "<<avg_list(first);getch();break;}
            case 
    8:
                {
    system("cls");cout << "\nSo phan tu trong danh sach: "<<count_list(first);getch();break;}
            case 
    9:
                {
    system("cls");create_list(&first);getch();break;}
            case 
    10:
                {
    system("cls");cout << "\nGia tri nho nhat trong danh sach: " << min_list(first)->pt;getch();break;} 
            case 
    11:
                {
    system("cls");sort_list(&first);getch();break;}
            case 
    12:
                {
    system("cls");clear_list(&first);getch();break;}
            }
        }
        while(
    chucnang!=0);
    }
    Còn đây là code của mình lúc viết, mình không sử dụng các dấu "**" và "*" trong quá trình viết cho bớt nhập nhằng và dễ nhìn

    PHP:
    #include<iostream>
    using namespace std;

    //Khai bao cau truc
    struct node
    {
        
    int pt;
        
    struct node *next;
    };

    typedef node *list;
    list 
    first,last;

    //Xoa sach cac node trong danh sach va khoi tao danh sach
    void clear_list(list &first)
    {
        list 
    p=first;
        while(
    first!=NULL)
        {
            
    first=p->next;
            
    delete(p);
            
    p=first;
        }
    }

    //In danh sach
    void print_list(list first)
    {
        if(
    first==NULL)
            
    cout << "\nDanh sach rong";
        else
        {
            list 
    p=first;
            
    cout << "\nDanh sach:\n ";
            while(
    p!=NULL)
            {
                
    cout << p->pt << "\t";
                
    p=p->next;
            }
        }
    }

    //Dem so phan tu trong danh sach
    int count_list(list first)
    {
        list 
    p=first;
        
    int c=1;
        while(
    p->next!=NULL)
        {
            
    p=p->next;
            
    c++;
        }
        return 
    c;
    }

    //Tinh tong gia tri cac phan tu trong danh sach
    int sum_list(list first)
    {
        list 
    p=first;
        
    int s=0;
        if(
    first==NULL)
        {
            
    cout << "\nDanh sach rong\n";
            return 
    0;
        }
        else
        {
            while(
    p!=NULL)
            {
                
    s=s+p->pt;
                
    p=p->next;
            }
        }
        return 
    s;
    }

    //Tinh gia tri trung binh cac phan tu trong danh sach
    float avg_list(list first)
    {
        list 
    p=first;
        
    float avg;
        if(
    first==NULL)
        {
            
    cout << "\nDanh sach rong\n";
            return 
    0;
        }
        return 
    avg=(float)sum_list(p)/(float)count_list(p);
    }

    //Tra ve node nam o vi tri n
    list position_node(list first,int n)
    {
        list 
    p=first;
        
    int c=1;
        while(
    c<n)
        {
            
    p=p->next;
            
    c++;
        }
        return 
    p;
    }

    //Chen vao dau danh sach
    void insert_first(list &firstint data)
    {
        list 
    p;
        
    p=new node;
        
    p->pt=data;
        
    p->next=first;
        
    first=p;
    }

    //Chen cuoi danh sach
    void insert_last(int data)
    {
        list 
    p;
        
    p=new node;
        
    p->pt=data;
        
    last->next=p;
        
    last=p;
        
    p->next=NULL;
    }

    //Ham chen node vao danh sach
    void insert_node(list &first)
    {
        
        
    int n,x,c;
        list 
    p=first;
        if(
    p==NULL)
            
    cout << "\nDanh sach rong";
        else
        {
            
    cout << "\nNhap vi tri can chen: ";
            
    cin >> n;
            
    c=count_list(p);
            if(
    n<|| n>(c+1))
                
    cout << "\nVi tri khong hop le";
            else
            {
                
    cout << "\nNhap gia tri cho phan tu: ";
                
    cin >> x;
                if(
    n==1)
                    
    insert_first(first,x);
                else
                {
                    
    c=count_list(p);
                    if(
    n==c+1)
                        
    insert_last(x);
                    else
                    {
                        list 
    q;
                        
    q=new node;
                        
    q->pt=x;
                        
    q->next=position_node(p,n-1)->next;
                        
    position_node(p,n-1)->next=q;
                    }
                }
            }
        }
    }

    //Xoa node dau danh sach
    void del_first(list &first)
    {
        list 
    p;
        
    p=first;
        
    first=p->next;
    }

    //Xoa node cuoi danh sach
    void del_last(list &first)
    {
        list 
    p=first;
        
    int c=1;
        
    int n=count_list(p);
        while(
    c<n-1)
        {
            
    p=p->next;
            
    c++;
        }
        
    delete(last);
        
    last=p;
        
    p->next=NULL;
    }

    //Xoa 1 node bat ki trong danh sach
    void del_node(list &first)
    {
        list 
    p=first;
        
    int n,c;
        if(
    first==NULL)
            
    cout << "\nDanh sach rong";
        else
        {
            
    cout << "\nNhap vi tri can xoa: ";
            
    cin >> n;
            
    c=count_list(p);
            if(
    n<|| n>c+1)
                
    cout << "\nVi tri khong hop le";
            else
            {
                if(
    n==1)
                    
    del_first(first);
                else
                {
                    
    c=count_list(p);
                    if(
    n==c)
                        
    del_last(first);
                    else
                    {
                        list 
    q,t;
                        
    q=position_node(p,(n-1));
                        
    t=position_node(p,n);
                        
    q->next=t->next;
                        
    delete(t);
                    }
                }
            }
        }
    }

    //Dao nguoc danh sach
    void reverse_list(list &first)
    {
        if(
    first==NULL)
            return;
        list 
    current,previous;
        
    current=NULL;
        
    previous=NULL;
        while(
    first)
        {
            
    current=first;
            
    first=first->next;
            
    current->next=previous;
            
    previous=current;
        }
        
    first=current;
    }

    //Tim min
    list min_list(list first)
    {
        list 
    p=first,min=p;
        while(
    p)
        {
            if(
    p->pt<min->pt)
                
    min=p;
            else
                
    p=p->next;
        }
        return 
    min;
    }

    //Sap xep tang dan
    void sort_list(list &first)
    {
        list 
    p=first,q;
        
    int tmp;
        while(
    p->next)
        {
            
    q=min_list(p);
            
    tmp=p->pt;
            
    p->pt=q->pt;
            
    q->pt=tmp;
            
    p=p->next;
        }
    }
    //Tao danh sach moi
    void create_list(list &first)
    {
        
    int n;
        list 
    p;
        
    cout << "\nNhap gia tri: ";
        
    cin >> n;flushall();
        while(
    n!=0)
        {
            
    p=new node;
            
    p->pt=n;
            if(
    first==NULL)
                
    first=p;
            else
                
    last->next=p;
            
    last=p;
            
    p->next=NULL;
            
    cout << "\nNhap gia tri: ";
            
    cin >> n;flushall();
        }
    }

    //Menu chuong trinh
    int menu()
    {
        
    int n;
        do
        {
            
    cout << "\n1. Tao danh sach";
            
    cout << "\n2. In danh sach";
            
    cout << "\n3. Xoa phan tu";
            
    cout << "\n4. Chen phan tu vao danh sach";
            
    cout << "\n5. Dao nguoi danh sach";
            
    cout << "\n6. Tinh tong gia tri cac phan tu trong danh sach";
            
    cout << "\n7. Tinh gia tri trung binh gia tri cac phan tu trong danh sach";
            
    cout << "\n8. Dem so phan tu trong danh sach";
            
    cout << "\n9. Nhap tiep vao danh sach";
            
    cout << "\n10. In ra phan tu co gia tri nho nhat trong danh sach";
            
    cout << "\n11. Sap xep danh sach tang dan";
            
    cout << "\n12. Xoa toan bo danh sach";
            
    cout << "\n\n0. Thoat chuong trinh";
            
    cout << "\n\n\tMoi ban chon tinh nang: ";
            
    cin >> n;
        }
        while(
    n<|| n>12);
        return 
    n;
    }

    //Chuong trinh chinh
    void main()
    {    
        
    int chucnang;
        do
        {
            
    chucnang=menu();
            
    flushall();
            switch(
    chucnang)
            {
            case 
    0:
                {break;}
            case 
    1:
                {
    system("cls");clear_list(first);create_list(first);system("cls");break;}
            case 
    2:
                {
    system("cls");print_list(first);getch();break;}
            case 
    3:
                {
    system("cls");del_node(first);getch();break;}
            case 
    4:
                {
    system("cls");insert_node(first);getch();break;}
            case 
    5:
                {
    system("cls");reverse_list(first);getch();break;}
            case 
    6:
                {
    system("cls");cout << "\nTong gia tri cac phan tu trong danh sach: "<<sum_list(first);getch();break;}
            case 
    7:
                {
    system("cls");cout << "\nGia tri trung binh cac phan tu trong danh sach: "<<avg_list(first);getch();break;}
            case 
    8:
                {
    system("cls");cout << "\nSo phan tu trong danh sach: "<<count_list(first);getch();break;}
            case 
    9:
                {
    system("cls");create_list(first);getch();break;}
            case 
    10:
                {
    system("cls");cout << "\nGia tri nho nhat trong danh sach: " << min_list(first)->pt;getch();break;} 
            case 
    11:
                {
    system("cls");sort_list(first);getch();break;}
            case 
    12:
                {
    system("cls");clear_list(first);getch();break;}
            }
        }
        while(
    chucnang!=0);
    }

    chúc vui!
    duyvan, chickenkon, peutshf1 người khác thích bài này.
  2. 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ùng dấu * là con trỏ chỉ tới giá trị của ô nhớ. ** là con trỏ trỏ tới con trỏ đó. Khi bạn ghi dấu * là làm việc với giá trị, không để dấu * là làm việc với địa chỉ ô nhớ.
    Ở trên bạn khai báo biến toàn cục nên không cần dùng con trỏ để tham chiếu.
    Danh sách liên kết dùng nhiều trong cấp phát bộ nhớ động, cây. Hạn chế trong việc sắp xếp, tìm kiếm nên khi dùng thường chuyển qua danh sách đặc sau đó chuyển lại.
    Bài làm khá tốt !
    duyvan thích bài này.
  3. Offline

    takechij

    • Windows 98

    • Try so hard
    Số bài viết:
    386
    Đã được thích:
    165
    Điểm thành tích:
    140
    mấy buổi đầu học về danh sách liên kết, nhìn vào slide mà hok hiểu mấy cái dấu đó nó nó ý nghĩa như thế nào, lên search thì người ta cũng nói như integer vậy, cũng hok hiểu luôn, thế là bỏ nguyên tuần ra ngâm CTDL, h cũng có chút kiến thức nông cạn về nó và đồng thời cũng hiểu luôn mấy cái dấu đó nó làm việc như thế nào =)) :))
  4. 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
    Thực ra việc giải thích cho hiểu là một việc không dễ dàng, vì CTDL trường dạy phụ thuộc vào ngôn ngữ C để gần với việc cài đặt.
    Cuối cùng thứ gây khó dễ cho việc hiểu lại là ngôn ngữ và kiến thức của người giải thích chứ không hẳn là CTDL.

    bạn takechj code tốt đấy, nắm được phần này qua phần sau khá dễ dàng, vì phần sau chủ yếu là ứng dụng của danh sách.
    Mã:
    [COLOR=#000000][COLOR=#FF8000]//Dao nguoc danh sach 
    [/COLOR][COLOR=#0000BB]void reverse_list[/COLOR][COLOR=#007700](list **[/COLOR][COLOR=#0000BB]first[/COLOR][COLOR=#007700]) 
    { 
        if(*[/COLOR][COLOR=#0000BB]first[/COLOR][COLOR=#007700]==[/COLOR][COLOR=#0000BB]NULL[/COLOR][COLOR=#007700]) 
            return; 
        list *[/COLOR][COLOR=#0000BB]current[/COLOR][COLOR=#007700],*[/COLOR][COLOR=#0000BB]previous[/COLOR][COLOR=#007700],*[/COLOR][COLOR=#0000BB]f[/COLOR][COLOR=#007700]=*[/COLOR][COLOR=#0000BB]first[/COLOR][COLOR=#007700]; 
        [/COLOR][COLOR=#0000BB]current[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]NULL[/COLOR][COLOR=#007700]; 
        [/COLOR][COLOR=#0000BB]previous[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]NULL[/COLOR][COLOR=#007700]; 
        while([/COLOR][COLOR=#0000BB]f[/COLOR][COLOR=#007700]!=[/COLOR][COLOR=#0000BB]NULL[/COLOR][COLOR=#007700]) 
        { 
            [/COLOR][COLOR=#0000BB]current[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]f[/COLOR][COLOR=#007700]; 
            [/COLOR][COLOR=#0000BB]f[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]f[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]next[/COLOR][COLOR=#007700]; 
            [/COLOR][COLOR=#0000BB]current[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]next[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]previous[/COLOR][COLOR=#007700]; 
            [/COLOR][COLOR=#0000BB]previous[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]current[/COLOR][COLOR=#007700]; 
        } 
        *[/COLOR][COLOR=#0000BB]first[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]current[/COLOR][COLOR=#007700]; 
    } 
    [/COLOR][/COLOR]
    
    Cái này hơi phức tạp. đơn giản hơn ta chèn từng phần tử của P vào đầu danh sách Q là đảo ngược (Stack).
    [COLOR=#000000 ! important][FONT=Arial ! important][/FONT][/COLOR]
    Cat-IT thích bài này.
  5. Offline

    hoekaka

    • Windows 95

    Số bài viết:
    359
    Đã được thích:
    114
    Điểm thành tích:
    90
    kì này sẽ cải thiện môn này !
  6. Offline

    trsa

    • Thành Viên Mới

    Số bài viết:
    180
    Đã được thích:
    15
    Điểm thành tích:
    0
    Thấy các bạn nói về dslk rất hay nên mình cũng xin góp vui. Dưới đây là bài Quản Lý Sinh Viên viết bằng dslk đơn(đồ án cơ sở của mình năm ngoái), bạn nào có hứng thú thì tham khảo hì........
    Mã:
    #include	<conio.h>
    #include	<iostream.h>
    #include	<stdio.h>
    #include	<stdlib.h>
    #include	<dos.h>
    #include	<string.h>
    #include <ctype.h>
    #include 	<math.h>
    #define msk14 142121000
    #define TRUE 1 
    #define FALSE 0
        typedef struct sinhvien
           {
           	 long masv;
    	     int nsinh;
    	     char hoten[20],quequan[10],lop[5],gt[5];
           };
        typedef struct node
           {
             sinhvien A;
             node *next;
           };
    void khoitaods(node*&L)
    {
    	L=NULL;
    }
    node* taonode(sinhvien x)
    {    
    	node* p;
    	p = new node;
    	p->A = x;
    	p->next = NULL;
    }
    int ktradsrong(node*L)
    {
    	if(L==NULL)
    	   return (TRUE);
    	      return(FALSE);
    }
    void themdau(node*&L,sinhvien n)
    {
    	node*p=new node;
    	p->A=n;
    	p->next=NULL; 
    	   if(L==NULL)
    	      L=p;
              else
    	       {
    	       	  p->next=L;
    	       	  L=p;
    
    		   }
    }
    void themcuoi(node*&L,sinhvien n)
    {
        node*p=new node;
    	p->A=n;
    	p->next=NULL;
    	if(L==NULL)
    	    L=p;
      		 else
    		    {
    		  	  node*q=L;
    		  	  while(q->next!=NULL)
    		  	     q=q->next;
    		  	     q->next=p;
     	        }	
    }
    void nhapthem(node*&L,sinhvien &n)
    {int d;
    	   cout<<"\nho ten:";
           fflush(stdin);gets(n.hoten);
            while(1){    
    		cout<<"\nma so(nhap du 9so 142121...):";
            if(cin>>n.masv)
    		{
    		  if(n.masv<=msk14||n.masv>msk14+999)
    		  cout<<"nhap lai:";
    		  else break;
            }
    		  else
    		  {
    		  	cin.clear();
    		  	cin.ignore();
    		  	cout<<"\nnhap lai";
    		  }
    }
            node*p=L;
    	           while(p!=NULL)
    	       	    { if(n.masv==p->A.masv)
    	       	       { cout<<"\nMa sinh vien da co.";
          	       		 cout<<"\nNhap lai ma sinh vien:";
          	       		 cin>>n.masv;
    	       	       }else
          	       		 p=p->next;
    			      }
    	    cout<<"\nLop :";
            fflush(stdin);gets(n.lop);
            while(1){cout<<"\nNam sinh: ";
            if(cin>>n.nsinh)
            {
            	if(n.nsinh<1000||n.nsinh>=10000)
            	cout<<"\nNam sinh nhap sai. Nhap lai";
            	else
            	 break;
    		}
    		else {
    		        cin.clear();
    		        cin.ignore();
    		        cout<<"\nNam sinh nhap sai. Nhap lai";
    			 }
            }
            cout<<"\nGioi tinh: ";
            fflush(stdin);gets(n.gt);
            cout<<"\nQue Quan: ";
            fflush(stdin);gets(n.quequan);
    }
    void nhapsv(node*&L,sinhvien&n)
    {  int i=1;char c;
    	do{
    	    cout<<"\nnhap sinh vien thu"<<i;
    	    cout<<"\nBan co mun nhap khong (Y/N): ";
    	    cin>>c;
    	    if(c=='y')
    	    {
     	        nhapthem(L,n); 
    			themcuoi(L,n);
                    i++;
    	    }
    	    if(c=='n') break;  
    	    } while(1);
    	  cout<<"\nda nhap xong danh sach.";
    	  getch();
    }
    void duyetds(node*L)
    {   char c; 
    	if(L==NULL)
    		printf("\n Danh sach rong");
    	   else
    	      if(L!=NULL)
    	        { cout<<"  ho ten\t       maso\t    Lop\t      nam sinh  gioi tinh    que quan\n";
    	          node*p=L;
    	          while(p!=NULL)
       	             {
    					printf("\n %-20s%-15d%-12s%-12d%-10s%-20s",p->A.hoten,p->A.masv,p->A.lop,p->A.nsinh,p->A.gt,p->A.quequan);
    		            cout<<"\n";
    		            p=p->next;
    	              }
    		    }printf("\nDa duyet xong danh sach");getch();
    }
    void themvtri_k(node*&L, sinhvien n, int k)
    {
    	if(k<1)
    		printf("\n Vi tri khong hop le");
    		   else
    		     if(k==1)
    		      {  themdau(L,n);
    				printf("\nsinh vien da duoc bo sung");
    		      }
       	              else
    	                {
    			           node*p=L;int i=1;
                           while(p!=NULL && i<k-1)
    	                     {
    		                     i=i+1;
                                 p=p->next;
                             }
    	                        if(p==NULL)
    		                        printf("\n Vi tri khong hop le");
    		                        else
    		                           {
    	                                 node*t=new node;
    	                                 t->A=n;
    	                                 t->next=p->next;
    	                                 p->next=t;
                                         printf("\nsinh vien da duoc bo sung");
    									}
    	                 }
    }
    void docfile(node*&L)
    {   int n;
    	sinhvien x;
    	FILE* a = fopen("intput.txt","rt");
    	if(a!=NULL) 
    	{
    	fscanf(a,"%d",&n);
    	for(int i=1;i<=n;i++)
    	{   
    		fscanf(a,"%s%d%s%d%s%s",x.hoten,&x.masv,x.lop,&x.nsinh,x.gt,x.quequan);
    		node* p =taonode(x);
    		themcuoi(L,x);
    	}
    	fclose(a);
       }
    }
    void xoadau(node*&L)
    {
    	node*p=L;
    	   if(L==NULL)
    		  printf("\n Danh sach rong");
    	      else
    	         {	
    	           node*q=p;p=p->next;L=p;
                   printf("\n %-17s%-15d%-15s%-12d%-10s%-20s",q->A.hoten,q->A.masv,q->A.lop,q->A.nsinh,q->A.gt,q->A.quequan);
                   delete q;
    	         }getch();
    }
    void xoacuoi(node*&L)
    { 
        	if(L==NULL)
    	    	printf("\n Danh sach rong");
    	         else	
    	           {	
    			       node*p=L;
    			       while(p->next->next!=NULL)
    			       p=p->next;
    			       node*q=p->next;
    			       p->next=NULL;  
    	               printf("\n %-17s%-15d%-15s%-12d%-10s%-20s",q->A.hoten,q->A.masv,q->A.lop,q->A.nsinh,q->A.gt,q->A.quequan);
    	              delete q;
    		       }getch();		       
    }
    void xoavtri_k(node*&L, int&k)
    {
    	 int i;
    	  if(L==NULL)
    		 printf("\n Danh sach rong");
    		    else
    		       if(k<1)
    		          cout<<"vi tri xoa ko hop le";
    			      else 
    	                 if(k==1)
    		                 {
    						   node*q=L;
    						   L=L->next;
    						   printf("\n %-17s%-15d%-15s%-12d%-10s%-20s",q->A.hoten,q->A.masv,q->A.lop,q->A.nsinh,q->A.gt,q->A.quequan);
    						   delete q;
    		                 }
    		                 else
    		                    {
    	                             node*p=L;int i=1;
                                     while(p!=NULL && i<k-1)
    	                                {
    		                               i=i+1;
            	                           p=p->next;
    	                                }
    	                              if(p==NULL||p->next==NULL)
    		                              printf("\n Sinh vien loai bo khong hop le");
    	                                        else
    				                     		  	{
    	                                               node*q=p->next;p->next=q->next;
            	                                       printf("\n sinh vien duoc loai bo");
    	                                               printf("\n %-17s%-15d%-15s%-12d%-10s%-20s",q->A.hoten,q->A.masv,q->A.lop,q->A.nsinh,q->A.gt,q->A.quequan);
                                                       delete q;
    						                        }
                                }getch();
    }
    void sapxepds(node*&L)
    {   node*p; 
    	sinhvien tam;
    	if(L==NULL)
    	  cout<<"danh sach rong";
         else  
    	 {
    	  {
    	   p=L;
           while(p!=NULL)
    	    	{
    		       node*q=p->next;
    		       while(q!=NULL)
    			      {
    			         if(p->A.masv>q->A.masv)
    				       {
    			    	      tam=p->A; p->A=q->A;
    				          q->A=tam;
    			           }
    			         q=q->next;
    		          }
    		       p=p->next;
    	        }
    	}
    	    cout<<"  ho ten\t    maso\t Lop\t      nam sinh   gioi tinh    que quan\n";
    	       p=L;
    	       while(p!=NULL)
    	           {
    		         printf("\n %-17s%-15d%-15s%-12d%-10s%-20s",p->A.hoten,p->A.masv,p->A.lop,p->A.nsinh,p->A.gt,p->A.quequan);
    	             p=p->next;
                   }printf("\n Danh sach da duoc sap xep");
        }getch();
    }
    void timptu(node*&L, int masv)
    {	
    	node*p=L;
    	while(p!=NULL && p->A.masv!=masv)
    		p=p->next;
    	    if(p==NULL)
    		     printf("\nkhong co sinh vien can tim");
    	         else 
    	            {
    		           printf("\n Sinh vien can tim\n");
    		           cout<<"  ho ten\t    maso\t Lop\t      nam sinh   gioi tinh    que quan\n";
    		           printf("\n %-17s%-15d%-15s%-12d%-10s%-20s",p->A.hoten,p->A.masv,p->A.lop,p->A.nsinh,p->A.gt,p->A.quequan);
    	               printf("\nDa tim xong");
    			    }
    			getch();
    }
    void main()
    {
    	node*L;
    	sinhvien n;
    	khoitaods(L);
    	docfile(L);
            int vtri;char c;
    		do {
    		printf("\n ********* MENU CHUONG TRINH *********");	
    		printf("\n");
    		printf("\n CHUONG TRINH QUAN LY SINH VIEN KHOA K14");
    		printf("\n 0- Nhap danh sach sinh vien");
    		printf("\n 1- Bo sung sinh vien vao dau danh sach");
    		printf("\n 2- Bo sung sinh vien vao cuoi danh sach");
    		printf("\n 3- Bo sung sinh vien vao trong danh sach");
    		printf("\n 4- Loai bo sinh vien o dau danh sach");
    		printf("\n 5- Loai bo sinh vien o cuoi danh sach");
    		printf("\n 6- Loai bo sinh vien trong danh sach");
    		printf("\n 7- Xem danh sach sinh vien");
    		printf("\n 8- sap xep danh sach theo ma so sinh vien");
    		printf("\n 9- Tim kiem mot sinh vien trong danh sach");
    		printf("\n E- Thoat khoi chuong trinh");
    		printf("\n");
    		cout<<"\nchon cong viec:";
    		cin>>c;
    		switch(c){
    			case '0': nhapsv(L,n);getch();break;
    			case '1':
    				nhapthem(L,n);
    				themdau(L,n); 
    				printf("\nsinh vien da duoc bo sung");
    				getch();break;
    			case '2':
    				nhapthem(L,n);
    				themcuoi(L,n);
    				printf("\nsinh vien da duoc bo sung");getch(); break;
    			case '3':
    				printf("\n Vi tri them:"); scanf("%d",&vtri);
    				nhapthem(L,n);
    				themvtri_k(L,n,vtri); 
    				getch(); break;
    			case '4': xoadau(L);
    			    printf("\nsinh vien da duoc loai bo");getch();break;
    			case '5': xoacuoi(L);
                    printf("\nsinh vien da duoc loai bo");getch();break;
    			case '6':
    				fflush(stdin);printf("\n Vi tri loai bo:");
    				scanf("%d",&vtri);
    				xoavtri_k(L,vtri);
    				printf("\nsinh vien da duoc loai bo");getch();break;
    			case '7':  duyetds(L);getch();
    			           break;
    			case '8': sapxepds(L);getch();break;
    			case '9':
    				while(1){    
    		              cout<<"\nma so(nhap du 9so 142121...):";
                          if(cin>>n.masv)
    		               {
    		                 if(n.masv<=msk14||n.masv>msk14+999)
    	                     cout<<"nhap lai:";
    		                   else break;
                           }
                           else
    		                   {
    		  	                 cin.clear();
      	                         cin.ignore();
    		  	                 cout<<"\nnhap lai";
    		                    }
                           }
    				timptu(L, n.masv);getch();break;
    		}
    	} while(c!='E');
    return 0;
    }
    
    
    takechij thích bài này.
  7. Offline

    takechij

    • Windows 98

    • Try so hard
    Số bài viết:
    386
    Đã được thích:
    165
    Điểm thành tích:
    140
    định ít bữa nữa share bài này nhưng bác trsa làm trước mất rồi :(
  8. Offline

    trsa

    • Thành Viên Mới

    Số bài viết:
    180
    Đã được thích:
    15
    Điểm thành tích:
    0
    zậy cho mình xl nha=P~
  9. Offline

    Cat-IT

    • Windows NT

    Số bài viết:
    261
    Đã được thích:
    51
    Điểm thành tích:
    60
    thank takechj.. :))
  10. Offline

    vanlinhit

    • Thành Viên Mới

    Số bài viết:
    1
    Đã được thích:
    0
    Điểm thành tích:
    0
    Cái bài này làm thêm nhập điểm thì sao nhĩ, vd: dtoan, dly, dhoa, dtb;
    - sắp xếp giảm dần theo dtb.
    - xếp vị thứ nữa.

    nhờ chỉ giáo thêm

Chia sẻ trang này

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