Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: Danh sách LK đơn,lỗi lạ kì, làm tớ khổ cả buổi chiều. Tại sao?

  1. #1
    Ngày gia nhập
    11 2008
    Bài viết
    203

    Mặc định Danh sách LK đơn,lỗi lạ kì, làm tớ khổ cả buổi chiều. Tại sao?

    Đây là 2 đoạn chương trình giống hệt nhau, không hiểu sao một cái chạy được, một cái chạy không được. Tớ đã phải tìm lỗi từ 1h chiều tới bây giờ mà không biết tại sao lỗi. Nhờ các bạn tìm lỗi và sửa lại giùm.

    Tớ đã so sánh các dòng của 2 chương trình với nhau, thấy dòng nào giống nhau là xóa cho tới khi không còn dòng nào trong chương trình nữa. Vậy mà vẫn không tìm ra lỗi.

    Nếu mod thấy bài này sai quy định thì cho tớ biết phải post vào đâu. Cái này là cấu trúc dữ liệu đấy nhá!

    Chương trình này xóa một phần tử trong danh sách. Vd: bạn muốn xóa phần tử thứ 2 trong danh sách thì enter 2.

    Nhưng cái này lỗi, phải nhập 2 lần mới xóa.
    Code:
     #include<stdio.h>
    #include<conio.h>
    #include<malloc.h>
    typedef      int  ElementType;
    typedef      struct  Node
    {
                 
                 ElementType      Element;
                 Node*            Next;            
       
    };
    typedef      Node*            Position;
    typedef      Position         List;
    
    void         MAKENULL_LIST(List    *L)
    {
                 (*L)=(Node*)malloc(sizeof(Node));
                 (*L)->Next=NULL;  
    }
    int          EMPTY_LIST(List    *L)
    {
                 return (*L)->Next==NULL;       
    }
    void         INSERT_LIST(ElementType X, Position P, List *L)
    {
                 Position T;
                 T=(Node*)malloc(sizeof(Node));
                 T->Element=X;
                 T->Next=P->Next;
                 P->Next=T;
                 
    }
    void DELETE_LIST(Position P, List* L){
         Position T;
         if(EMPTY_LIST(L))
           printf("\nDanh sach rong! Khong co phan tu nao ca!");
         else{
         
             if(P->Next!=NULL){
                T=P->Next;
                P->Next=T->Next;
                free(T);
             }
             else printf("Khong ton tai vi tri can xoa!\n");
         }
    }
    void           READ_LIST(List *L)
    {
                   int i=0,n;
                   ElementType X;
                   printf("Nhap so phan tu cua danh sach: ");scanf("%d",&n);
                   MAKENULL_LIST(L);
                   Position C=(*L);
                   while(i++<n)
                   {
                        printf("Nhap vao phan tu thu %d: ",i);
                        scanf("%d",&X);
                        INSERT_LIST(X,C,L);
                        C=C->Next;
                   }
                   
    }
    void PRINT_LIST(List L){
         Position VT;
         VT=L;
         if(VT->Next==NULL)
            printf("\nDanh sach rong, cha co phan tu nao de in!");
         else
            while(VT->Next!=NULL){
              printf("%d ",VT->Next->Element);
              VT=VT->Next;
            }
    }
    Position TIMVITRI(int n, List L){
             Position P=L;
             for(int i=0;i<n-1;i++){
                    if(P->Next!=NULL)
                      P=P->Next;
             }
        return P;
    }
    int main()
    {
        int n;
        Position M;
        List L;
        READ_LIST(&L);
        PRINT_LIST(L);
        printf("\nNhap vao vi tri phan tu muon xoa: ");scanf("%d ",&n);
        M=TIMVITRI(n,L);
        DELETE_LIST(M,&L);
        PRINT_LIST(L);
     getch();
    }
    Còn cái này thì chạy đúng:
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<malloc.h>
    
    typedef int ElementType;
    typedef     struct  Node{
           ElementType       Element;
           Node*             Next;
    };
    typedef     Node*        Position;
    typedef     Position     List;
    
    void        MAKENULL_LIST(List    *L){
                 (*L)=   (Node*)malloc(sizeof(Node));
                 (*L) ->Next=NULL;
    }
    int         EMPTY_LIST(List* L){
                return (*L)->Next==NULL;
    }
    void INSERT_LIST(ElementType X, Position P, List* L){
         Position T;
         T=(Node*)malloc(sizeof(Node));
         T->Element=X;
         T->Next=P->Next;
         P->Next=T;
    }
    void DELETE_LIST(Position P, List* L){
         Position T;
         if(EMPTY_LIST(L))
           printf("\nDanh sach rong! Khong co phan tu nao ca!");
         else{
         
             if(P->Next!=NULL){
                T=P->Next;
                P->Next=T->Next;
                free(T);
             }
             else printf("Khong ton tai vi tri can xoa!\n");
         }
    }
    void READ_LIST(List *L){
        int i=0,n;
        ElementType X;
        printf("NHAP VAO SO PHAN TU: ");scanf("%d",&n);
        MAKENULL_LIST(L);
        Position C=(*L);
        while(i++<n){
             printf("NHAP VAO PHAN TU THU %d:", i);
             scanf("%d",&X);
             INSERT_LIST(X,C,L);
             C=C->Next;
       }
    }  
    
    void PRINT_LIST(List L){
         Position VT;
         VT=L;
         if(VT->Next==NULL)
            printf("\nDanh sach rong, cha co phan tu nao de in!");
         else
            while(VT->Next!=NULL){
              printf("%d ",VT->Next->Element);
              VT=VT->Next;
            }
    }
    Position TIMVITRI(int n, List L){
             Position P=L;
             for(int i=0;i<n-1;i++){
                    if(P->Next!=NULL)
                      P=P->Next;
             }
        return P;
    }
    int main(){
        int n;
        Position M;  
        List L;  
        READ_LIST(&L);
        PRINT_LIST(L);
        printf("\nNhap vao vi tri can xoa: ");scanf("%d",&n);
        M=TIMVITRI(n,L);
        DELETE_LIST(M,&L);
        PRINT_LIST(L);
        getch();
    }
    Thật tình, tớ không hiểu tại sao lại như vậy nữa. Nếu bạn cũng không tìm ra lỗi giống mình thì cũng để lại bài viết để biết rằng nhiều người giống mình.
    Cám ơn nhiều!
    Đã được chỉnh sửa lần cuối bởi Loveanygirls : 06-01-2009 lúc 05:50 PM.

  2. #2
    No Avatar
    ngocbig Khách

    Vấn đề của bạn khá hay.

    Bạn thử thay dòng printf("\nNhap vao vi tri can xoa: ");scanf("%d",&n);

    vào code bên trên nhé. Good luck!

  3. #3
    Ngày gia nhập
    11 2008
    Bài viết
    203

    @ngocbich: Bạn thật là tài tình. Mình loay hoay cả buổi mà tìm không ra. Mình cứ nghĩ nó là một dòng printf bình thường nên không thèm để ý.
    Bạn có con mắt thật tinh tế. Nhưng cách bạn vừa bảo mình nó đồng nghĩa với cách: "Paste đoạn code bên dưới vào dịch là được!". Như vậy, vẫn chưa giải quyết được vấn đề vì 2 đoạn code hầu như chỉ khác nhau về cụm "printf("\nNhap vao vi tri phan tu muon xoa: ");scanf("%d ",&n);" vs "printf("\nNhap vao vi tri can xoa: ");scanf("%d",&n);", thế mà cái chạy được vs cái chạy không được.

    Mình đã phát hiện ra lỗi ở 2 hàm scanf: scanf("%d ",&n); scanf("%d",&n);. Tại sao lại khác nhau?
    Chú ý: Mình sử dụng trình biên dịch DevC++4.9.9.2
    Mình không có các trình biên dịch khác.
    Đã được chỉnh sửa lần cuối bởi Loveanygirls : 06-01-2009 lúc 05:58 PM.

  4. #4
    No Avatar
    ngocbig Khách

    scanf("%d ",&n); scanf("%d",&n);

    Sorry, cái scanf 1 có một dấu "space". Đó là vấn đề!
    Đã được chỉnh sửa lần cuối bởi ngocbig : 06-01-2009 lúc 06:10 PM.

  5. #5
    Ngày gia nhập
    11 2008
    Bài viết
    203

    Mình có một câu hỏi nữa.
    Mình muốn viết lại hàm READ_LIST(L);
    Code:
    void           READ_LIST(List *L)//KHÔNG SỬA CHỖ NÀY NHÉ!!!
    {
            int i=1;
            ElementType X;
            while(X!=-1)//GIÁ TRỊ MÌNH QUY ĐỊNH ĐỂ KẾT THÚC VIỆC NHẬP
            {
                 printf("Nhap vao phan tu thu %d:",i);scanf("%d",&X);
                 if(X!=-1)
                 INSERT_LIST(X,L,L);
                 i++;
    //TẠI SAO INSERT_LIST(X,L,L),INSERT_LIST(X,L,&L),....,KIỂU NÀO CŨNG BÁO LỖI?           
            }
         
    }
    Dựa vào hàm INSERT_LIST(X,P,L) trong bài viết đầu tiên, bạn cho mình biết tại sao không thể dùng con trỏ ở hàm READ_LIST(List *L)-sẽ báo lỗi. Còn nếu thay bằng READ_LIST(List L) hoặc READ_LIST(List &L) thì không báo lỗi.
    Cái vụ con trỏ và & thì mình còn ngu lắm! Chỉ biết, thay đổi mà tác động tới danh sách thì phải đặt & hoặc con trỏ khi viết hàm.
    Giúp mình nhé!
    Đã được chỉnh sửa lần cuối bởi Loveanygirls : 06-01-2009 lúc 09:37 PM.

  6. #6
    No Avatar
    ngocbig Khách

    Mặc định Danh sách LK đơn,lỗi lạ kì, làm tớ khổ cả buổi chiều. Tại sao?

    C++ Code:
    1. typedef      Node*            Position;
    2. typedef      Position         List;

    Bạn chú ý hai dòng này.

    Giời List là kiểu con trỏ của struct Node còn gì

    Bạn cần phân biệt đc toán tử lấy tham chiếu và toán tử lấy địa chỉ ô nhớ trong C++ đều là &. Tùy vào tình huống mà sử dụng
    Đã được chỉnh sửa lần cuối bởi ngocbig : 06-01-2009 lúc 09:36 PM.

  7. #7
    Ngày gia nhập
    08 2008
    Bài viết
    15

    Chú ý: Mình sử dụng trình biên dịch DevC++4.9.9.2
    Mình không có các trình biên dịch khác
    mình tưởng dec-v không có thư viện malloc.h chứ

  8. #8
    Ngày gia nhập
    08 2008
    Bài viết
    15

    Mình đã phát hiện ra lỗi ở 2 hàm scanf: scanf("%d ",&n); scanf("%d",&n);. Tại sao lại khác nhau?
    là thế này
    nguyên tắc khi đọc số của hàm là nó bỏ qua các khoảng trắng cho đến khi gặp 1 số
    nên khi bạn để space trong hàm scanf() thì sau khi đọc xong n dù bạn ấn enter bao nhiêu lần thì nó cũng ko chạy tiêp(ko tin ấn thử coi ) lúc này bạn ấn 1 số thì nó sẽ chạy
    mình giải thích thế có gì khong đúng các bác bỏ qua nhé

Các đề tài tương tự

  1. Giải thuật Phương pháp đảo ngược các con trỏ trong danh sách liên kết 1 chiều
    Gửi bởi Quy_ny trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 8
    Bài viết cuối: 07-10-2013, 11:28 PM
  2. Chia đa thức bằng danh sách liên kết trong lập trình C?
    Gửi bởi tetuongrua trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 13-02-2011, 12:55 PM
  3. BT về danh sách sinh viên + mảng 2 chiều
    Gửi bởi vn00284716 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 16
    Bài viết cuối: 31-01-2010, 03:02 PM
  4. mảng 2 chiều + danh sách kiểu động
    Gửi bởi tinhco_pro trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 27-10-2008, 12:28 AM
  5. Duyệt đồ thị theo chiều sâu,sử dụng danh sách kề để mô tả đồ thị
    Gửi bởi shogun_vn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 11-02-2008, 08:03 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn