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

Đề tài: linked list | Danh sách liên kết | Lỗi do đâu?

  1. #1
    Ngày gia nhập
    03 2009
    Bài viết
    9

    Mặc định linked list | Danh sách liên kết | Lỗi do đâu?

    cho em hỏi .. đoạn code này sai ở đâu mà khi chạy thì nó chỉ in ra có mỗi cái head ... các node sau nó bỏ hết ráo!
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    void main()
    {
    	struct linkedlist
    	{
    		int data;
    		linkedlist *next;
    	};
    	typedef struct linkedlist ll;
    	ll *pointer,*head;
    	pointer=NULL;
    	int n;
    	printf("Enter the number of data : ");
    	scanf("%d",&n);
    	for(int i=0;i<n;i++)
    	{
    		pointer=(ll*)calloc(1,sizeof(ll));
    		printf("Enter data %d: ",i+1);
    		scanf("%d",&pointer->data);
    		if(i==0)
    		{
    			head = pointer;
    		}
    		pointer->next=NULL;
    		pointer=pointer->next;
    	}
    	printf("\nOutput");
    	pointer=head;
    	while(pointer!=NULL)
    	{
    		printf("\n%d",pointer->data);
    		free(pointer);
    		pointer=pointer->next;
    		
    	}
    }

  2. #2
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    thì cấp phát bộ nhớ động cho head chưa
    None!

  3. #3
    Ngày gia nhập
    03 2009
    Bài viết
    9

    thực tình đệ cũng ko hiểu ... con trỏ head trỏ tới một vùng nhớ đã dc cấp phát thì ... tại sao lại phải cấp phát cho nó vậy?

  4. #4
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Trích dẫn Nguyên bản được gửi bởi xai1lanroibo Xem bài viết
    thực tình đệ cũng ko hiểu ... con trỏ head trỏ tới một vùng nhớ đã dc cấp phát thì ... tại sao lại phải cấp phát cho nó vậy?
    thì cũng kiểu là:
    + khai báo kiểu con trỏ => cho phép thằng nào đó vào chơi game
    + cấp phát bộ nhớ => cho phép chơi bao lâu
    None!

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

    thử cấp phát "kiểu thô thiển" cho head rùi ... nhưng đệ lại thu dc kết quả là 0 trên màn hình ( dùng calloc ). ( ko phải kết quả mà đệ muốn nó lưu ). Mà huynh chạy thử đi, thấy nó chỉ in ra có mỗi giá trị của cái head àh ... huynh mở mang dùm đệ cái!

  6. #6
    Ngày gia nhập
    01 2009
    Bài viết
    165

    Mặc định linked list | Danh sách liên kết | Lỗi do đâu?

    pointer->next=NULL;pointer=pointer->next;->pointer=NULL.

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

    hôm rày ngồi ngẫm lại mới thấy lỗi của mình, đúng như chỗ anh kimduquan chỉ ... 2 con trỏ : pointer và pointer->next đều bằng NULL, mà em lại cấp phát pointer thì lại chả liên quan gì pointer->next ráo! Thanks anh lắm lắm.

    mà anh xcross87 ( và cả mấy anh trong forum ) cho em hỏi luôn cái này:
    stack và heap trong bộ nhớ là gì vậy, em có nghe mấy anh nhắc tới nhưng trong tài liệu em đọc thì ko có! Mọi người giảng cho em với

  8. #8
    Ngày gia nhập
    04 2009
    Nơi ở
    một căn hộ nhỏ trên trái đất
    Bài viết
    372

    Trích dẫn Nguyên bản được gửi bởi Xcross87 Xem bài viết
    thì cấp phát bộ nhớ động cho head chưa
    Trích dẫn Nguyên bản được gửi bởi xai1lanroibo Xem bài viết
    thực tình đệ cũng ko hiểu ... con trỏ head trỏ tới một vùng nhớ đã dc cấp phát thì ... tại sao lại phải cấp phát cho nó vậy?
    Mình thấy bạn xai1lanroibo nói đúng đấy, đâu cần phải cấp phát động thêm cho head.
    Trong trường hợp bạn vẫn chưa tìm ra cách làm, có thể tham khảo cách của mình:
    Code:
    ll *pointer,*head,*tmp;//thêm biến phụ tmp
    	pointer=NULL;
    	int n,k;
    	printf("Enter the number of data : ");
    	scanf("%d",&n);
    	for(int i=0;i<n;i++)
    	{
    		pointer=(ll*)calloc(1,sizeof(ll));
    		printf("Enter data %d: ",i+1);
    		scanf("%d",&k);
    		pointer->data=k;
    		if(i==0)
    		{
    			head = tmp = pointer;
    		} else {
    		tmp->next=pointer;
    		tmp=pointer;
                    pointer->next=NULL;//dòng này không cần thiết do đã dùng calloc
    		}
    
    	   
    	}
    Đối với việc in ra kết quả, bạn cần chỉnh một chút
    Code:
    printf("\nOutput");
    	pointer=head;
    	while(pointer!=NULL)
    	{
    		printf("\n%d",pointer->data);
    		tmp=pointer;
    		pointer=pointer->next;
    		free(tmp);
    		
    	}
    Với đoạn mã kết quả mình cần giải thích một chút:
    Nếu như theo đoạn mã cũ của bạn ở phần kết quả thì ở lần for đầu tiên, khi chạy xong free thì pointer=pointer->next không còn ý nghĩa vì lúc này next, data của giá trị được trỏ bởi pointer đã bị xóa, lúc này sẽ gây ra lỗi vi phạm bộ nhớ.

    Trích dẫn Nguyên bản được gửi bởi xai1lanroibo
    mà anh xcross87 ( và cả mấy anh trong forum ) cho em hỏi luôn cái này:
    stack và heap trong bộ nhớ là gì vậy, em có nghe mấy anh nhắc tới nhưng trong tài liệu em đọc thì ko có! Mọi người giảng cho em với
    Theo như những tài liệu mình đã đọc thì bạn có thể hiểu heap là một vùng nhớ đặt biệt, bất kì (tiếng anh heap khá gần với lộn xộn), nó trực tiếp liên quan đến việc cấp phát động vùng nhớ. Còn stack,tất nhiên nó rất có trật tự (không lộn xộn). Khi bạn khai báo bất kì kiểu dữ liệu nào mà không liên quan đến con trỏ thì thực ra kiểu dữ liệu và biến bạn khai báo cũng được cấp phát, nhưng là cấp phát có trật tự theo cơ cấu ngăn xếp. Nhờ vào điều này, mà khi chương trình thoát ra, nó có thể tự dò theo cơ cấu ngăn xếp để xóa bỏ nội dung trong bộ nhớ (chính xác là các giá trị của các biến) một cách tự động vì nó
    được xếp kề nhau. Còn với cấp phát động, bạn cho nó vùng nhớ bất kì, không theo cơ cấu stack, nên phải thủ công xóa nó.
    Đã được chỉnh sửa lần cuối bởi icttrack : 01-05-2009 lúc 04:30 PM.

  9. #9
    Ngày gia nhập
    10 2008
    Nơi ở
    07T1 - DUT
    Bài viết
    101

    head đâu cần cấp phát đâu bác Xcross ơi!
    Sai chỗ này nè bạn!
    Trích dẫn Nguyên bản được gửi bởi xai1lanroibo Xem bài viết
    C Code:
    1.         pointer->next=NULL;
    2.         pointer=pointer->next;   //Sai
    bạn gán kiểu này nè
    C Code:
    1.         pointer->next=head;
    2.         head=pointer;
    gán kiểu này thì phần tử thêm vào trong danh sách sẽ ngược với thứ tự nhập vào!
    Còn nếu muốn trật tự đúng như thứ tự thêm vào bạn phải khai báo thêm một con trỏ trỏ đến phần tử cuối cùng
    Cụ thể là khai báo thêm ll * last =NULL,sau đó
    pointer->next=NULL;
    last->next=pointer;
    Đã được chỉnh sửa lần cuối bởi hoangsan_c : 01-05-2009 lúc 05:01 PM.
    In EarnMoney class doesn't have WorkShy method,but it has WorkingHard method!
    http://vn.myblog.yahoo.com/hoangsan_762

  10. #10
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Lí do tớ bảo cấp phát là cái này

    C++ Code:
    1.         if(i==0)
    2.         {
    3.             head = pointer;
    4.         }
    5.         pointer->next=NULL;
    6.         pointer=pointer->next;  <--- NULL
    7.     }
    8.  
    9.     pointer=head; <---do tại sao chỉ in ra mỗi data ở head mà không in ra tiếp

    chẳng may, kimduquan lại gợi ý thẳng thắn luôn
    None!

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

  1. Danh sách liên kết cơ bản | Linked list basic
    Gửi bởi Kevin Hoang trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 20-11-2016, 10:26 PM
  2. Danh sách liên kết vòng (Circular Linked List)
    Gửi bởi iamvtn trong diễn đàn Thủ thuật, Tutorials CTDL & Giải thuật
    Trả lời: 2
    Bài viết cuối: 14-06-2014, 11:06 PM
  3. vấn đề liên quan giữa Tree và Linked List.!!
    Gửi bởi nhocconan.91 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 14-11-2010, 02:44 PM
  4. tạo 1 danh sách liên kết đơn(Linked List) mới ntn???
    Gửi bởi nhocconan.91 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 15-10-2010, 06:36 AM
  5. In ra danh sách rỗng khi đã nhập danh sách - Linked List trong lập trình C++
    Gửi bởi dieucay555 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 05-03-2008, 11:38 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