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

Đề tài: Lỗi con trỏ DSLK, add vào nhưng khi duyệt con trỏ vẫn bằng NULL, ko duyệt được

  1. #1
    Ngày gia nhập
    04 2010
    Bài viết
    69

    Mặc định Lỗi con trỏ DSLK, add vào nhưng khi duyệt con trỏ vẫn bằng NULL, ko duyệt được

    Em không hiểu là em truyền con trỏ vào hàm bị sai hay là cách xử lý bị sai....nhưng khi test chạy thử thì nó không được như ý....con trỏ cứ trả về NULL hoài...
    anh chị giúp em bài này với...em chưa có cách định hình về việc sử dụng giữa DSLK và con trỏ DSLK
    CODE bài bị lỗi...
    C++ Code:
    1. #include <conio.h>
    2. #include <iostream>
    3. #include <string.h>
    4. #include <stdlib.h>
    5. using namespace std;
    6.  struct Node
    7. {
    8.     char Data[7];
    9.     Node *next;
    10. };
    11.  
    12. void add(Node *First,char *tu)
    13. {
    14.     Node *tam;
    15.     tam=new Node;
    16.     tam->next=NULL;
    17.     if(First==NULL)
    18.     {      
    19.         strcpy(tam->Data,tu);
    20.         tam->next=First;
    21.         First=tam;
    22.         return;
    23.     }
    24.     else
    25.     {
    26.         Node *p=First;
    27.         while(p->next!=NULL)
    28.             p=p->next;
    29.         strcpy(tam->Data,tu);
    30.         tam->next=p->next;
    31.         p->next=tam;
    32.     }
    33. }
    34. void main()
    35. {
    36.     Node *First;
    37.     First=NULL;
    38.     char a[7];
    39.     while(1)
    40.     {
    41.         cout<<"\nNhap tu: ";
    42.         cin.getline(a,7);
    43.         if(a[0]==0)
    44.             break;
    45.         add(First,a);
    46.     }
    47.     Node *p;
    48.     p=First;
    49.     if(p==NULL)
    50.         cout<<"\naaaaaa";
    51.     while(p!=NULL)
    52.     {
    53.         cout<<"\t"<<p->Data;
    54.         p=p->next;
    55.     }
    56.     _getch();
    57. }

  2. #2
    Ngày gia nhập
    07 2011
    Bài viết
    11

    chủ yếu ở hàm add do chưa rõ con trỏ trỏ tới nút đầu lên khi sử dụng hàm add trong main nó chưa lưu được kết quả dữ liệu và First vẫn mang giá trị NULL.sau đó gán p=First=NULL
    C++ Code:
    1. #include <conio.h>
    2. #include <iostream>
    3. #include <string.h>
    4. #include <stdlib.h>
    5. using namespace std;
    6.  struct Node
    7. {
    8.     char Data[7];
    9.     Node *next;
    10. };
    11.  
    12. void add(Node *First,char *tu) // First trong trường hợp này chưa hẳn là con trỏ đầu -> void add(Node **First,char *tu)
    13. {
    14.     Node *tam;
    15.     tam=new Node;
    16.     tam->next=NULL;
    17.     if(First==NULL) // if((*First)==NULL)
    18.     {      
    19.         strcpy(tam->Data,tu);
    20.         tam->next=First; //tam->next=(*First);
    21.         First=tam; //(*First)=tam;
    22.         return;
    23.     }
    24.     else
    25.     {
    26.         Node *p=First; // Node *p=(*First);
    27.         while(p->next!=NULL)
    28.             p=p->next;
    29.         strcpy(tam->Data,tu);
    30.         tam->next=p->next;
    31.         p->next=tam;
    32.     }
    33. }
    34. void main()
    35. {
    36.     Node *First;
    37.     First=NULL;
    38.     char a[7];
    39.     while(1)
    40.     {
    41.         cout<<"\nNhap tu: ";
    42.         cin.getline(a,7);
    43.         if(a[0]==0)
    44.             break;
    45.         add(First,a); // add(&First,a);
    46.     }
    47.     Node *p;
    48.     p=First;
    49.     if(p==NULL)
    50.         cout<<"\naaaaaa";
    51.     while(p!=NULL)
    52.     {
    53.         cout<<"\t"<<p->Data;
    54.         p=p->next;
    55.     }
    56.     _getch();
    57. }

  3. #3
    Ngày gia nhập
    04 2010
    Bài viết
    69

    Cảm ơn anh..em đã sửa được, nhưng em vẫn chưa hiểu được DSLK này như thế nào và tại sao lại sửa theo cách của anh.

    Giả sử có 2 cách tạo DSLK:

    C++ Code:
    1. typedef struct Node
    2. {
    3.     Data;
    4.     Node *next;
    5. }*pNode;
    và:
    C++ Code:
    1. struct Node
    2. {
    3.     Data;
    4.     Node *next;
    5. }


    Thì hai cách trên có gì khác nhau, khi sử dụng nó nên làm ra sao và khi truyên vào hàm thì nên truyền chúng như thế nào để khi ra nó không bị NULL nữa...và tại sao lại truyền vào như thế. Anh giúp em phần này với
    Đã được chỉnh sửa lần cuối bởi kuhoang0512 : 24-11-2011 lúc 11:23 AM.

  4. #4
    Ngày gia nhập
    10 2011
    Bài viết
    552

    @ hoang :
    Cách typedef là dùng cho C "cổ điển" , cách thứ 2 là của C "tân thời"
    Um Mani Padme Hum...!!

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

    C++ Code:
    1. void add(Node *First,char *tu) //First là con trỏ dùng để làm con trỏ đầu hay điểm chốt đầu của DSLK
    2.  
    3. void main()
    4. {
    5.     Node *First;
    6.     First=NULL; // ban đầu khởi tạo cho con trỏ First
    7.    
    8.     add(First,a); //gọi hàm
    9.  
    10.  
    11. }
    trong lời gọi hàm này sau khi thực hiện xong ta vẫn chưa biết địa chỉ cụ thể của con trỏ First,do đó kết quả sẽ ko được lưu lại và ko có sự thay đổi gì, First vẫn chỉ mang giá trị ban đâu.ở đây ban đầu khởi tạo First=NULL;
    để có thể thay đổi kết quả lưu đc ta khai báo (**First) để trỏ tới con trỏ (*First) và gọi hàm add(&First,a);




    ngoài ra nhanh gọn hơn thì có thể sử dụng tham chiếu trong C++
    C++ Code:
    1.  
    2.  
    3. void add(Node*(&First),char *tu)
    4. {
    5.     Node *tam;
    6.     tam=new Node;
    7.     tam->next=NULL;
    8.     if(First==NULL)
    9.     {      
    10.         strcpy(tam->Data,tu);
    11.         tam->next=First;
    12.         First=tam;
    13.         return;
    14.     }
    15.     else
    16.     {
    17.         Node *p=First;
    18.         while(p->next!=NULL)
    19.             p=p->next;
    20.         strcpy(tam->Data,tu);
    21.         tam->next=p->next;
    22.         p->next=tam;
    23.     }
    24. }
    25.  
    26. trong main chỉ càn sử dụng add(First,a); là được

    ==========================================

    ==========================================

    C++ Code:
    1. typedef struct Node
    2. {
    3.     Data;
    4.     Node *next;
    5. }*pNode;
    6. //hay
    7. typedef struct Node
    8. {
    9.     Data;
    10.     Node *next;
    11. };
    12. typedef struct Node *pNode
    typedef dùng trong C
    ở Code này ngoài định nghĩa kiểu dữ liệu Node bạn còn định nghĩa thêm kiểu dữ liệu con trỏ pNode
    và có thể dùng theo 2 cách
    C++ Code:
    1. void add(Node *First,char *tu) //hợp lệ
    2. void add(pNode First,char *tu)// hợp lệ

    và:

    C++ Code:
    1. struct Node
    2. {
    3.     Data;
    4.     Node *next;
    5. }

    ta dùng struct và mỗi khai báo kiểu cấu trúc có dữ liệu nào thì chỉ được sử dụng chính nó ko thể thay thế được
    vd
    C++ Code:
    1. struct Node
    2. {
    3.     Data;
    4.     Node *next;
    5. }
    6. struct Node *pNode ;
    tuy nhiên ta chỉ có thể sử dụng
    C++ Code:
    1. void add(Node *First,char *tu) //hợp lệ
    2. void add(pNode First,char *tu) //ko hợp lệ
    3.  
    4. //còn nếu muốn dùng thì phải định nghĩa thêm
    5.  
    6. typedef struct Node *pNode
    7. void add(pNode First,char *tu)//lúc này thì hợp lệ
    Đã được chỉnh sửa lần cuối bởi Momoka : 24-11-2011 lúc 10:16 PM. Lý do: thiếu

  6. #6
    Ngày gia nhập
    10 2010
    Bài viết
    9

    Mặc định Lỗi con trỏ DSLK, add vào nhưng khi duyệt con trỏ vẫn bằng NULL, ko duyệt được

    @Mokoma: Bạn cho mình hỏi thêm trong 1 đoạn code thấy thế này:


    Code:
    ....
    
    struct Node
    {
        int Inf;
        Node *next;
    }; 
    
    Node *Insert_Middle(Node *Pred, int Inf){
    
    ......
    }
    
    main(){
    Node p;
    int a;
    p=Insert_Middle(p,a);
    ....
    
    
    }
    Thì Node *Insert_Middle(Node *Pred, int Inf) nó có tương tự kiểu như void add(Node *First,char *tu) mà bạn nói ở ví dụ trên k?

  7. #7
    Ngày gia nhập
    11 2010
    Nơi ở
    hell
    Bài viết
    165

    Trích dẫn Nguyên bản được gửi bởi Jay712 Xem bài viết
    @Mokoma: Bạn cho mình hỏi thêm trong 1 đoạn code thấy thế này:


    Code:
    ....
    
    struct Node
    {
        int Inf;
        Node *next;
    }; 
    
    Node *Insert_Middle(Node *Pred, int Inf){
    
    ......
    }
    
    main(){
    Node p;
    int a;
    p=Insert_Middle(p,a);
    ....
    
    }
    Thì Node *Insert_Middle(Node *Pred, int Inf) nó có tương tự kiểu như void add(Node *First,char *tu) mà bạn nói ở ví dụ trên k?
    hàm này là trả về 1node, theo tên thì là chèn vào giữa, dựa vào kiểu trả về vs tham số thì có thể là tìm node có key là Inf.
    phải đưa code mới biết cái mớ bùi nhùi nì là gì hehe
    HT117-5277

  8. #8
    Ngày gia nhập
    10 2010
    Bài viết
    9

    Trích dẫn Nguyên bản được gửi bởi treatmaster Xem bài viết
    hàm này là trả về 1node, theo tên thì là chèn vào giữa, dựa vào kiểu trả về vs tham số thì có thể là tìm node có key là Inf.
    phải đưa code mới biết cái mớ bùi nhùi nì là gì hehe
    UHm, nói thế thì khai báo kiểu như thế cũng là 1 hàm đúng k bạn?
    Thanks.

  9. #9
    Ngày gia nhập
    11 2010
    Nơi ở
    hell
    Bài viết
    165

    Trích dẫn Nguyên bản được gửi bởi Jay712 Xem bài viết
    UHm, nói thế thì khai báo kiểu như thế cũng là 1 hàm đúng k bạn?
    Thanks.
    uh.
    khai báo 1 hàm thì gồm có
    (kiểu trả về) [tên hàm](danh sách tham số truyền vào)
    HT117-5277

  10. #10
    Ngày gia nhập
    10 2011
    Bài viết
    46

    @Jay712:
    Trong DSLK, bạn phải hiểu con trỏ cũng là một biến, muốn thay đổi con trỏ bạn phải một là truyền tham chiếu, hay là truyền con trỏ. Thường truyền con trỏ sẽ rõ nghĩ hơn, dùng tham chiếu thì thường đi với "hằng tham chiếu" (const reference).
    Với lại code của bạn bị memory leak, trong hàm add().

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

  1. Trình duyệt Opera, giúp bạn trải nghiệm tốt hơn khi duyệt wap
    Gửi bởi hailuacuibep trong diễn đàn Software (Phần mềm) | Ebooks
    Trả lời: 2
    Bài viết cuối: 02-01-2013, 12:12 PM
  2. Duyệt các controls bằng foreach thì control nào sẽ được duyệt trước
    Gửi bởi chitviv trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 05-10-2011, 10:01 PM
  3. Cách thức duyệt tiền tự trên cây khi duyệt từ con trái nhất rồi sang anh em ruột phải?
    Gửi bởi tyrant trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 0
    Bài viết cuối: 14-09-2011, 10:53 AM
  4. ADO.NET Thứ tự của control( textbox) được duyệt khi chạy đệ quy duyệt các control trên form
    Gửi bởi caheoxanh trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 17-06-2011, 09:12 PM
  5. Làm sao xóa phần tử nhỏ nhất trên dslk đơn( chỉ duyệt mảng 1 lần)
    Gửi bởi clanks trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 15
    Bài viết cuối: 22-12-2010, 08:37 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