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

Đề tài: Danh sách liên kết ???

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

    Mặc định Danh sách liên kết ???

    Mình có một DSLK được khai báo như sau:

    Code:
    struct number
    {
    	int value;
    	number* next;
    };
    
    struct number *head=NULL,*t,*p,*q;
    DSLK này được nhập theo đúng thứ tự tăng dần. Giờ mình muốn chèn một phần tử vào đúng vị trí của nó, mình dùng code sau:

    Code:
    //Chen mot phan tu
    	t=head;
    	cout<<"Nhap gia tri can chen vao: ";
    	cin>>x;
    	while (t->next!=NULL)
    	{	
    		q=t->next;
    		if((t->value<=x)&&(q->value>=x))
    		{
    			p=new number;
    			p->value=x;
    			p->next=q;
    			t->next=p;
    			
    		}
    		t=t->next;
    	}
    Mình cho dịch chương trình thì ko báo lỗi nhưng khi chạy thì cứ đến chỗ "Nhap gia tri can chen vao: " thì đơ luôn. Bạn nào chỉ cho mình sai ở chỗ nào mới. Cảm ơn.

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

    Post cả hết cả bài lên luôn đi cậu !

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

    Code:
    #include "iostream.h"
    
    struct number
    {
    	int value;
    	number* next;
    };
    
    void main()
    {
    	int n,x,i;
    	struct number *head=NULL,*t,*p,*q;
    
    	// Nhap
    	cout<<"Nhap n= ";
    	cin>>n;
    	for (i=0;i<n;i++)
    	{
    		cout<<"Phan tu thu "<<i+1<<" la ";
    		cin>>x;
    		t=new number;
    		t->value=x;
    		t->next=head;
                    head=t;
    	}
    	
    
    	// Xuat ra man hinh
    	t=head;
    	cout<<"Cac phan tu vua nhap la ";
    	while (t!=NULL)
    	{
    		x=t->value;
    		cout<<" "<<x;
    		t=t->next;
    	}
    
    	//Chen mot phan tu
    	t=head;
    	cout<<"Nhap gia tri can chen vao: ";
    	cin>>x;
    	while (t->next!=NULL)
    	{	
    		q=t->next;
    		if((t->value<=x)&&(q->value>=x))
    		{
    			p=new number;
    			p->value=x;
    			p->next=q;
    			t->next=p;
    			
    		}
    		t=t->next;
    	}
    		
    }
    Mong các bạn giúp đỡ

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

    Thành thật sorry cậu, tui làm nãy h gần cả tiếng mới ra, lại bận đi qua nhà bà dì nên không trả lời liền cho cậu được.
    - Đúng là tui quá chủ quan, do tui viết link list dạng class quen rùi mà tui quên mất khai báo kiểu đó là thì cái link là global scope, debug cả tiếng đồng hồ T_T. Gà không chịu được.
    - Góp ý cho cậu :
    + viết con trỏ không bao h đặt tên biến 1 chữ cái (q,t,v,a,...), vì debug con trỏ phải comment và đặt tên kiểu này thì có nc debug bằng niềm tin cậu à, chịu khó đặt tên cho nó dài 1 chút, không tốn hơn bao nhiêu thời gian đâu mà còn tốt hơn cho việc debug.
    Tui đã viết lại + 1 số comment cho cậu thông suốt đã, còn code của cậu tui sẽ tìm bug rùi trả lời cho cậu sau vì nói thật tui không quen đọc code kiểu struct C cho lắm.
    C++ Code:
    1. #include <iostream>
    2. #include <cstdlib>
    3.  
    4. void insert_sort(const int& x);
    5. void traverse();
    6. void add(const int& x);
    7.  
    8. struct node{
    9.   int data;
    10.   node *next;
    11. };
    12.  
    13. node *head = NULL;
    14. //Hàm này là hàm cậu sai
    15. void insert_sort(const int& x){
    16.   //1 node giữ thằng đầu, và thằng kế tiếp nó
    17.   node *prev, *foll;
    18.   //nếu list rỗgn thì ok -> báo rỗng
    19.   if(head == NULL){
    20.     std::cout << "Empty list detected\n";
    21.   }
    22.  
    23.   else{
    24.     //thằng prev ( previous ) giữ cái head
    25.     //foll ( following giữ thằng kế tiếp nó )
    26.     prev = head;
    27.     foll = prev->next;
    28.     //Khi vòng lặp while này kết thúc thì thằng
    29.     //prev sẽ trỏ ngay vị trí cần chèn vào
    30.     while(prev->data > x || foll->data < x){
    31.       prev = prev->next;
    32.       foll = prev->next;
    33.     }
    34.     //tạo 1 node mới tên new_node
    35.     node* new_node = new node;
    36.     //set dữ liệu cho nó
    37.     new_node->data = x;
    38.     //liên kết 2 link tạo thành 1 link list
    39.     prev->next = new_node;
    40.     new_node->next = foll;
    41.   }
    42. }
    43. //Hàm in ra có lẽ cậu cũng dễ dàng hiểu dc
    44. void traverse(){
    45.   if(head == NULL){
    46.     std::cout << "Empty []\n";
    47.     return ;
    48.   }
    49.   node *_iter;
    50.    
    51.   _iter = new node;
    52.   _iter = head;
    53.   while(_iter->next != NULL){
    54.     std::cout << _iter->data << '\n';
    55.     _iter = _iter->next;
    56.   }
    57.   std::cout << _iter->data << '\n';
    58. }
    59.  
    60. //Chỗ này tui pass const ref giống như pass bằng trị thôi, nhưng tui
    61. //quen pass const ref vì nó tạo cho tui thói quen không tạo
    62. //ra 1 copy của biến khi không cần thiết, tuy đây chỉ là 1 biến int
    63. //nhưng nếu là 1 struct hay 1 class thì sẽ là quá lãng phí
    64. void add(const int& x){
    65.   node *iss, *_iter;
    66.   iss = new(node);
    67.   iss->data = x;
    68.   iss->next = NULL;
    69.  
    70.   if(head == NULL){
    71.     head = iss;
    72.     return;
    73.   }
    74.   else{
    75.     _iter = head;
    76.     while(_iter->next != NULL)
    77.       _iter = _iter->next;
    78.       _iter->next = iss;
    79.   }
    80. }
    81. //Giải phóng vùng nhớ
    82. void release(){
    83.   while(head->next != NULL){
    84.     head = head->next;
    85.     delete head;
    86.   }
    87.   head = 0;
    88. }
    89.  
    90. int main(){
    91.  
    92.   add(1);
    93.   add(2);
    94.   add(4);
    95.   add(6);
    96.   add(7);
    97.   add(8);
    98.  
    99.   int value = 5;
    100.  
    101.   insert_sort(value);
    102.   traverse();
    103.   return 0;
    104. }
    Đây chắc là code tồi nhất mà tui từng viết T_T, quen viết kiểu class mà coi thường procedural cũng thật là T_T, tui sẽ nghĩ cách tốt hơn.
    Nhưng nói chung làm kiểu này rất không an toàn về nhiều mặt :
    - Tạo 1 node global -> very poor design.
    - Node chỉ nên là 1 type, và 1 class Link sẽ gồm các node sẽ rõ hơn vấn đề
    - cout và cin là của C++, nếu viết C thì nên dùng printf và scanf.
    - Nếu viết C++ nên dùng class.

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

    rox_rook có thể giải thích cho mình hiểu về đoạn code :
    Code:
     while(prev->data > x || foll->data < x){
          prev = prev->next;
          foll = prev->next;
        }
    Với lại đoạn này nữa
    Code:
    head = head->next;
    Thầy giạy đoạn đó nhanh quá làm em kô hiểu em mới năm 1 àh thông cảm nha
    Code:
    int main(){
      
      add(1);
      add(2);
      add(4);
      add(6);
      add(7);
      add(8);
    
      int value = 5;
    
      insert_sort(value);
      traverse();
      return 0;
    }
    Còn thêm cái hàm int main() lần đầu tiên gặp nữa. Hic sao em ngu wá vậy nè
    Đã được chỉnh sửa lần cuối bởi atuan1989 : 27-03-2008 lúc 07:54 AM.

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

    Mặc định Danh sách liên kết ???

    Ví dụ 1 danh sách gồm :

    [A] [B] [C] [D]
    Và prev đang trỏ tới [B]
    -> prev = prev->next nghĩa là nó trỏ tới thằng kế [B] là [C]
    prev là previous ( thằng trước thằng hiện tại )
    foll là following ( thằng sau thằng hiện tại )
    1 thằng giữa cái sau lưng và 1 thằng giữ cái trước, sthing look like
    [prev]->[hiện tại]->[foll]
    Tui muốn insert vào vị trị mà đảm bảo nó vừa lớn hơn prev và nhỏ hơn foll.
    Vậy thì...suy nghĩ tí đi

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

    Chắc lục lại những cái cơ bản rồi coi lại quá.Điệu này chắc rớt môn cấu trúc dữ liệu rùi hic.
    Đã được chỉnh sửa lần cuối bởi atuan1989 : 27-03-2008 lúc 07:48 PM.

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