Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 14 kết quả

Đề tài: Lỗi khi với cây nhị phân tìm kiếm

  1. #1
    Ngày gia nhập
    02 2008
    Nơi ở
    AYS 107
    Bài viết
    41

    Thumbs down Lỗi khi với cây nhị phân tìm kiếm

    Em viết chương trình để chèn từ vào cây nhị phân tìm kiếm. Nếu em thay char key[80] bởi int x thì mọi việc làm rất thuận lợi còn để thế này thì gặp lỗi Segmentation fault!!

    Đây là thôn báo lỗi của debugger:

    0xb7fa72c3 in strlen () from /lib/tls/i686/cmov/libc.so.6
    (gdb) where
    #0 0xb7fa72c3 in strlen () from /lib/tls/i686/cmov/libc.so.6
    #1 0xb7f73830 in vfprintf () from /lib/tls/i686/cmov/libc.so.6
    #2 0xb7f79c40 in printf () from /lib/tls/i686/cmov/libc.so.6
    #3 0x0804878f in preorder (T=0x68) at tree.c:67
    #4 0x0804879d in preorder (T=0x9070077) at tree.c:68
    #5 0x0804879d in preorder (T=0x9070008) at tree.c:68
    #6 0x08048638 in main () at tree.c:31

    Em mong được các anh chị giúp đỡ ạ. Em xin cảm ơn!!
    C Code:
    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <stdlib.h>
    4.  
    5. typedef struct nodetype{
    6.   char key[80];
    7.   struct nodetype *left, *right;
    8. }node_type;
    9. typedef struct nodetype *treetype;
    10.  
    11. void insert_node(char s[],treetype *T);
    12. void free_tree(treetype T);
    13. void preorder(treetype T);
    14.  
    15. main()
    16. {
    17.   char s[80];
    18.   int i,n;
    19.   treetype T=NULL;
    20.   printf("Nhap so node muon them vao cay: ");
    21.   scanf("%d",&n);
    22.   printf("Nhap du lieu cho cac node\n");
    23.   for(i=0;i<n;i++){
    24.     scanf("%s",s);
    25.     insert_node(s,&T);
    26.   }
    27.   if(T==NULL)
    28.     printf("NULL tree\n");
    29.   else{
    30.     printf("Preorder: ");
    31.     preorder(T);
    32.     printf("\n");
    33.   }
    34.   free_tree(T);
    35. }
    36.  
    37. void insert_node(char s[],treetype *T)
    38. {
    39.   if((*T)==NULL){
    40.     (*T)=(treetype)malloc(sizeof(treetype));
    41.     if((*T)==NULL){
    42.       printf("No memory available\n");
    43.       return ;
    44.     }
    45.     strcpy((*T)->key,s);
    46.     (*T)->left=NULL;
    47.     (*T)->right=NULL;
    48.   }else if(strcmp((*T)->key,s)<0)
    49.     insert_node(s,&(*T)->left);
    50.   else if(strcmp((*T)->key,s)>0)
    51.     insert_node(s,&(*T)->right);
    52. }
    53.  
    54. void free_tree(treetype T)
    55. {
    56.   if(T!=NULL){
    57.     free_tree(T->left);
    58.     free_tree(T->right);
    59.     free((void *)T);
    60.   }
    61. }
    62.  
    63. void preorder(treetype T)
    64. {
    65.   if(T==NULL)
    66.     return ;
    67.   printf("%s ",T->key);
    68.   preorder(T->left);
    69.   preorder(T->right);
    70. }
    I don't wanna waste another day

  2. #2
    Ngày gia nhập
    04 2008
    Bài viết
    244

    Code:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef struct nodetype{
      char key[80];
      struct nodetype *left, *right;
    }node_type;
    typedef struct nodetype *treetype;
    
    void insert_node(char s[],treetype *T);
    void free_tree(treetype T);
    void preorder(treetype T);
    
    main()
    {
      char s[80];
      int i,n;
      treetype T=NULL;
      printf("Nhap so node muon them vao cay: ");
      scanf("%d",&n);
      printf("Nhap du lieu cho cac node\n");
      for(i=0;i<n;i++){
        scanf("%s",s);
        insert_node(s,&T);
      }
      if(T==NULL)
        printf("NULL tree\n");
      else{
        printf("Preorder: ");
        preorder(T);
        printf("\n");
      }
      free_tree(T);
    }
    
    void insert_node(char s[100],treetype *T)
    {
      if((*T)==NULL){
        (*T)=(treetype)malloc(sizeof(treetype));
        if((*T)==NULL){
          printf("No memory available\n");
          return ;
        }
        strcpy((*T)->key,s);
        (*T)->left=NULL;
        (*T)->right=NULL;
      }else if(strcmp((*T)->key,s)<0)
        insert_node(s,&(*T)->left);
      else if(strcmp((*T)->key,s)>0)
        insert_node(s,&(*T)->right);
    }
    
    void free_tree(treetype T)
    {
      if(T!=NULL){
        free_tree(T->left);
        free_tree(T->right);
        free((void *)T);
      }
    }
    
    void preorder(treetype T)
    {
      if(T==NULL)
        return ;
      printf("%s ",T->key);
      preorder(T->left);
      preorder(T->right);
    }
    sửa đây cậu

  3. #3
    Ngày gia nhập
    02 2008
    Nơi ở
    AYS 107
    Bài viết
    41

    Giờ mình dịch nó lại ra lỗi khác, lạ thật. Chương trình dịch của mình có lỗi sao???
    Lỗi: Khi nhập được khoảng 5 phần tử mà nhập tiếp thì sẽ gặp lỗi.

    Program received signal SIGSEGV, Segmentation fault.
    0xb7edcd28 in strcmp () from /lib/tls/i686/cmov/libc.so.6
    (gdb) where
    #0 0xb7edcd28 in strcmp () from /lib/tls/i686/cmov/libc.so.6
    #1 0x080486eb in insert_node (s=0xbfcf30e0 "g", T=0x9b95058) at tree.c:48
    #2 0x08048706 in insert_node (s=0xbfcf30e0 "g", T=0xbfcf30d4) at tree.c:49
    #3 0x08048600 in main () at tree.c:25
    Đã được chỉnh sửa lần cuối bởi developer : 20-12-2008 lúc 10:29 PM.
    I don't wanna waste another day

  4. #4
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Code đầu tiên của bạn mình check với Code::Block, 0 errors 0 warnings

    Bạn hãy cho biết mình dùng trình duyệt gì, trong TH này chắc chắn trình duyệt của bạn có vấn đề hoặc nó có một vài yêu cầu với code không theo chuẩn ANSI.

  5. #5
    Ngày gia nhập
    02 2008
    Nơi ở
    AYS 107
    Bài viết
    41

    Đang loạn đầu nên em nói nhầm. Em dịch không sao hết, nhưng lúc chạy cứ nhập được 5 giá trị là lỗi như trên. Em dùng gcc trong LINUX
    I don't wanna waste another day

  6. #6
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Mặc định Lỗi khi với cây nhị phân tìm kiếm

    Dùng gcc trên linux, không biết bạn dùng OS nào nhỉ. Thử cái này xem sao.

    C Code:
    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <stdlib.h>
    4.  
    5. struct nodetype{
    6.   char key[80];
    7.   struct nodetype *left, *right;
    8. }node_type;
    9. typedef struct nodetype *treetype;
    10.  
    11. void insert_node(char s[],treetype *T);
    12. void free_tree(treetype T);
    13. void preorder(treetype T);
    14.  
    15. int main()
    16. {
    17.   char s[80];
    18.   int i,n;
    19.   treetype T=NULL;
    20.   printf("Nhap so node muon them vao cay: ");
    21.   scanf("%d",&n);
    22.   printf("Nhap du lieu cho cac node\n");
    23.   for(i=0;i<n;i++){
    24.     scanf("%s",s);
    25.     insert_node(s,&T);
    26.   }
    27.   if(T==NULL)
    28.     printf("NULL tree\n");
    29.   else{
    30.     printf("Preorder: ");
    31.     preorder(T);
    32.     printf("\n");
    33.   }
    34.   free_tree(T);
    35.   return 0;
    36. }
    37.  
    38. void insert_node(char s[],treetype *T)
    39. {
    40.   if((*T)==NULL){
    41.     (*T)=(treetype)malloc(sizeof(treetype));
    42.     if((*T)==NULL){
    43.       printf("No memory available\n");
    44.       return ;
    45.     }
    46.     strcpy((*T)->key,s);
    47.     (*T)->left=NULL;
    48.     (*T)->right=NULL;
    49.   }else if(strcmp((*T)->key,s)<0)
    50.     insert_node(s,&(*T)->left);
    51.   else if(strcmp((*T)->key,s)>0)
    52.     insert_node(s,&(*T)->right);
    53. }
    54.  
    55. void free_tree(treetype T)
    56. {
    57.   if(T!=NULL){
    58.     free_tree(T->left);
    59.     free_tree(T->right);
    60.     free((void *)T);
    61.   }
    62. }
    63.  
    64. void preorder(treetype T)
    65. {
    66.   if(T==NULL)
    67.     return ;
    68.   printf("%s ",T->key);
    69.   preorder(T->left);
    70.   preorder(T->right);
    71. }

    Dùng int main() và return 0; nhé!

  7. #7
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Ct của cậu viết có lỗi, chứ làm gì có lỗi của OS hay compiler. Đừng đổ thừa bậy bạ như vậy. Đọc và debug thật kỹ code của cậu đi.

  8. #8
    Ngày gia nhập
    02 2008
    Nơi ở
    AYS 107
    Bài viết
    41

    Đang lúc tức thì em nói vậy thôi, em không có ý đổ thừa đâu ạ!!
    @Anh QuangHoang: Em cứ nhập được khoảng 6 cái thì không nhập được nữa. Em sửa như anh rồi nhưng không được. Chỉ là em thấy không có gì sai về mặt giải thuật cả nhưng không hiểu sao không được.
    Em nghĩ 1 trong 2 chỗ này sai nhưng không tự mình lí giải được:
    C Code:
    1. for(i=0;i<n;i++){
    2.     scanf("%s",s); //Em nghĩ lỗi ở đây
    3.     insert_node(s,&T);
    4.   }

    C Code:
    1. void insert_node(char s[],treetype *T)
    2. {
    3.   if((*T)==NULL){
    4.     (*T)=(treetype)malloc(sizeof(treetype));
    5.     if((*T)==NULL){
    6.       printf("No memory available\n");
    7.       return ;
    8.     }
    9.     strcpy((*T)->key,s); //Cái này cũng có thể gây lỗi
    10.     (*T)->left=NULL;
    11.     (*T)->right=NULL;
    12.   }else if(strcmp((*T)->key,s)<0)
    13.     insert_node(s,&(*T)->left);
    14.   else if(strcmp((*T)->key,s)>0)
    15.     insert_node(s,&(*T)->right);
    16. }

    Đây là ảnh lúc em chạy chương trình:
    Đã được chỉnh sửa lần cuối bởi developer : 21-12-2008 lúc 10:00 AM.
    I don't wanna waste another day

  9. #9
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Code:
    for(i=0;i<n;i++){
        scanf("%s",s); //Em nghĩ lỗi ở đây
        insert_node(s,&T);
      }
    híc híc,cậu học đến C++ rồi mà vẫn máu C thế,nhìn lại xem,thiếu địa chỉ của S kìa
    Code:
    for(i=0;i<n;i++){
        scanf("%s",&s); //Em nghĩ lỗi ở đây
        insert_node(s,&T);
      }

  10. #10
    Ngày gia nhập
    02 2008
    Nơi ở
    AYS 107
    Bài viết
    41

    char s[80] mà cậu. Mới cả mình đã học gì về C++ đâu hii...
    I don't wanna waste another day

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

  1. [Kiếm Thế] Kiếm Thế Ngạo Thiên Kiếm Chạy Thử Nghiệm vào 10h ngày 15/09
    Gửi bởi c0jskull trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 5
    Bài viết cuối: 29-09-2013, 10:45 AM
  2. [Kiếm Thế] Kiếm Thế Kiếm Linh Chạy Thử Nghiệm vào 10h ngày 4/7
    Gửi bởi c0jskull trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 1
    Bài viết cuối: 05-07-2013, 12:16 PM
  3. [Kiếm Thế] Kiếm Thế Kiếm Linh Chạy Thử Nghiệm vào 10h ngày 4/7
    Gửi bởi c0jskull trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 03-07-2013, 10:30 PM

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