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ố 11 kết quả

Đề tài: Help! Lỗi bài danh sách liên kết đơn.

  1. #1
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Mặc định Help! Lỗi bài danh sách liên kết đơn.

    Bài danh sách liên kết đơn, chưa đủ tất cả các thao tác, nhưng đây là 1 số, mình viết rồi thử lun, không báo lỗi, nhưng cho kết quả ko đúng. Các bro kiểm tra giúp nha
    C++ Code:
    1. #include <iostream.h>
    2. #include <conio.h>
    3.  
    4. struct node
    5. {
    6.        int info;
    7.        node* next;
    8. };
    9.  
    10. void khoitaorong(node* a)
    11. {
    12.      a=NULL;           //  ko khởi tạo rỗng đc
    13.  
    14. int kiemtrarong(node *a)
    15. {
    16.      return ( a==NULL  ? 1 : 0 );
    17. }
    18.  
    19.  
    20. void push_first(int x, node *a)
    21. {
    22.     node *p = new node;
    23.     p->info = x;
    24.    
    25.     if ( a==NULL )
    26.     {
    27.          a = p;
    28.          a->next = NULL;
    29.     }
    30.     else
    31.     {
    32.         p->next = a;
    33.         a = p;
    34.     }
    35. }
    36.  
    37. void push_last(int x, node *a)
    38. {
    39.      node *p,*tmp;
    40.      p = new node;
    41.      tmp = new node;
    42.      tmp = a;
    43.      p->info = x;
    44.      
    45.      if ( a == NULL )
    46.      {
    47.           a = p;
    48.           a->next = NULL;
    49.      }
    50.      else
    51.      {
    52.          while ( tmp->next !=NULL ) tmp = tmp->next;
    53.          tmp->next = p;
    54.          p->next = NULL;
    55.      }
    56. }
    57.  
    58. void insert(int x, int p, node *a)
    59. {
    60.      node *q,*tmp;
    61.      int vitri=0;
    62.      q = new node;
    63.      tmp = new node;
    64.      tmp = a;
    65.      q->info = x;
    66.      
    67.      if ( a == NULL || p == 0 )
    68.      {  
    69.          if ( p ==0 ) q->next = a;
    70.          a = q;
    71.          if ( a == NULL ) a->next = NULL;
    72.      }
    73.      else
    74.      {
    75.           while ( vitri++ < p-1 && tmp->next != NULL ) tmp = tmp->next;
    76.           q->next = tmp->next;
    77.           tmp->next=q;
    78.      }
    79. }
    80.  
    81.  
    82.  
    83. void nhap(node *a, int n)
    84. {
    85.      int x;
    86.      cout<<"\nNhap du lieu cho danh sach lk don.\n";
    87.      for ( int i = 0; i<n; i++)
    88.      {
    89.          cin>>x;
    90.          push_last(x,a);          //Nếu dùng pust_first thì sai
    91.      }
    92.      cout<<"\nKet thuc nhap.\n";
    93. }
    94.  
    95. void xuat(node *a)
    96. {
    97.      cout<<"\nXuat du lieu.\n";
    98.      node *tmp = new node;
    99.      tmp = a;
    100.      while ( tmp != NULL )
    101.      {
    102.            cout<<tmp->info;
    103.            tmp = tmp->next;
    104.      }
    105. }
    106.  
    107.        
    108.      
    109. main()
    110. {
    111.       node *ds = new node;
    112.      
    113.       khoitaorong(ds);
    114.       if ( kiemtrarong(ds) ) cout<<"\nDanh sach noi don rong.\n";
    115.       else cout<<"\nDanh sach noi don khong rong.\n";
    116.      
    117.       nhap(ds,5);
    118.       xuat(ds);
    119.      
    120.       insert(8,3,ds);
    121.       xuat(ds);
    122.      
    123.      
    124.      
    125.      
    126.       getch();
    127.      
    128. }

    1 - Hàm khởi tạo rỗng sai.
    2 - Nhập nếu dùng pust_first thì sai.
    Giải thích dùm mình nhé, cái này tìm hoài, ko hiểu vì sao hết thx
    Đã được chỉnh sửa lần cuối bởi camping29 : 23-10-2008 lúc 10:46 AM. Lý do: Thêm thông tin bài viết

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

    Ko biết bạn đã học pass-by-value và pass-by-reference chưa nhỉ? Bạn chỉ có thể thay đổi giá trị của biến đưa vào nếu bạn pass-by-reference hoặc pass-by-value với value là con trỏ/địa chỉ của biến đó.
    Ví dụ bạn có biến x thì khi gọi hàm Function1 (x) (pass-by-value), thì cho dù Function1 làm gì đi nữa thì sau khi nó chạy xong, giá trị của biến x vẫn ko đổi.

    Cả 2 lỗi trên của bạn là sai cái đó
    Code:
    void khoitaorong(node* a)
    {
         a=NULL;           //  ko khởi tạo rỗng đc
    }
    Ví dụ biến a ở đây là local variable, thay đổi nó cũng ko có tác dụng gì cả
    Đã được chỉnh sửa lần cuối bởi Lugiavn : 23-10-2008 lúc 11:03 AM.

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Chưa hiểu tham chiếu dám viết danh sách liên kết. Tui cũng potay.com với mấy cậu !

  4. #4
    Ngày gia nhập
    03 2008
    Bài viết
    12

    danh sach liên kết.dùng liên kết đơn
    C++ Code:
    1. // bai1.cpp : Defines the entry point for the console application.
    2. //
    3.  
    4. #include "stdafx.h"
    5. #include "iostream"
    6. using namespace std;
    7.  
    8. //-------------------------------------------
    9.  
    10. struct Node
    11. {
    12.     int key;
    13.     Node *next;
    14. };
    15. Node *head;
    16. void init()//khoi tao head
    17. {
    18.     head=NULL;
    19. }
    20. void insertfist(int x)//chen x vao dau
    21. {
    22.     Node *p;
    23.     p=new Node;
    24.     p->key=x;
    25.     p->next=head;
    26.     head=p;
    27. }
    28. //Them phan tu vao giua va cuoi danh sach
    29. void insertMiddle(Node *q,int x)
    30. {
    31.     Node *p;
    32.     p=new Node;
    33.     p->key=x;
    34.     p->next=q->next;
    35.     q->next=p;
    36. }
    37. //------------------tim kiem--------------
    38. Node *search(int x)
    39. {  
    40.     Node *q;
    41.     q=head;
    42.     while(q!=NULL&&q->key!=x)
    43.         q=q->next;
    44.     return q;
    45. }
    46.  
    47. //----------------------------------------
    48. void display()//hien thi
    49. {
    50.     Node *q;
    51.     q=head;
    52.     while(q!=NULL)
    53.     {
    54.         cout<<q->key<<" ";
    55.         q=q->next;
    56.     }
    57.     cout<<endl;
    58. }
    59. //-----------------tbc--------------------
    60. double TBC()//trung binh cong
    61. {
    62.     int sum,count;
    63.     sum=count=0;
    64.     Node *q;
    65.     q=head;
    66.     while(q!=NULL)
    67.     {
    68.         sum+=q->key;
    69.         count++;
    70.         q=q->next;
    71.     }
    72.     if(count!=0)
    73.         return double(sum)/count;
    74.     else
    75.         return 0.0;
    76. }
    77. //----------------main--------------------
    78. int main()
    79. {
    80.     init();
    81.     int x;
    82.     Node *q,*p,*r;
    83.     cout<<"Nhap gia tri duong: ";
    84.     cin>>x;
    85.     while(x>=0)
    86.     {
    87.          insertfist(x);
    88.          cout<<"Nhap gia tri duong: ";
    89.          cin>>x;     
    90.     }
    91.     display();
    92.     cout<<"Trung binh cong la: "<<TBC()<<endl;
    93.  
    94.     cout<<"Nhap gia tri can tim:";
    95.     cin>>x;
    96.     q=search(x);
    97.     if(q!=NULL)
    98.     {
    99.         cout<<"Nhap gia tri can them:";
    100.         cin>>x;
    101.         insertMiddle(q,x);
    102.             display();
    103.  
    104.     }
    105.     else
    106.         cout<<"khong tim thay!!!"<<endl;
    107.     //-------------hoan doi--------------------
    108.     if(q!=NULL)
    109.     {
    110.         r=q->next;
    111.         if(q!=head)
    112.         {
    113.             p=head;
    114.             while(p->next!=q)
    115.    
    116.                 p=p->next;
    117.                 p->next=q->next;
    118.  
    119.        
    120.         }
    121.         else
    122.             head=q->next;
    123.         q->next=r->next;
    124.         r->next=q;
    125.         display();
    126.        
    127.     }
    128.     display();
    129.     q=head;
    130.     while(q!=NULL)
    131.     {
    132.         cout<<"head"<<head->key<<", ";
    133.         delFisrt();
    134.         q=head;
    135.     }
    136.  
    137.     return 0;
    138. }
    nguyên tắc muốn thêm hay xóa 1 phần tử thì pải biết phần tử đứng trước nó.
    bạn nào chưa hỉu hoặc muốn thêm hàm minh có thể giúp
    HỌC HỌC NỮA HỌC MÃI.
    YÊU LÀM CHI CHO ĐỜI THÊM KHỔ.
    HỌC CHI NHIỀU XÁCH RỔ ĂN XIN.

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

    Mình mới làm quen với C++ nên hok biết nhiều, Mình làm thử bài DS lien kết đơn này nhưng nó bị lỗi chổ khởi tạo DS, mình không sao sửa được, mong các bạn giúp mình giải quyết lỗi này!! Thanks

    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    //Khai bao cau truc du lieu
    //===========================
    struct NODE
    {
    	int info;
       struct NODE *next;
    };
    typedef struct NODE *node;
    //Khai bao cac prototype
    //==========================
    void Initialize();
    void NhapDS(node *pfirst,node *plast);
    void XuatDS(node *pfirst);
    node Getnode();
    void main()
    {
    	int chon;
    	node *pfirst,*plast;
    	clrscr();
       printf("\n\tNhap DS!");
       NhapDS(pfirst,plast);
       printf("\n\tBAI TAP CHUONG DS LIEN KET DON!");
       printf("\n\t1: Nhap DS!");
       printf("\n\t2: Xuat DS!");
       printf("\n\t..............");
       printf("\n\tBAN CHON CHUC NANG NAO?");
       scanf("%d",&chon);
       switch (chon)
       {
       	case 1:
          {
          	clrscr();
             printf("\n\tNhap DS moi!");
             NhapDS(pfirst,plast);
             getch();
             break;
          }
          case 2:
          {
          	clrscr();
             printf("\n\tDS hien tai!");
             XuatDS(pfirst);
             getch();
             break;
          }
       }
    }
    //Khoi tao ds
    //=============================
    node *pfirst,*plast;
    void Initialize()
    {
    	&pfirst=&plast=NULL;
    }
    //Cap phat vung nho
    //============================
    node Getnode()
    {
    	node p;
    	p=(node)malloc(sizeof(struct NODE));
       p->next=NULL;
       return p;
    }
    //Nhap DS
    //=================================
    void NhapDS(node *pfirst,node *plast)
    {
    	node p,q;
    	int n,x;
     	Initialize();
       printf("\n\tNhap so ptu: ");
       scanf("%d",&n);
       printf("\n\tNhap noi dung cac ptu");
       for(int i=0;i<n;i++)
       {
       	printf("\n\tNhap noi dung ptu thu %d: ",i+1);
          scanf("%d",&x);
          q=Getnode();
          q->info=x;
          q->next=NULL;
          if (*pfirst == NULL)
          {
          	*pfirst=q;
             p=*pfirst;
          }
          else
          {
          	p->next=q;
             p=q;
          }
       }*plast=p;
    }
    void XuatDS(node *pfirst)
    {
    	if (*pfirst==NULL) printf("DS rong!");
       else
       {
       	while (*pfirst != NULL)
          	printf("%7d",*pfirst);
       }
    }

  6. #6
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Mặc định Help! Lỗi bài danh sách liên kết đơn.

    Đây là code C chứ C++ đâu bạn .
    PHP Code:
    void Initialize()
    {
        &
    pfirst=&plast=NULL;

    Lần đầu tiên mới thấy kiểu gán này,xem lại phần con trỏ đi bạn.
    Cánh Chym ứ mỏi

  7. #7
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Bài này tui sửa ngon rồi, còn 1 số râu ria chưa thêm vào nhưng nhìn sơ bộ tạm ổn
    C++ Code:
    1. #include <iostream.h>
    2. #include <conio.h>
    3.  
    4. struct node
    5. {
    6.        int info;
    7.        node* next;
    8. };
    9.  
    10. typedef node * List;
    11.  
    12. void khoitaorong(List &a)   //node *&a
    13. {
    14.      a=NULL;          
    15. }
    16.  
    17. int kiemtrarong(List &a)
    18. {
    19.      return ( a==NULL  ? 1 : 0 );
    20. }
    21.  
    22.  
    23. void push_first(int x, List &a)
    24. {
    25.     node *p;
    26.     p =  new node;
    27.     p->info = x;
    28.  
    29.     if ( a==NULL )
    30.     {
    31.          a = p;
    32.          a->next = NULL;
    33.     }
    34.     else
    35.     {
    36.         p->next = a;
    37.         a = p;
    38.     }
    39. }
    40.  
    41. void push_last(int x, List &a)
    42. {
    43.      node *p,*tmp;
    44.      p    = new node;
    45.      tmp = new node;
    46.      p->info = x;
    47.      tmp  = a;
    48.  
    49.      if ( a == NULL )
    50.      {
    51.           a = p;
    52.           a->next = NULL;
    53.      }
    54.      else
    55.      {
    56.          while ( tmp->next !=NULL ) tmp = tmp->next;
    57.          tmp->next = p;
    58.          p->next   = NULL;
    59.      }
    60. }
    61.  
    62. void insert(int x, int p, List &a)
    63. {
    64.      node *q,*tmp;
    65.      int vitri=1;
    66.      q   = new node;
    67.      tmp = new node;
    68.      tmp = a;
    69.      q->info = x;
    70.  
    71.      if ( p>=1 )
    72.      {
    73.           cout<<"\nChen "<<x<<" vao vi tri "<<(p)<<" cua danh sach.";
    74.          
    75.           if ( a == NULL || p == 1 )
    76.           {
    77.              if ( p == 1 ) q->next = a;
    78.              a = q;
    79.              if ( a == NULL ) a->next = NULL;
    80.           }
    81.          
    82.           else
    83.           {
    84.               while ( vitri++ < p-1 && tmp->next != NULL ) tmp = tmp->next;
    85.               q->next = tmp->next;
    86.               tmp->next=q;
    87.           }
    88.      }
    89.      else cout<<"\nNhap sai vi tri p can chen.\n";
    90. }
    91.  
    92.  
    93.  
    94. void create_list(List &a, int n)
    95. {
    96.      int x;
    97.      cout<<"\nNhap du lieu cho danh sach lk don.\n";
    98.      for ( int i = 0; i<n; i++)
    99.      {
    100.          cin>>x;
    101.          push_last(x,a);   
    102.      }
    103.      cout<<"\nKet thuc nhap.\n";
    104. }
    105.  
    106. void print_list(List a)
    107. {
    108.      cout<<"\nXuat du lieu.\n";
    109.      node *tmp = new node;
    110.      tmp = a;
    111.      while ( tmp != NULL )
    112.      {
    113.            cout<<tmp->info<<" ";
    114.            tmp = tmp->next;
    115.      }
    116.      cout<<"\nKet thuc xuat.\n";
    117. }
    118.  
    119. void del_node(int p, List &a)
    120. {
    121.      int vitri;
    122.      vitri=1;
    123.      node *tmp,*q;
    124.      tmp = new node;
    125.      q = new node;
    126.      tmp = a;
    127.      if ( a == NULL )
    128.           cout<<"\nDanh sach rong.";
    129.      else if ( p ==1 )
    130.      {
    131.           cout<<"\nXoa phan tu dau tien cua danh sach.";
    132.           q = a;
    133.           a = a->next;
    134.           delete q;
    135.      }
    136.      else
    137.      {
    138.           cout<<"\nXoa phan tu thu "<<(p)<<" cua danh sach.";
    139.           while( vitri++ < p-1 && tmp->next != NULL ) tmp = tmp->next;
    140.           q = tmp->next;
    141.           tmp->next = tmp->next->next;
    142.           delete q;
    143.      }
    144. }
    145.  
    146. main()
    147. {
    148.       node *ds = new node;
    149.  
    150.       khoitaorong(ds);
    151.       if ( kiemtrarong(ds) ) cout<<"\nDanh sach noi don rong.\n";
    152.       else cout<<"\nDanh sach noi don khong rong.\n";
    153.  
    154.       create_list(ds,5);
    155.       print_list(ds);
    156.  
    157.       insert(8,3,ds);
    158.       print_list(ds);
    159.      
    160.       del_node(3,ds);
    161.       print_list(ds);
    162.      
    163.       getch();
    164.      
    165. }
    Ai co ý kiến j thì cho xin lun nha, rất cảm ơn mí bạn chi ý kiến đó
    Đã được chỉnh sửa lần cuối bởi camping29 : 12-11-2008 lúc 11:38 PM. Lý do: Thêm thông tin

  8. #8
    Ngày gia nhập
    09 2008
    Nơi ở
    Đà Nẵng
    Bài viết
    18

    Trích dẫn Nguyên bản được gửi bởi Lugiavn Xem bài viết
    Ko biết bạn đã học pass-by-value và pass-by-reference chưa nhỉ? Bạn chỉ có thể thay đổi giá trị của biến đưa vào nếu bạn pass-by-reference hoặc pass-by-value với value là con trỏ/địa chỉ của biến đó.
    Ví dụ bạn có biến x thì khi gọi hàm Function1 (x) (pass-by-value), thì cho dù Function1 làm gì đi nữa thì sau khi nó chạy xong, giá trị của biến x vẫn ko đổi.

    Cả 2 lỗi trên của bạn là sai cái đó
    Code:
    void khoitaorong(node* a)
    {
         a=NULL;           //  ko khởi tạo rỗng đc
    }
    Ví dụ biến a ở đây là local variable, thay đổi nó cũng ko có tác dụng gì cả
    Nói đơn giản là tham trị và tham chiếu đó bạn

  9. #9
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Bít òy, lỗi sửa òy, code post ở trên kìa, coi thử được chưa nà :|

  10. #10
    Ngày gia nhập
    09 2008
    Bài viết
    28

    Mình sửa đổi lại chút xíu bài của bạn camping29 nè. Chương trình biên dịch và chạy ngon lành.

    Code:
    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    struct node
    {
        int info;
        node* next;
    };
    
    typedef node *List;
    
    void khoitaorong(List &a)   //node *&a
    {
        a=NULL;          
    }
    
    int kiemtrarong(List &a)
    {
        return ( a==NULL  ? 1 : 0 );
    }
    
    
    void push_first(int x, List &a)
    {
        node *p;
        p =  new node;
        p->info = x;
    
        if ( a==NULL )
        {
            a = p;
            a->next = NULL;
        }
        else
        {
            p->next = a;
            a = p;
        }
    }
    
    void push_last(int x, List &a)
    {
        node *p, *tmp;
        p = new node;
        tmp = new node;
        p->info = x;
        tmp  = a;
    
        if ( a == NULL )
        {
            a = p;
            a->next = NULL;
        }
        else
        {
             while ( tmp->next !=NULL ) tmp = tmp->next;
             tmp->next = p;
             p->next   = NULL;
        }
    }
    
    void insert(int x, int p, List &a)
    {
        node *q,*tmp;
        int vitri=1;
        q   = new node;
        tmp = new node;
        tmp = a;
        q->info = x;
    
        if ( p>=1 )
        {
             cout << "\nChen " << x << " vao vi tri " << (p) << " cua danh sach.";
    
            if ( a == NULL || p == 1 )
            {
                if ( p == 1 ) q->next = a;
                a = q;
                if ( a == NULL ) a->next = NULL;
            }
            else
            {
                while ( vitri++ < p-1 && tmp->next != NULL ) tmp = tmp->next;
                q->next = tmp->next;
                tmp->next=q;
            }
        }
        else cout<<"\nNhap sai vi tri p can chen.\n";
    }
    
    void create_list(List &a, int n)
    {
        int x;
        cout<<"\nNhap du lieu cho danh sach lk don.\n";
        for ( int i = 0; i<n; i++)
        {
            cin>>x;
            push_last(x,a);    
        }
        cout<<"\nKet thuc nhap.\n";
    }
    
    void print_list(List a)
    {
        cout<<"\nXuat du lieu.\n";
        node *tmp = new node;
        tmp = a;
        while ( tmp != NULL )
        {
            cout<<tmp->info<<" ";
            tmp = tmp->next;
        }
        cout<<"\nKet thuc xuat.\n";
    }
    
    void del_node(int p, List &a)
    {
        int vitri;
        vitri=1;
        node *tmp,*q;
        tmp = new node;
        q = new node;
        tmp = a;
        if ( a == NULL )
             cout<<"\nDanh sach rong.";
        else if ( p ==1 )
        {
            cout << "\nXoa phan tu dau tien cua danh sach.";
            q = a;
            a = a->next;
            delete q;
        }
        else
        {
            cout << "\nXoa phan tu thu " << (p) << " cua danh sach.";
            while( vitri++ < p-1 && tmp->next != NULL ) tmp = tmp->next;
                q = tmp->next;
                tmp->next = tmp->next->next;
    	delete q;
        }
    }
    
    int main()
    {
        node *ds = new node;
    
        khoitaorong(ds);
    
        if ( kiemtrarong(ds) )
            cout<<"\nDanh sach noi don rong.\n";
        else
            cout<<"\nDanh sach noi don khong rong.\n";
            
            create_list(ds,5);
            print_list(ds);
            
            insert(8,3,ds);
            print_list(ds);
    
            del_node(3,ds);
            print_list(ds);
    
            getch();
    
            return EXIT_SUCCESS;
    }

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

  1. Hướng dẫn Biểu diễn thích hợp bằng danh sách liên kết đơn hoặc danh sách liên kết kép
    Gửi bởi maitrung trong diễn đàn Thủ thuật, Tutorials CTDL & Giải thuật
    Trả lời: 3
    Bài viết cuối: 04-08-2012, 08:01 PM
  2. Cấu trúc dữ liệu Cách tạo danh sách liên kết mới từ danh sách liên kết đã cho như thế nào?
    Gửi bởi giacmo1612 trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 2
    Bài viết cuối: 30-11-2011, 04:43 PM
  3. Nhập và xuất danh sách liên kết lồng danh sách liên kết?
    Gửi bởi nvluong_it 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: 22-04-2011, 11:30 AM
  4. Lập trình C Danh sách liên kết - Xử lý danh sách liên kết trong lập trình C
    Gửi bởi phucduan 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: 08-11-2010, 10:25 PM
  5. Danh sách liên kết, code nhập danh sách sinh viên có lỗi làm sao sửa?
    Gửi bởi acmilan 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: 10-04-2009, 08:24 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