Viết code dùng linked list quản lý đoàn tàu

Các anh các chị giúp em với ạ.
Có 1 đoàn tàu với n toa tàu. Đoàn tàu có thể đc chia thành a list và mỗi toa có a node trong list này. Viết chương trình thỏa mãn các điều kiện sau:

  • Mỗi toa tàu có 1 số lượng hành khách (kiểu int) và có tên (kiểu char). Cả 2 biến đều đc nhập từ bàn phím.
  • Nếu có toa nào không có hành khách thì toa đó nên được loại bỏ khỏi đoàn tàu.
  • Có thể thêm toa mới vào tàu.
  • 1 function có thể hiển thị thông tin của tất cả toa tàu hoặc độ dài của tàu.

Viết 1 chương trình trong C/C++ dùng Linked List để quản lý đoàn tàu.

Bạn đang gặp vấn đề gì?

  • Chưa hiểu đề?
  • Chưa tạo được LinkedList?
  • Chưa biết tạo cấu trúc cho từng toa tàu?
  • Chưa biết cách quản lý (thêm/bỏ) toa tàu?
1 Like


Em làm đc đến đây r, nhưng mà em cứ bị ko bt là mình phải tạo node là toa tàu hay node là hành khách :<
Xong cả phần function cho đoạn xóa toa tàu nữa ạ.
Còn phần array cho tên hành khách, ban đầu em để là A[m] mà xong em nhập tên mà có dấu cách là nó tự động gán vào người thứ 2 thứ 3 luôn. Emđổi thành A[m][100] mà cũng không ổn lắm.
Với cả trong ảnh em cho chạy thử thì cho số toa là 3 mà code chạy mỗi có 1 toa, em đang ko bt đoạn for kia em sai đâu nữa :< em tham khảo mạng với cả tự ngồi làm mà kiểu tù mù quá :<
Anh xem giúp em vs ạ. Em cảm ơn ạ :<

Cấu trúc;

  • Danh sánh liên kết là 1 đoàn tàu.
  • Mỗi nút (node) là 1 toa.
  • Bên trong toa có 2 dữ liệu (data):
    • Số lượng người (int).
    • Tên từng người mảng chuỗi (string[]).

Còn việc nhập có dấu cách nó chỉ nhận 1 từ vì bạn dùng sai cách nhập. Việc dùng cin >> s chỉ cho từng từ. Muốn lấy nguyên 1 dòng thì dùng hàm getline(s). Mỗi hàm có 1 mục đích riêng chứ.

3 Likes

À dạ, em hiểu r ạ.
Còn đoạn dùng for để tạo node cho từng toa thì em đặt createnode ở đấy đúng chưa ạ :v
Dưới đấy có vòng lặp để nhập số lượng người trên toa nhưng mà em cho chạy thì nó chạy mỗi 1 lần :v anh xem giúp em vs ạ.

Cách viết tiếng Việt của bạn nếu dùng trong việc chat chit với bạn bè của bạn thì không thành vấn đề
Nhưng khi mang đang đặt câu hỏi trên tinh thần nhờ giúp đỡ thì khác, viết như vậy thì nói thật là mình không có cảm tình, cũng chẳng muốn đọc nội dung câu hỏi nữa. Miễn cưỡng có thể chấp nhận những từ phổ biến như ko, dc, e ..., còn những từ khác thì đọc vào khá khó chịu

dùng cin để nhập chuỗi có khoảng trắng thì nó tự nhập luôn những biến sau đó, cái này ngẫm một hồi có thể đoán mò được là cin này có khoảng trắng nó tính là biến kế tiếp, nghĩ kĩ lại xem bạn đã nhập được chuỗi có khoảng trắng bằng cin chưa
=> cần tìm giải pháp thay thế cin
mà nhập thì cũng chỉ có vài hàm, thử không được cái này thì cái khác
=> không phải cái gì bị lần đầu cũng đều phải đi nhờ vả (mặc dù câu hỏi này cũng phù hợp để hỏi, nhưng nên dành thêm tí thời gian trước khi hỏi sẽ đẹp hơn)

một lỗi khác cũng phổ biến, trong c++ (và nhiều ngôn ngữ khác) thì array start at 0
bạn khai báo A[m], thì có nghĩa là index sẽ từ 0 đến m-1, không hiểu sao bạn có thể chạy được đoạn code trên mà không gặp lỗi (hoặc cũng có thể là bạn chạy chưa tới)

4 Likes

Chà, nếu theo đúng yêu cầu thì mỗi toa là 1 list và mỗi người trong 1 toa là 1 node.
Ủa, vậy đoàn tàu là 1 mảng tĩnh?
Tạo sao lại a list và a node luôn vậy? Số người trên mỗi toa bằng với số toa à?
Bạn có ghi đúng đề chưa vậy? Đoạn này chưa ổn.

1 Like

Em xin lỗi ạ. Em sẽ rút kinh nghiệm và sửa đổi trong cách dùng từ ạ.

Dạ, a list với a note thì a ở đây là kí hiệu cho ẩn ạ. Kiểu như n list với n note ạ.
Đề thì bằng tiếng anh nên em cố dịch lại để để mọi người dễ hiểu ạ.

trước đây cái thời yahoo mình cũng viết như thế thôi, nhưng nếu là nhắn với giáo viên hay người lớn thì mình vẫn viết tiếng Việt nghiêm túc, mà sau này khi phải đi làm thì cũng sửa, hầu như không còn dùng teencode nữa, kể cả với bạn bè
cái này cũng không có gì phải xin lỗi, vì bạn cũng không bắt ai phải đọc, chỉ là tí góp ý thôi, việc dùng teencode sẽ không có gì sai trái nếu như đúng người đúng hoàn cảnh

2 Likes

Untitled
Đề trước khi dịch đây ạ.

À không, em hiểu nhầm ý đề ạ. Tàu là 1 list và mỗi toa là 1 node ạ.

Trông đề thì toàn là các phép tính toán cơ bả về linklist
Bạn nên làm từng bước và showcode đầy đủ,
hoặc lười (không phải chê, mà là lười kiểu này cùng hợp lý) thì cũng có thể copy một sample chạy được (có thêm, xóa, in)
Sau đó sửa define của node, sửa luôn chỗ in, thêm if/else là xong rồi, sample cho mấy cái này đâu có thiếu
hoặc bạn nên copy code lên với format rõ ràng, mọi người có thể chỉ ra chỗ thiếu sót hoặc cũng có thể sửa luôn cả cách tư duy viết code cho bạn

3 Likes

Dạ, đúng là hoàn toàn em có thể copy code xong rồi sửa lại. Nhưng mà lúc em đi học, thầy bảo có thể tham khảo code trên mạng nhưng không được copy, thầy phát hiện thì trừ 1/2 tổng điểm.
Với cả lúc dạy, thầy chỉ dạy cơ bản như cách khai báo list, tạo node :’<. Chứ phần thêm, xóa với in thì thầy chỉ bật slide lên xong đọc lại slide qua loa chứ không quan tâm sinh viên mấy ạ.
Em tự học trên các web và youtube. Đến hôm nay em mới biết đến web này nên em lên hỏi mọi người để hiểu rõ hơn ạ.

nope, bạn nghĩ sai rồi
với những bài như này, thì trên mạng chắc không có bài đi thẳng vào đề của bạn đâu
ở đây nói copy sample là copy những cái gì đó tương đồng, sau đó về bạn sửa lại
thỉnh thoảng gặp bug không giải quyết được, mình hay copy một project hello world rồi move code từ từ qua cái project mới đó, cho tới khi project mới nó không chạy được (à, thì ra bug ngay chỗ vừa mới copy)
còn chuyện bạn copy trừ khi bạn để y nguyên mọi thứ (nếu ở đâu đó cũng có người làm đề bài giống bạn) thì mới là copy thôi, còn những cái ví dụ cơ bản thì sao mà gọi là copy được

Ví dụ, với google linklist sample bạn có thể dễ dàng tìm ra được link này


copy bài code chạy được như ở trên về, rồi sửa lại Node cho giống với đề, sửa hàm in, thêm if/else vào để xóa là xong

3 Likes

bổ sung ví dụ

struct Node {
    int data;
    struct Node* next;
};

sửa lại thành

struct CarNode {
    int passengers;
    char name;
    struct Node* next;
};

chỗ in

void printList(struct Node* n)
{
    while (n != NULL) {
        printf(" %d ", n->data);
        n = n->next;
    }
}

sửa lại thành

void printList(struct CarNode* n)
{
    while (n != NULL) {
        printf("toa %c %d ", n->name, n->data);
        n = n->next;
    }
}

ví dụ kêu bạn viết hàm tỉnh tổng hai số a và b

int tong(int a, int b) { 
    return a + b;
}

ai viết thì cũng sẽ viết như trên thôi, không lẽ người khác viết như vậy rồi thì mình viết như vậy cũng coi như là copy
không lẽ phải thêm 1 dòng int s = a + ; return s; mới không gọi là copy

3 Likes

À dạ ^^ em rồi ạ.
Em cảm ơn anh nhiều ạ ^^

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?