Information Technology VietNam

Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

4 posters

    bài Danh sách liên kết đơn

    tranthinh_it
    tranthinh_it
    Newbie
    Newbie


    Giới tính : Nam Bài gửi : 2
    Tổng Điểm : 4
    Điểm Thưởng : 0
    Sinh Nhật : 26/10/1989 Bị Dụ Dỗ : 02/12/2009
    Tuổi : 35

    bài Danh sách liên kết đơn Empty bài Danh sách liên kết đơn

    Bài gửi by tranthinh_it 2/12/2009, 18:41

    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    typedef struct sinhvien
    {
        char hoten[30];
        int masv;
    }SV;
    typedef struct node
    {
        SV info;
        struct node *pNext;
    }NODE;
    typedef struct tagList
    {
        NODE* pHead;
        NODE* pTail;
    }LIST;
    int IsEmptyList(LIST &l)
    {
     return ((l.pHead==NULL)&&(l.pTail==NULL));
    }
    void Init(LIST &l)
    {
        l.pHead = l.pTail=NULL;
    }
    NODE* GetNode(SV x)
    {
     NODE *p;
        p = new NODE;
        if(p==NULL)
        {
            printf("Khong du bo nho");
            exit(1);
        }
        p->info = x;
        p->pNext = NULL;
        return p;
    }
    void AddFirst(LIST &l, NODE* new_ele)
    {
        if(l.pHead ==NULL)
        {
            l.pHead = new_ele;
            l.pTail = l.pHead;
        }
     else
        {
            new_ele->pNext = l.pHead;
            l.pHead = new_ele;
        }
    }
    void AddTail(LIST &l,NODE* new_ele)
    {
     if(l.pHead==NULL)
     l.pHead=l.pTail=new_ele;
     else
     {
     l.pTail->pNext=new_ele;
     l.pTail=new_ele;
     }
    }
    void AddAfter(LIST &l,NODE* q,NODE* new_ele)
    {
     int Masv;
     printf("Chen sau Masv:");
     fflush(stdin);
     scanf("%d",&Masv);
     for(q=l.pHead;q;q=q->pNext)
     {
      if(q->info.masv==Masv)
      {
      if(q!= NULL)
      {
        new_ele->pNext=q->pNext;
        q->pNext=new_ele;
        if(q==l.pTail)
        l.pTail=new_ele;
      }
      else
      AddFirst(l,new_ele);
      }
     }
    }
    void  RemoveHead(LIST &l)
    {
     if(l.pHead!=NULL)
     {
      NODE*p=l.pHead;
      l.pHead=l.pHead->pNext;
      delete p;
      if(l.pHead== NULL) l.pTail=NULL;
     }
     else
      printf("\nHuy that bai:");
    }
    void  Removelist(LIST &l)
    {
     while(l.pHead)
     {
      NODE* p=l.pHead;
      l.pHead=l.pHead->pNext;
      delete p;
     }
     l.pTail=NULL;
    }
    void RemoveTail(LIST &l)

     NODE *p,*q;
      p = l.pHead;
      if(p->pNext == NULL) 
      {     
        RemoveHead(l);   
        return; 
     } 
     while(p->pNext!= NULL)
      {   
        q = p;   
      p = p->pNext;
        } 
     q->pNext = NULL; 
     delete p;   
    }
    void RemoveNode(LIST &l,int Msv)
    {
      NODE *p, *q; 
      p = l.pHead; 
     if(p->info.masv == Msv) 
     {     
      l.pHead = p->pNext;
        delete p;     
      } 
      else     
      q = p->pNext;   
      if(q->info.masv ==Msv) 
      {     
      p->pNext = q->pNext;   
        q->pNext = NULL;
        delete q;                         
      }       
    }
    NODE* Search(LIST l) 
    {
     char hoten[30];
     int Masv;
     int i=1;
     NODE* p=l.pHead;
     printf("Nhap vao ma so sinh vien :");
     scanf("%d",&Masv);
     while(p&&p->info.masv!=Masv)
     p=p->pNext;
     return p;
    }
    void hoanvi(SV &a,SV &b)
    {
     SV itamp;
     itamp=a;
     a=b;
     b=itamp;
    }
    void ListSelectionSort(LIST &l)
    {
        NODE*min;
        NODE *p, *q;
        p = l.pHead;
        while(p!=l.pTail)
        {
            q = p->pNext;
            min = p;
            while(q!=NULL)
            {
      if(q->info.masv < min->info.masv)
      min = q;
        q = q->pNext;
            }
            hoanvi(min->info, p->info);
            p = p->pNext; 
        }
    }
    void  InterChangeSort(LIST &l)
    {
     NODE *p;
     NODE *q;
     for ( p=l.pHead ; p!=l.pTail ; p=p->pNext )
      for ( q=p->pNext ; q!=NULL ; q=q->pNext )
      if ( p->info.masv > q->info.masv )
        hoanvi( p->info , q->info );
    }
    void XuatDS(LIST l)
    {
     NODE *p;
     p=l.pHead;
     if(l.pHead==NULL)
      printf("\n Danh sach rong");
     printf("\n-------------------------------");
     printf("\n%-20s %-20s ","MaSV","Ho Ten");
     printf("\n-------------------------------");
     while(p!=NULL)
     {
      printf("\t\n%-20d %-20s ",p->info.masv,p->info.hoten);
      p=p->pNext;
     }
    }
    void XuatTK(NODE* p)
    {
     if(p==NULL)
      printf("\nDanh sach rong");
     else
     {
      printf("\nSinh vien ban can tim:");
      printf("\n-------------------------------");
      printf("\n%-20s %-20s ","MaSV","Ho Ten");
      printf("\n-------------------------------");
      printf("\t\n%-20d %-20s ",p->info.masv,p->info.hoten);
     }
    }
    void main()
    {
     printf("\n_________________Quan ly Sinh vien_____________________");
     printf("\n__________________Tran Van Thinh_______________________");
        SV x;
        LIST l;
        NODE* p=new NODE;
        NODE* q=new NODE;
        NODE* a=new NODE;
        Init(l);
        int tiep=1;
        int chon;
     int i;
     int n;
     printf("\n\nNhap vao so sinh vien : ");
     scanf("%d",&n);
     for(i=0;i<n;i++)
     {
      printf("\nNhap vao sinh vien thu %d",i+1);
      fflush(stdin);
      printf("\n\nNhap vao ho ten:");
      gets(x.hoten);
      printf("\n\nNhap vao mssv:");
      scanf("%d",&x.masv);
      p=GetNode(x);
      AddTail(l,p); 
     }
     XuatDS(l);
     printf("\n______________________________________________________________"); 
        while(tiep==1)
        {
        printf("\n\t----------------------------------------------------");
        printf("\n\t+                      MENU                        +");
        printf("\n\t-----------------------------------------------------");
        printf("\n\t+          1.Chen 1 NODE vao dau DSLK              +");
      printf("\n\t+          2.Chen 1 NODE vao cuoi DSLK              +");
      printf("\n\t+          3.Chen 1 NODE sau  DSLK                +");
      printf("\n\t+          4.Xoa 1 NODE o dau DSLK                  +");
      printf("\n\t+          5.Xoa 1 NODE o cuoi DSLK                +");
      printf("\n\t+          6.Xoa Node bat ki                        +");
      printf("\n\t+          7.huy toan bo danh sach                  +");
      printf("\n\t+          8.Duyet DSLK                            +");
      printf("\n\t+          9.Tim 1 NODE co khoa k                  +");
      printf("\n\t+          10.Sap xep DSLK theo pp interChangeSort  +");
      printf("\n\t+          11.Sap xep theo pp selecsionsort        +");
      printf("\n\t+          0:thoat.                                +");
      printf("\n\t+---------------------------------------------------+");
        printf("\nMoi ban chon:");
        scanf("%d",&chon);
        switch(chon)
        {
      case 1:
          fflush(stdin);
          printf("\n\nNhap vao ho ten:");
          gets(x.hoten);
          printf("\n\nNhap vao mssv:");
          scanf("%d",&x.masv);
          p=GetNode(x);
          AddFirst(l,p);
          printf("\nDanh sach sau khi them");
          XuatDS(l);
          printf("\nTiep 1!! thoat phim bat ki!! : ");
          scanf("%d",&tiep);
          break;
          case 2:
          fflush(stdin);
          printf("\n\nNhap vao ho ten:");
          gets(x.hoten);
          printf("\n\nNhap vao mssv:");
          scanf("%d",&x.masv);
          p=GetNode(x);
          AddTail(l,p);
          printf("\nDanh sach sau khi them");
          XuatDS(l);
          printf("\nTiep 1!! thoat phi bat ki : ");
          scanf("%d",&tiep);
          break;
        case 3:
        fflush(stdin);
          printf("\n\nNhap vao ho ten:");
          gets(x.hoten);
          printf("\n\nNhap vao mssv:");
          scanf("%d",&x.masv);
          q=GetNode(x);
          AddAfter(l,p,q);
          printf("\nDanh sach sau khi them");
          XuatDS(l);
          printf("\nTiep 1!! thoat phi bat ki : ");
          scanf("%d",&tiep);
          break;
        case 4:
          printf("\nDa xoa sv dau ds\n\n");
          RemoveHead(l);
          printf("\n\tDanh sach sau khi xoa");
          XuatDS(l);
          printf("\nTiep 1!! thoat phim bat ki!! : ");
          scanf("%d",&tiep);
          break;
      case 5:
        printf("\nDa xoa sv cuoi DS\n\n");
        RemoveTail(l);
        printf("\n\tDanh sach sau khi xoa");
        XuatDS(l);
        printf("\nTiep 1!! thoat phi bat ki : ");
          scanf("%d",&tiep);
        break;
      case 6:
        int Msv;
        printf("\n\nNhap vao mssv ban muon xoa:");
          scanf("%d",&Msv);
        RemoveNode(l,Msv);
        printf("\n\tDanh sach sau khi xoa");
        XuatDS(l);
        printf("\nTiep 1!! thoat phim bat ki!! : ");
          scanf("%d",&tiep);
        break;
      case 7:
        Removelist(l);
        XuatDS(l);
        printf("\nTiep 1!! thoat phi bat ki : ");
          scanf("%d",&tiep);
          break;
          case 8:
          printf("\nDuyet danh sach:");
          printf("\n");
          XuatDS(l);
          printf("\nTiep 1!! thoat phim bat ki!! : ");
          scanf("%d",&tiep);
          break;
          case 9:
          a=Search(l);
          if(a!=NULL)
          XuatTK(a);
          else
          {
        printf("Khong thay Ma Sv nay");
          }
          printf("\nTiep 1!! thoat phi bat ki : ");
          scanf("%d",&tiep);
          break;
      case 10:
        printf("\nMang da xap xep theo ma sinh vien:");
          InterChangeSort(l);
          XuatDS(l);
          printf("\nTiep 1!! thoat phim bat ki!! : ");
          scanf("%d",&tiep);
          break;
      case 11:
        printf("\nMang da xap xep theo ma sinh vien:");
          ListSelectionSort(l);
          XuatDS(l);
          printf("\nTiep 1!! thoat phim bat ki!! : ");
          scanf("%d",&tiep);
          break;       
        case 0:
            exit(1);   
        }
        } 
    }
    Vy Thanh Định
    Vy Thanh Định
    Web Master
    Web Master


    Giới tính : Nam Bài gửi : 228
    Tổng Điểm : 544
    Điểm Thưởng : 16
    Sinh Nhật : 19/05/1990 Bị Dụ Dỗ : 11/09/2009
    Tuổi : 34

    bài Danh sách liên kết đơn Empty Re: bài Danh sách liên kết đơn

    Bài gửi by Vy Thanh Định 2/12/2009, 19:19

    Mình đã chạy thử bài của bạn và thấy có một số lỗi! Chẳng hạn như chọn phương pháp sắp xếp interchargesort , sau khi sắp xếp nhấn phím bất kì để tiếp tục thì tạo ra vòng lặp vô tận, chạy không dừng, và một số chỗ không có fflush(stdin) đường vào chuẩn của C, khiến một số dòng nhập không được thực hiện Very Happy, bạn coi lại nhé !
    tranthinh_it
    tranthinh_it
    Newbie
    Newbie


    Giới tính : Nam Bài gửi : 2
    Tổng Điểm : 4
    Điểm Thưởng : 0
    Sinh Nhật : 26/10/1989 Bị Dụ Dỗ : 02/12/2009
    Tuổi : 35

    bài Danh sách liên kết đơn Empty Re: bài Danh sách liên kết đơn

    Bài gửi by tranthinh_it 2/12/2009, 20:09

    cảm ơn bạn . do chỗ menu , mình để "int tiep" nen chi nhập số , chắc bạn nhập kí tự nên nó thế , mình đã sưa xong , phím 1 để tiếp tuc chứ không phải phím bất kì để tiếp tục bạn à , cảm ơn bạn đã góp ý kiến
    mình chỉ sử dung fflush(stdin) đối với nhập chuỗi , còn nhập số thì mình khồn sử dụng , ban có thể nói rõ lỗi đc không , để mình sửa , cảm ơn bạn nhìu
    kocogi
    kocogi
    Member
    Member


    Giới tính : Nam Bài gửi : 22
    Tổng Điểm : 24
    Điểm Thưởng : 0
    Sinh Nhật : 18/03/1990 Bị Dụ Dỗ : 26/11/2009
    Tuổi : 34

    bài Danh sách liên kết đơn Empty Re: bài Danh sách liên kết đơn

    Bài gửi by kocogi 2/12/2009, 23:32

    lỗi ở đây là ko ai chịu xài nhập xuất = file cả. :O
    Vy Thanh Định
    Vy Thanh Định
    Web Master
    Web Master


    Giới tính : Nam Bài gửi : 228
    Tổng Điểm : 544
    Điểm Thưởng : 16
    Sinh Nhật : 19/05/1990 Bị Dụ Dỗ : 11/09/2009
    Tuổi : 34

    bài Danh sách liên kết đơn Empty Re: bài Danh sách liên kết đơn

    Bài gửi by Vy Thanh Định 2/12/2009, 23:35

    Tại vì thói quen thui, sao kiu là lỗi ???? đọc sách
    DarkEternal
    DarkEternal
    New Member
    New Member


    Giới tính : Nam Bài gửi : 7
    Tổng Điểm : 15
    Điểm Thưởng : 4
    Sinh Nhật : 11/08/1990 Bị Dụ Dỗ : 01/12/2009
    Tuổi : 34

    bài Danh sách liên kết đơn Empty Re: bài Danh sách liên kết đơn

    Bài gửi by DarkEternal 3/12/2009, 19:09

    kocogi đã viết:lỗi ở đây là ko ai chịu xài nhập xuất = file cả. :O
    Đúng là với các bài struct về quản lí thế này thì việc tối ưu nhất đó là nhập xuất bằng file.Như thế tránh cho máy phải vất vả việc xử lý nhập xuất từng biến 1.Ngoài ra ,không biết có phải do các phần mềm như Cfree hay DevC ,việc fflush(stdin) vẫn ko ổn định cho việc nhập chuỗi kí tự từ bàn phím,trong khi BorlandC thì ok hết.Nhưng tất nhiên nhập xuất từ bàn phím cũng ko là vấn đề gì đối với bài tập này.
    DarkEternal
    DarkEternal
    New Member
    New Member


    Giới tính : Nam Bài gửi : 7
    Tổng Điểm : 15
    Điểm Thưởng : 4
    Sinh Nhật : 11/08/1990 Bị Dụ Dỗ : 01/12/2009
    Tuổi : 34

    bài Danh sách liên kết đơn Empty Re: bài Danh sách liên kết đơn

    Bài gửi by DarkEternal 3/12/2009, 21:44

    Bài danh sách liên kết đơn của bạn khá ổn nhưng quá rối mắt về phần code.
    -Thứ nhất,theo mình bạn nên để thân hàm main của bạn chỉ là việc gọi hàm Input để vào dữ liệu sau đó hàm Output.Tiếp theo bạn cho menu vào sau đó dùng vòng lặp để bắt đầu chọn menu và cứ mỗi số từ việc chọn bạn viết nó thành 1 hàm riêng.
    -Thứ hai,Hàm IsEmptyList là không cần thiết,có lẽ ở đây ý bạn nó là hàm Init khởi dựng 1 list nên cho head và tail nó bằng NULL ?Hoặc bạn muốn nó kiểm tra rằng List đã rỗng?.
    Chúc bạn có thể cải thiện tốt bài tập này

    Sponsored content


    bài Danh sách liên kết đơn Empty Re: bài Danh sách liên kết đơn

    Bài gửi by Sponsored content


      Hôm nay: 25/11/2024, 15:51