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

Đề tài: Hàm trên cấu trúc và danh sách liên kết

  1. #1
    Ngày gia nhập
    09 2014
    Nơi ở
    Thành phố Hồ Chí Minh
    Bài viết
    2

    Mặc định Hàm trên cấu trúc và danh sách liên kết

    Chương trình này nằm trong cuốn "Kỹ thuật lập trình C từ cơ bản đến nâng cao" (chương cấu trúc, bài danh sách liên kết)
    Chương trình thực hiện đồng thời việc nhập số liệu và sắp xếp theo chiều tăng dần của tuổi.
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <string.h>
    4. #include <stdlib.h>
    5. typedef struct pp
    6. {
    7.     char ht[25];
    8.     char qq[20];
    9.     int tuoi;
    10.     struct pp *tiep;
    11. } person ;
    12. void bo_sung(person *pdau,person ng,person **pchen,int *vt);
    13. /*  pdau tro toi dau danh sach (gia thiet pdau!=NULL);
    14.     ng la cau truc chua nguoi vua nhap;
    15.     neu vt=0 thi chen vao dau danh sach
    16.     neu vt=1 thi chen vao sau cau truc do pchen tro toi */
    17. void vao_sl(char *ht,person **p);
    18. /* cap phat vung nho cho p
    19.     gan ht cho p->ht
    20.     vao cac so lieu khac nhu que quan va tuoi */
    21. void bo_sung(person *pdau,person ng,person **pchen,int *vt)
    22. {
    23.     person *p=pdau,*p1;
    24.     if (ng.tuoi<p->tuoi)
    25.     {
    26.         *vt=0;
    27.         return;
    28.     }
    29.     else
    30.         while (1)
    31.         {
    32.             p1=p->tiep;
    33.             if ((p1==NULL)||((p1!=NULL)&&(ng.tuoi<p1->tuoi)))
    34.             {
    35.                 *pchen=p;
    36.                 *vt=1;
    37.                 return;
    38.             }
    39.             p=p1;
    40.         }
    41. }
    42. void vao_sl(char *ht,person **p)
    43. {
    44.     int t;
    45.     person *pp;
    46.     pp=(person*)malloc(sizeof(person));
    47.     strcpy(pp->ht,ht);
    48.     printf("\n Que quan: ");
    49.     gets(pp->qq);
    50.     printf("\n Tuoi: ");
    51.     scanf("%d%*c",&t);pp->tuoi=t;
    52.     pp->tiep=NULL;
    53.     *p=pp;
    54. }
    55. void main()
    56. {
    57.     int vt;
    58.     char ht[25];
    59.     person *pdau,*p,*ptg,*pchen;
    60.     system("cls");
    61.     /* Vao mot so nguoi va luu du lieu duoi dang danh sach lien ket */
    62.     pdau=NULL;
    63.     while (1)
    64.     {
    65.         printf("\n Ho ten (enter de ket thuc): ");
    66.         gets(ht);
    67.         if (ht[0]==0) break;
    68.         if (pdau==NULL) vao_sl(ht,&pdau);
    69.         else
    70.         {
    71.             vao_sl(ht,&ptg);
    72.             bo_sung(pdau,*ptg,&pchen,&vt);
    73.             if (vt==0) //chen vao dau danh sach
    74.             {
    75.                 ptg->tiep=pdau;
    76.                 pdau=ptg;
    77.             }
    78.             else //chen vao sau pchen
    79.             {
    80.                 ptg->tiep=pchen->tiep;
    81.                 pchen->tiep=ptg;
    82.             }
    83.         }
    84.     }
    85.     /* dua danh sach lien ket ra man hinh */
    86.     p=pdau;
    87.     while (p!=NULL)
    88.     {
    89.         printf("\n Ho ten %-25s Que %-30s Tuoi %d ",(*p).ht,(*p).qq,(*p).tuoi);
    90.         p=p->tiep;
    91.     }
    92.     printf("\n\n");
    93.     getch();
    94. }
    Mình thắc mắc là ở hai hàm bo_sung va hàm vao_sl có khai báo đối là person **chen và person **p.
    Mình không hiểu hai cái dấu * có ý nghĩa gì nữa. Nhờ các bạn trên diễn đàn giải đáp chi tiết dùm.

  2. #2
    Ngày gia nhập
    10 2014
    Bài viết
    13

    việc bạn truyền person ** tương đương với person &* .
    - Bạn truyền với ý nghĩa là sau lời gọi hàm thì con trỏ *p của bạn sẽ thay đổi.
    - Còn nếu không dslk p của bạn sẽ không thay đổi số phần tử
    Học lập trình bắt đầu từ đâu ?

    www.laptrinhCcanban.com

  3. #3
    Ngày gia nhập
    09 2014
    Nơi ở
    Thành phố Hồ Chí Minh
    Bài viết
    2

    Trích dẫn Nguyên bản được gửi bởi programmer_2014 Xem bài viết
    việc bạn truyền person ** tương đương với person &* .
    - Bạn truyền với ý nghĩa là sau lời gọi hàm thì con trỏ *p của bạn sẽ thay đổi.
    - Còn nếu không dslk p của bạn sẽ không thay đổi số phần tử
    Vẫn chưa hiểu lắm. Bạn có thể giải thích kĩ một chút được không ? Một số câu lệnh trong hàm mình cũng không hiểu, ví dụ như là
    C Code:
    1. *pchen=p ;//trong ham bo_sung
    2. *pp=p ;//trong ham vao_sl

  4. #4
    Ngày gia nhập
    09 2014
    Nơi ở
    Thành phố Hồ Chí Minh
    Bài viết
    2

    Bác nào rành về con trỏ giải đáp dùm mình mấy cái thắc mằc ở trên được không ? Càng chi tiết càng tốt. ^^

  5. #5
    Ngày gia nhập
    10 2014
    Bài viết
    13

    Như vậy trước hết bạn phải hiểu kiến thức về con trỏ :

    Học lập trình bắt đầu từ đâu ?

    www.laptrinhCcanban.com

  6. #6
    Ngày gia nhập
    09 2014
    Nơi ở
    Thành phố Hồ Chí Minh
    Bài viết
    2

    Mặc định Hàm trên cấu trúc và danh sách liên kết

    Trích dẫn Nguyên bản được gửi bởi programmer_2014 Xem bài viết
    Như vậy trước hết bạn phải hiểu kiến thức về con trỏ :

    Những kiến nền tảng này của con trỏ thì mình đã nắm rõ. Còn cái mình hỏi ở trên là liên quan đến con trỏ cấu trúc.
    Cái mà mình thắc mắc là hai cái dấu * trong khai báo đối ở hai cái hàm bo_sung và vao_sl là như thế nào ?
    Tại sao lại khai báo như thế ? Hơn nữa, một số câu lệnh gán trong hàm mình cũng không hiểu nó làm gì nữa ?

  7. #7
    Ngày gia nhập
    10 2014
    Bài viết
    13

    Code:
        *pchen=p ;//trong ham bo_sung
        *pp=p ;//trong ham vao_sl
    *pchen = p; // nghĩa là gán địa chỉ của con trỏ p cho pchen. lúc này pchen sẽ lưu địa chỉ của p (pchen trỏ tới p)
    *pp = p; // cũng tương tự

    Còn việc tại sao phải dùng con trỏ (*) thì do cách làm của mỗi người thôi. Bạn có thể sử dụng toán tử & thay vì dùng (*).

    Đặt tình hướng nếu bạn không truyền con trỏ (*) cho hàm vao_sl(char *ht,person **p) . Thì trong quá trình thực hiện nó sẽ copy p của bạn sang 1 vùng nhớ khác là p', và nó sẽ thao tác trên vùng nhớ p'. Và giá trị của con trỏ p sẽ không đổi sau lời gọi hàm
    Học lập trình bắt đầu từ đâu ?

    www.laptrinhCcanban.com

  8. #8
    Ngày gia nhập
    04 2011
    Nơi ở
    Hà Nội
    Bài viết
    248

    Trích dẫn Nguyên bản được gửi bởi vancanh2095 Xem bài viết
    Những kiến nền tảng này của con trỏ thì mình đã nắm rõ. Còn cái mình hỏi ở trên là liên quan đến con trỏ cấu trúc.
    Cái mà mình thắc mắc là hai cái dấu * trong khai báo đối ở hai cái hàm bo_sung và vao_sl là như thế nào ?
    Tại sao lại khai báo như thế ? Hơn nữa, một số câu lệnh gán trong hàm mình cũng không hiểu nó làm gì nữa ?
    Mình nghĩ bạn vẫn chưa chắc lắm đâu. Đã là con trỏ thì trỏ cấu trúc hay trỏ int hay trỏ void hay trỏ gì gì đấy thì cơ bản cũng như nhau mà thôi

  9. #9
    Ngày gia nhập
    09 2014
    Nơi ở
    Thành phố Hồ Chí Minh
    Bài viết
    2

    Trích dẫn Nguyên bản được gửi bởi greigaz Xem bài viết
    Mình nghĩ bạn vẫn chưa chắc lắm đâu. Đã là con trỏ thì trỏ cấu trúc hay trỏ int hay trỏ void hay trỏ gì gì đấy thì cơ bản cũng như nhau mà thôi
    Con trỏ mà chỉ có một dấu * thôi thì mình hiểu. Còn con trỏ hai dấu * thì vẫn còn mơ hồ, chưa hiểu rõ bản chất của nó như thế nào mà thôi.

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