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

Đề tài: Sử dụng 1 Danh Sách Liên Kết với 2 Struct khác nhau như thế nào?

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

    Mặc định Sử dụng 1 Danh Sách Liên Kết với 2 Struct khác nhau như thế nào?

    mình sử dụng 2 struct (user và book) để biểu diễn thông tin các tài khoản và các sách trong 1 thư viện. Cách bây giờ mình nghĩ là tạo 2 linked list khác nhau, và như vậy mỗi hàm thao tác trên linked list đều phải tạo 2 phiên bản cho 2 loại.

    cụ thể là thế này
    C++ Code:
    1. struct USER
    2. {
    3.  //ID
    4. //Pass
    5. //Name
    6. //...
    7. };
    8.  
    9. struct BOOK
    10. {
    11. //ISBN
    12. //Name
    13. //Price
    14. //....
    15. };
    16.  
    17. struct NodeU //ds cach tai khoang nguoi dung
    18. {
    19.      USER data;
    20.      Node* pNext;
    21. };
    22.  
    23. struct NodeB //ds cac sach trong thu vien
    24. {
    25.      BOOK data;
    26.      Node* pNext;
    27. };
    28.  
    29. //ham cho dslk USER
    30. int ReadFile(char* fname, NodeU* head)
    31. {
    32.      //doc du lieu tu file va luu vao dslk
    33. }
    34.  
    35. int WriteFile(char* fname, NodeU* head)
    36. {
    37.      //ghi du lieu tu dslk xuong file de luu tru
    38. }
    39.  
    40. void InsertAtE(NodeU* head)
    41. {
    42.      //chen 1 node o cuoi ds
    43. }
    44.  
    45. //ham cho dslk BOOK
    46. int ReadFile(char* fname, NodeB* head)
    47. {
    48.      //doc du lieu tu file va luu vao dslk
    49. }
    50.  
    51. int WriteFile(char* fname, NodeB* head)
    52. {
    53.      //ghi du lieu tu dslk xuong file de luu tru
    54. }
    55.  
    56. void InsertAtE(NodeB* head)
    57. {
    58.      //chen 1 node o cuoi ds
    59. }
    60. v.v...

    có cách nào chỉ sử dụng 1 linked list (struct Node) để làm vào các hàm xử lý (thêm, xóa, xuất Node, đọc ghi Danh Sách ra file nhị phân , ...) đều làm việc được trên 2 loại cấu trúc (user và book) mà không cần viết 2 hàm cho mỗi thao tác k?
    Xin cám ơn các bạn !!

  2. #2
    Ngày gia nhập
    01 2011
    Nơi ở
    -Mountain-
    Bài viết
    768

    Bạn có thể tìm hiểu thêm bài này để nghĩ ra hướng giải quyết cho bài của bạn: Lập trình C++ với template

    không thì bạn có thể sử dụng luôn cái này _http://cplusplus.com/search.do?q=list
    Hướng dẫn C++: https://www.youtube.com/watch?v=BwLodoQdoY4&list=PL1c9Uxlo-mplJDRGdONNupgo5OCBTyGGn

  3. #3
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Nếu dùng C: bác tạo Node với kiểu dữ liệu là con trỏ void, gán con trỏ nào vào cũng đc.
    Nếu dùng C++: sử dụng std::list<> trong thư viện chuẩn.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  4. #4
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    không thể được, BOOK và USER chỉ có con trỏ pNext chung thôi, còn phần dữ liệu của nó là không giống nhau cho nên kiểu gì thì kiểu buộc phải viết hai hàm. (đấy là trong C, còn C++ thì bạn dùng template)

  5. #5
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Trích dẫn Nguyên bản được gửi bởi pkthanh92 Xem bài viết
    không thể được, BOOK và USER chỉ có con trỏ pNext chung thôi, còn phần dữ liệu của nó là không giống nhau cho nên kiểu gì thì kiểu buộc phải viết hai hàm. (đấy là trong C, còn C++ thì bạn dùng template)
    Sợ bác luôn, đã bảo là dùng con trỏ rồi mà. :-|
    Ví dụ cho bác một cái double linked list mà tôi code nhé.
    C++ Code:
    1. #if !defined(__dbLinkedList_HEADER_FILE_82DDD139689B8D73C15C6165472A8E14__INCLUDED_)
    2. #define __dbLinkedList_HEADER_FILE_82DDD139689B8D73C15C6165472A8E14__INCLUDED_
    3. #include <stdio.h>
    4. #include <stdlib.h>
    5. #include <memory.h>
    6. #include <malloc.h>
    7.  
    8.     typedef struct _dbLinkedList
    9.     {
    10.         _dbLinkedList(void *Data = NULL,_dbLinkedList *Next = NULL, _dbLinkedList *Prev = NULL)
    11.             :data(Data), next(Next), prev(Prev)
    12.         {
    13.         }
    14.         struct _dbLinkedList *next;
    15.         struct _dbLinkedList *prev;
    16.         void *data;
    17.     }
    18.     dbLinkedList;
    19.     typedef int     (*dbLinkedListFunc2Const)   (const void *, const void *);
    20.     typedef void    (*dbLinkedListFunc2)        (void *, void *);
    21.     typedef void    (*dbLinkedListFunc1)        (void *);
    22.     dbLinkedList*   dbLinkedList_append         (dbLinkedList *list, void *data);
    23.     dbLinkedList*   dbLinkedList_prepend        (dbLinkedList *list, void *data);
    24.     dbLinkedList*   dbLinkedList_remove_link    (dbLinkedList *list, const dbLinkedList *link);
    25.     dbLinkedList*   dbLinkedList_remove         (dbLinkedList *list, void *data, dbLinkedListFunc1  freedata);
    26.     dbLinkedList*   dbLinkedList_insert_sorted  (dbLinkedList *list, void *data, dbLinkedListFunc2Const comp);
    27.     dbLinkedList*   dbLinkedList_copy           (dbLinkedList *list);
    28.     dbLinkedList*   dbLinkedList_concat         (dbLinkedList *list, dbLinkedList *add);
    29.     dbLinkedList*   dbLinkedList_find           (dbLinkedList *list, const void *data);
    30.     dbLinkedList*   dbLinkedList_find_custom    (dbLinkedList *list, const void *data, dbLinkedListFunc2Const comp);
    31.     dbLinkedList*   dbLinkedList_nth            (dbLinkedList *list, int n);
    32.     void            dbLinkedList_foreach        (dbLinkedList *list, dbLinkedListFunc1 fn);
    33.     void            dbLinkedList_foreach        (dbLinkedList *list, dbLinkedListFunc2 fn, void *user_data);
    34.     void            dbLinkedList_free           (dbLinkedList *list, dbLinkedListFunc1 freeFunc);
    35.     void            dbLinkedList_free           (dbLinkedList *list);
    36.     int             dbLinkedList_length         (const dbLinkedList *list);
    37.     bool            dbLinkedList_empty          (const dbLinkedList *list);
    38.     bool            dbLinkedList_singleton      (const dbLinkedList *list);
    39.  
    40.     #define         dbLinkedList_first          (list) list;
    41.     #define         dbLinkedList_next           (list) list->next
    42.     #define         dbLinkedList_prev           (list) list->prev
    43.     dbLinkedList*   dbLinkedList_last           (dbLinkedList *list);
    44. #endif
    C++ Code:
    1. #include "dbLinkedList.h"
    2. /* Thêm phần tử vào cuối danh sách. */
    3. dbLinkedList* dbLinkedList_append(dbLinkedList *list, void *data)
    4. {
    5.     dbLinkedList *n = NULL;
    6.     dbLinkedList *attach_to = NULL;
    7.  
    8.     dbLinkedList *new_list = new dbLinkedList(data);
    9.  
    10.     /* Tìm phần tử cuối dùng của danh sách. */
    11.     for (n = list; n; n = n->next)
    12.         attach_to = n;
    13.  
    14.     /* Tìm được vị trí cuối danh sách. (danh sách không rỗng) */
    15.     if (attach_to)
    16.     {  
    17.         /* Chèn vào cuối. */
    18.         new_list->prev = attach_to;
    19.         attach_to->next = new_list;
    20.         return list;
    21.     }
    22.     else
    23.     {
    24.         /* Danh sách rỗng, phần tử đầu tiên.*/
    25.         new_list->prev = NULL;
    26.         return new_list;
    27.     }
    28. }
    29.  
    30. /* Thêm phần tử vào đầu danh sách. */
    31. dbLinkedList* dbLinkedList_prepend(dbLinkedList *list, void *data)
    32. {
    33.     dbLinkedList *n = new dbLinkedList(data, list);
    34.  
    35.     if (list)
    36.         list->prev = n;
    37.  
    38.     return n;
    39. }
    40.  
    41. /* Nối hai danh sách. */
    42. dbLinkedList* dbLinkedList_concat(dbLinkedList *list, dbLinkedList *add)
    43. {
    44.     dbLinkedList *l = NULL;
    45.    
    46.     if (!list)
    47.         return add;
    48.    
    49.     if (!add)
    50.         return list;
    51.  
    52.     /* Di chuyển đến phần tử cuối danh sách.*/
    53.     for (l = list; l->next; l = l->next);
    54.  
    55.     l->next = add;
    56.     add->prev = l;
    57.  
    58.     return list;
    59. }
    60.  
    61. /* Loại bỏ một phần tử khỏi danh sách. */
    62. dbLinkedList* dbLinkedList_remove(dbLinkedList *list, void *data, dbLinkedListFunc1 freedata)
    63. {
    64.     dbLinkedList *n = NULL;
    65.     for (n = list; n != NULL; n = n->next)
    66.         if (n->data == data)
    67.         {
    68.             list = dbLinkedList_remove_link(list, n);
    69.             freedata(data);
    70.             delete n;
    71.             break;
    72.         }
    73.     return list;
    74. }
    75.  
    76. /* Tháo liên kết phần tử khỏi danh sách. Phần tử trở nên "tự do". */
    77. dbLinkedList* dbLinkedList_remove_link(dbLinkedList *list, const dbLinkedList *link)
    78. {
    79.     if (!link)
    80.         return list;
    81.     if (link->next)
    82.         link->next->prev = link->prev;
    83.  
    84.     if (link->prev)
    85.         link->prev->next = link->next;
    86.  
    87.     if (link == list)
    88.         list = link->next;
    89.     return list;
    90. }
    91.  
    92. /* Chiều dài danh sách. */
    93. int dbLinkedList_length(const dbLinkedList *list)
    94. {
    95.     int iLength(0);
    96.  
    97.     for (const dbLinkedList *n = list; n; n = n->next, ++iLength);
    98.  
    99.     return iLength;
    100. }
    101. /* Kiểm tra danh sách rỗng. */
    102. bool dbLinkedList_empty(const dbLinkedList *list)
    103. {
    104.     return (!list);
    105. }
    106.  
    107. /* Một phần tử duy nhất? */
    108. bool dbLinkedList_singleton(const dbLinkedList *list)
    109. {
    110.     return (list && list->next == NULL);
    111. }
    112.  
    113. /* Sao chép danh sách, không sao chép phần tử !*/
    114. dbLinkedList* dbLinkedList_copy(dbLinkedList *list)
    115. {
    116.     dbLinkedList *copy = NULL;
    117.     for (dbLinkedList *n = list; n; n = n->next)
    118.         copy = dbLinkedList_append(copy, n->data);
    119.     return copy;
    120. }
    121.  
    122. /* Giải phóng danh sách. Gọi hàm giải phóng tuỳ chọn. */
    123. void dbLinkedList_free(dbLinkedList *list, dbLinkedListFunc1 freeFunc)
    124. {
    125.     if (list)
    126.     {
    127.         dbLinkedList *n = list;
    128.         while(n != NULL)
    129.         {
    130.             dbLinkedList *next = n->next;
    131.             freeFunc(n->data);
    132.             delete n;
    133.             n = next;
    134.         }
    135.     }
    136. }
    137.  
    138. /* Giải phóng danh sách. */
    139. void dbLinkedList_free(dbLinkedList *list)
    140. {
    141.     if (list!=NULL)
    142.     {
    143.         dbLinkedList *n = list;
    144.         while(n != NULL)
    145.         {
    146.             dbLinkedList *next = n->next;
    147.             delete n->data;
    148.             delete n;
    149.             n = next;
    150.         }
    151.     }
    152. }
    153.  
    154. /* Tìm phần tử trong danh sách. */
    155. dbLinkedList* dbLinkedList_find(dbLinkedList *list, const void *data)
    156. {
    157.     dbLinkedList *l;
    158.     for (l = list; (l && (l->data != data)); l = l->next) ;
    159.     return l;
    160. }
    161.  
    162. /* Tìm phần tử trong danh sách. Tuỳ chọn kiểu tìm kiếm. */
    163. dbLinkedList* dbLinkedList_find_custom(dbLinkedList *list, const void *data, dbLinkedListFunc2Const comp)
    164. {
    165.     dbLinkedList *l;
    166.     for (l = list; l!=NULL; l = l->next)
    167.         if (comp(l->data, data) != 0)
    168.             return l;
    169.     return NULL;
    170. }
    171.  
    172. /* Duyệt danh sách. */
    173. void dbLinkedList_foreach(dbLinkedList *list, dbLinkedListFunc1 fn)
    174. {
    175.     for (; list; list = list->next)
    176.         fn(list->data);
    177. }
    178.  
    179. /* Duyệt danh sách, kèm theo dữ liệu. */
    180. void dbLinkedList_foreach(dbLinkedList *list, dbLinkedListFunc2 fn, void *user_data)
    181. {
    182.     for (; list; list = list->next)
    183.         fn(list->data, user_data);
    184. }
    185.  
    186. /* Trả về phần tử thứ n.*/
    187. dbLinkedList* dbLinkedList_nth(dbLinkedList *list, int n)
    188. {
    189.     for (; list && n; list = list->next, n--);
    190.     return list;
    191. }
    192.  
    193. /* Chèn có sắp xếp. */
    194. dbLinkedList* dbLinkedList_insert_sorted(dbLinkedList *list, void *data, dbLinkedListFunc2Const comp)
    195. {
    196.     dbLinkedList *l = NULL;
    197.     dbLinkedList *prev = NULL;
    198.    
    199.     if (!list)
    200.         return dbLinkedList_append(list, data);
    201.  
    202.     /* Tìm vị trí chèn. */
    203.     for (l = list; (l && (comp(l->data, data) <= 0)); l = l->next)
    204.         prev = l;
    205.  
    206.     dbLinkedList *n = new dbLinkedList(data);
    207.     if (l)
    208.     {
    209.         n->prev = l->prev;
    210.         l->prev = n;
    211.     }
    212.     else
    213.         n->prev = prev;
    214.  
    215.     n->next = l;
    216.     if (n->prev)
    217.     {
    218.         n->prev->next = n;
    219.         return list;
    220.     }
    221.     else
    222.         return n;
    223. }
    224.  
    225. /* Trả về phần tử cuối cùng. */
    226. dbLinkedList* dbLinkedList_last(dbLinkedList *list)
    227. {
    228.    
    229.     for(; list && list->next; list = list->next);
    230.     return list;
    231. }
    232.  
    233. /*
    234. dbLinkedList* dbLinkedList_next(dbLinkedList *list)
    235. {
    236.     return list->next;
    237. }
    238. dbLinkedList* dbLinkedList_prev(dbLinkedList *list)
    239. {
    240.     return list->prev;
    241. }
    242. */
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  6. #6
    Ngày gia nhập
    11 2011
    Bài viết
    32

    Mặc định Sử dụng 1 Danh Sách Liên Kết với 2 Struct khác nhau như thế nào?

    cám ơn các bạn, thật ra thì mình học cũng chưa nhiều, tìm tren google thì đa số nói về class ( chưa học OOP) nên cũng hơi khó mường tượng.
    @doicanhden: nếu sử dụng con trỏ void thì phải sử dụng double LL hay sao bạn, có thể dùng single LL ko? nếu được bạn có thể demo về sử dụng template thì hay quá?
    mình cũng chưa học về template (mới năm 1), tìm hiểu thì té ra nhiều vấn đề, mà còn phải làm mấy chức năng nữa, sợ dây dưa hoài thì ko kịp. Nên chắc chọn cách cùi bắp nhất ( làm 2 LL), sau có thời gian mới quay lại tìm hiểu sau

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

    Template là nội dung khi bạn học đến Lập trình hướng đối tượng nói chung và các ngôn ngữ như C++ , C# nói riêng
    Mới học ngang phần Ngôn ngữ bậc cao/ C / Cấu trúc dữ liệu thì chưa nên đụng đến
    Um Mani Padme Hum...!!

  8. #8
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Trích dẫn Nguyên bản được gửi bởi 5fox Xem bài viết
    cám ơn các bạn, thật ra thì mình học cũng chưa nhiều, tìm tren google thì đa số nói về class ( chưa học OOP) nên cũng hơi khó mường tượng.
    @doicanhden: nếu sử dụng con trỏ void thì phải sử dụng double LL hay sao bạn, có thể dùng single LL ko? nếu được bạn có thể demo về sử dụng template thì hay quá?
    mình cũng chưa học về template (mới năm 1), tìm hiểu thì té ra nhiều vấn đề, mà còn phải làm mấy chức năng nữa, sợ dây dưa hoài thì ko kịp. Nên chắc chọn cách cùi bắp nhất ( làm 2 LL), sau có thời gian mới quay lại tìm hiểu sau
    Nhìn vào code trên, thấy thằng nào là prev thì delete thẳng tay, nếu nó nằm trọn (không có phần tử next, chỉ có prev) trong hàm thì vĩnh biệt cái hàm đó luôn.

    P/s:@clchicken: "thuốc" nè bác. keke.

    Đùa chút, sửa code trên lại mất công lắm, bạn có thể tham khảo để viết single list, dùng con trỏ void, các hàm.v..v...
    Còn đây là ví dụ về list trong standard template library
    C++ Code:
    1. #include <iostream>
    2. // Hai dòng dưới là bắt buộc khi dùng STL.
    3. #include <list>
    4. using namespace std;
    5.  
    6. int _tmain(int argc, _TCHAR* argv[])
    7. {
    8.     std::string str("Hello world!!!");
    9.     std::cout << str << std::endl;
    10.  
    11. /*  Đây là kiểu danh sách trong STL,
    12.     int là kiểu dữ liệu của phần tử.
    13.     Có thể thay bằng BOOK thay gì gì đó.
    14. */
    15.     list<int> lst;
    16.     for(int i = 1; i < 11; ++i)
    17.     /*  Thêm phần tử vào cuối danh sách.
    18.     */
    19.         lst.push_back(i);
    20.     /*  Các container - bộ chứa dữ liệu trong STL có 1 class đặc biệt là iterator.
    21.         Nó giống hệt con trỏ khi dùng để truy cập mảng, khai báo như sau
    22.         list<int>::iterator
    23.         list<BOOK>::iterator
    24.         list<Kiểu_Dữ_Liệu>::iterator
    25.     */
    26.     for(list<int>::iterator it = lst.begin(); it != lst.end(); ++it) // begin() và end() trả về 2 iterator trỏ vào đầu và cuối danh sách.
    27.         cout << " " << *it; // *it là lấy dữ liệu đc "trỏ" bởi iterator.
    28.  
    29.     std::cin.get();
    30.     return 0;
    31. }
    Đã được chỉnh sửa lần cuối bởi doicanhden : 23-04-2012 lúc 12:22 AM.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  9. #9
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Trích dẫn Nguyên bản được gửi bởi clchicken Xem bài viết
    Template là nội dung khi bạn học đến Lập trình hướng đối tượng nói chung và các ngôn ngữ như C++ , C# nói riêng
    Trong các ngôn ngữ mà mình biết thỉ chỉ có 2 ngôn ngữ có template là C++ và D. C# hay Java có cái gọi là generic type nhưng nó không phải là template.

  10. #10
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    lang D? Cái chi mà nghe lạ rứa? Bác boss14420 nhể?
    Oh It originated as a re-engineering of C++
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

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

  1. Kỹ thuật C++ Cần giúp về danh sách liên kết lồng nhau...
    Gửi bởi Hacker1805 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 29-03-2013, 11:37 PM
  2. sự khác nhau giữa danh sách liên kết và ngăn xếp
    Gửi bởi nvquocbao trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 17-12-2012, 04:00 AM
  3. Lập trình C++ cơ bản về struct, danh sách liên kết đơn và cây nhị phân
    Gửi bởi GMXChaser trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 40
    Bài viết cuối: 28-09-2012, 11:15 PM
  4. 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
  5. Bài tập C++ Nối 2 danh sách liên kết chẵn, lẻ lại với nhau như thế nào?
    Gửi bởi phatngoit trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 16-06-2010, 05:16 PM

Tags của đề tài này

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