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

Đề tài: Hiểu về danh sách liên kết như thế nào?

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

    Mặc định Hiểu về danh sách liên kết như thế nào?

    Em có bài này nhưng không hiểu cách nó chạy lắm anh nào biết chỉ giùm em với, em xin cảm ơn ạ.
    C Code:
    1. #include "stdio.h"
    2. #include "alloc.h"
    3. #include "conio.h"
    4. #include "string.h"
    5. typedef struct pp
    6.     {
    7.         char ht[25];
    8.         char qq[20];
    9.         int tuoi;
    10.         struct pp *tiep;
    11.     } nhansu;
    12. main()
    13.     {
    14.         char tt;
    15.         nhansu *pdau,*pcuoi,*p;
    16.                   char tam[10];
    17.         clrscr();
    18.         pdau=NULL;
    19.         do
    20.             {
    21.                     p=(nhansu*)malloc(sizeof(nhansu));
    22.                     printf("\n Ho ten : ");
    23.                   gets(p->ht);
    24.             printf(" Que quan : ");
    25.                   gets(p->qq);
    26.             printf(" Tuoi: ");
    27.                   gets(tam);
    28.                   p->tuoi=atoi(tam);
    29.                     if (pdau==NULL)
    30.                        {
    31.                          pdau=p;
    32.                          pcuoi=p;
    33.                        p->tiep=NULL;
    34.                     }
    35.                  else
    36.                    {
    37.                      pcuoi->tiep=p;
    38.                          pcuoi=p;
    39.                          p->tiep=NULL;
    40.                    }
    41.               printf("\nBam phim bat ky de tiep tuc, ESC de dung");
    42.               tt=getch();
    43.                } while(tt!=27);
    44.         /* §­a danh s¸ch liªn kÕt ra mµn h×nh, trá pdau tro */
    45.         printf("\n Danh sach nhu sau :\n");
    46.         p=pdau;
    47.         while (p!=NULL)
    48.             {
    49.                 printf("\n Ho ten: %25s  Que : %20s Tuoi :                             %d",(*p).ht,(*p).qq,(*p).tuoi);
    50.                 p=p->tiep;
    51.             }
    52.         getch();
    53.         }
    Ở đoạn code trên em không hiểu tại sao với lệnh if đã tiến hành gán p cho pdau rồi mà lại còn gán pcuoi cho p nữa ? còn ở câu lệnh else thì em hoàn toàn không hiểu tại sao nó lại gán như thế?? Anh, chị nào có thể giải thích cặn kẽ cho em với vì em tự học nên không hiểu được.Em xin cảm ơn mọi người rất nhiều.

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

    if (...)
    Lúc đầu không có gì thì :
    Code:
    pdau
      \
       \
    [dữ liệu][tiếp]--->[dữ liệu][tiếp]--->[dữ liệu][tiếp]--->[dữ liệu][tiếp]--->...
        \
         \ 
         pcuoi
    Vào else thì pdau đã set rùi, cái đầu cũng đã có chủ, chỉ set cho thằng pcuoi thôi.
    Code:
    pdau
      \
       \
    [dữ liệu][tiếp]--->[dữ liệu][tiếp]--->[dữ liệu][tiếp]--->[dữ liệu][tiếp]--->...
        \                              \                                \
         \                              \                                \
         pcuoi......................pcuoi (lần 2)              pcuoi (lần 3)...........................

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

    Ở đoạn code trên em không hiểu tại sao với lệnh if đã tiến hành gán p cho pdau rồi mà lại còn gán pcuoi cho p nữa
    Theo bạn thì nếu như dslk chỉ có 1 phần tử thì sao nhỉ ?

    còn ở câu lệnh else thì em hoàn toàn không hiểu tại sao nó lại gán như thế
    pcuoi->tiep=p;
    pcuoi=p;
    p->tiep=NULL;
    Nó là như thế này , câu lệnh đầu tiên gán pcuoi->tiep cho p là bởi vì lúc này pcuoi->tiep ko còn là NULL nữa mà có thêm p sau nó rùi . Tiếp nữa câu 2 , sau khi có p sau pcuoi rồi thì lúc này p mới là pcuoi đúng ko nào , nên ta gán pcuoi=p . Câu 3 , rất đơn giản là cho p->tiep=NULL thui , vì p đã là pcuoi rùi thì ko còn phần tử nào sau nó nữa .

  4. #4
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,760

    Kể ra giải thích cho bạn hiểu vấn đề này hơi dài nhỉ. Dạo này Dr cũng không có thời gian để mà giải thích cặn kẽ cho các bạn hiểu được. Bạn hiểu đơn giản như thế này:

    Bạn cố gắng theo dõi comments trong code nhé!
    C Code:
    1. #include "stdio.h"
    2. #include "alloc.h"
    3. #include "conio.h"
    4. #include "string.h"
    5. typedef struct pp
    6.     {
    7.         char ht[25];
    8.         char qq[20];
    9.         int tuoi;
    10.         struct pp *tiep;
    11.     } nhansu;
    12. main() // sao main không có kiểu dữ liệu trả về?
    13.     {
    14.         char tt;
    15.         nhansu *pdau,*pcuoi,*p;
    16.                   char tam[10];
    17.         clrscr();
    18.         pdau=NULL; // Chưa có dữ liệu, thằng đầu tiên gán cho nó là NULL, tức chưa có gì cả
    19.         do // Bắt đầu vào việc nhập một danh sách các cấu trúc
    20.             {
    21.                     p=(nhansu*)malloc(sizeof(nhansu)); // Cấp phát bộ nhớ cho p
    22.                     printf("\n Ho ten : "); // Bắt đầu nhập dữ liệu cho mỗi cấu trúc(mỗi bản ghi)
    23.                   gets(p->ht);
    24.             printf(" Que quan : ");
    25.                   gets(p->qq);
    26.             printf(" Tuoi: ");
    27.                   gets(tam);
    28.                   p->tuoi=atoi(tam); // Đến đây là nhập xong dữ liệu cho một cấu trúc nào đó
    29.                     if (pdau==NULL) // Nếu thằng đầu tiên là rỗng
    30.                        {
    31.                          pdau=p; // Thì gán địa chỉ bản ghi p vừa nhập ở trên cho thằng đầu tiên, đánh dấu tui là cấu trúc đầu nhé.
    32.                          pcuoi=p; // Vì lúc này mới có 1 bản ghi nên thằng cuối nó cũng nằm đó thôi. (Chỉ mang tính chất đánh dấu, dựa vào địa chỉ)
    33.                        p->tiep=NULL; //Thằng tiếp sau p chưa có dữ liệu, nên gán cho nó là NULL, nếu không nó sẽ là rác
    34.                     }
    35.                  else // Ngược lại, tức là danh sách đã có một hoặc nhiều bản ghi
    36.                    {
    37.                      pcuoi->tiep=p; // Thì thằng tiếp theo thằng được coi là cuối cùng vừa nãy được chỉ tới địa chỉ bản ghi p vừa nhập ở trên.
    38.                          pcuoi=p; // Thằng cuối cùng lúc này gán tại địa chỉ p tức là đánh dấu lại thằng cuối vì vừa mới nhập thêm dữ liệu.
    39.                          p->tiep=NULL; //Thằng tiếp sau p chưa có dữ liệu, nên gán cho nó là NULL, nếu không nó sẽ là rác
    40.                    }
    41.               printf("\nBam phim bat ky de tiep tuc, ESC de dung");
    42.               tt=getch();
    43.                } while(tt!=27); // Lặp lại, nhập thêm bản ghi mới!
    44.        
    45.  
    46.         printf("\n Danh sach nhu sau :\n");
    47.         p=pdau;
    48.         while (p!=NULL)
    49.             {
    50.                 printf("\n Ho ten: %25s  Que : %20s Tuoi :                             %d",(*p).ht,(*p).qq,(*p).tuoi);
    51.                 p=p->tiep;
    52.             }
    53.         getch();
    54.         }

    Như vậy đấy, bữa nào tớ rảnh sẽ design cho các bạn một slide hoặc một ảnh động để các bạn dễ hình dung về cấp phát động và danh sách liên kết. Mấy dạo này thì bó tay luôn.

    Có chỗ nào chưa hiểu thì cứ hỏi nhé! Nhưng hỏi xong rồi, biết rồi thì chia sẻ lại cho người khác, như thế mới tiến bộ được.
    Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó.
    Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp hoặc bị sự thiếu kỷ luật làm tiêu tan sự nghiệp.

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

    Em hiểu rồi , em cảm ơn anh chị rất nhiều ạ.Mà anh Dr nhớ vụ slide show nhé

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

  1. 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
  2. Nhập xuất danh sách bằng Danh Sách Liên Kết như thế nào?
    Gửi bởi hvcuongit trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 10-12-2010, 10:16 AM
  3. Danh sách liên kết đơn, In danh sách như thế nào?
    Gửi bởi mr_al_one trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 31-10-2010, 11:31 PM
  4. Lập trình C Cài đặt và ứng dụng của Cây Nhị Phân bằng danh sách liên kết như thế nào?
    Gửi bởi hienclubvn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 28-10-2010, 08:04 PM
  5. Cách nhìn về danh sách liên kết như thế nào?
    Gửi bởi honeydl33 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 24-10-2010, 09:28 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