Mình mới học CTDL và GT, phần linked list. Mình có viết một đoạn chương trình để nhập vào một danh sách sinh viên từ một file text, cụ thể file text của mình tên là 1.txt, gồm MSSV, họ, tên, năm sinh và nguyên quán. File có nội dung như sau:
2410249 Nguyen Canh 1986 Lam_Dong
2410271 Hoang Dat 1985 Khanh_Hoa
2410272 Nguyen Dat 1986 Ninh_Thuan
2410263 Khen Di 1984 Lam_Dong
2410258 Kieu Duyen 1986 Binh_Thuan
2413022 To Duyen 1985 Lam_Dong
2413031 Do Van Huong 1985 Binh_Dinh
2410295 Nguyen Huy 1986 Quang_Ngai
2410302 Nguyen Khanh 1984 Da_Nang
2413041 Vo Kiet 1983 Binh_Thuan
2410316 Lam Le 1986 Lam_Dong
2410312 K Luyt 1986 Lam_Dong
2413047 Nguyen Mai 1985 Ninh_Thuan
2410327 Dang Nga 1986 Binh_Thuan
2410336 Nguyen Ngan 1985 Binh_Thuan
2410349 Vo Phong 1986 Binh_Dinh
2410387 Vo Tam 1984 Quang_Ngai
2410401 Nguyen Thao 1985 Binh_Thuan
2410415 Mong Vu 1986 Lam_Dong
2410420 Luu Y 1986 Da_Nang
Còn đây là Code của mình :
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
// ========================================================
// ========== Phần Code tạo, nhập và xuất DS sinh viên =============
// Khai báo
struct LLSV
{
char maSV[8];
char ho[10];
char ten[10];
int namSinh;
char nguyenQuan[20];
};
struct tagNodeLL
{
LLSV info;
tagNodeLL *pNext;
};
typedef struct tagNodeLL NODE_LL;
struct DanhSachLyLich
{
NODE_LL *pHead;
NODE_LL *pTail;
};
typedef struct DanhSachLyLich _LL;
void CreateList_LL(_LL &l) // Khởi tạo danh sách trống mới
{
l.pHead = l.pTail = NULL;
}
NODE_LL *GetNode_LL(LLSV x) // Tạo một Node mới có nội dung info là một lý lịch của 1 sinh viên.
{
NODE_LL *p = new NODE_LL;
if (p != NULL)
{
p->info = x;
p->pNext = NULL;
}
return p;
}
void InsertTail(_LL &l, LLSV x) //Chèn lý lịch của 1 sinh viên vào cuối danh sách liên kết
{
NODE_LL *p = GetNode_LL(x);
if (p == NULL)
{
cout << "\nKhong du bo nho!";
system("pause");
return;
}
if (l.pHead == NULL)
{
l.pHead = l.pTail = p;
}
else
{
l.pTail->pNext = p;
l.pTail = p;
}
}
int KhoiTao_TapTin_LL(char *filename, _LL &l) //Khởi tạo ra 1 danh sách trống rồi nhập nội dung từ file "1.txt"
vào danh sách.
{
CreateList_LL(l); // Tạo danh sách trống
ifstream in(filename); //Dùng thư viện fstream chép nội dung từ file "1.txt" vào in
if (!in) return 0; // Thất bại
LLSV x;
char maSV[8];
char ho[10];
char ten[10];
int namSinh;
char nguyenQuan[20];
// Chép nội dung trong in vào biến maSV rồi chép từ biến maSV vào biến maSV trong struct LLSV x (Lý lịch của 1 sinh viên), tương tự với các biến còn lại.
in >> maSV; strcpy_s(x.maSV, maSV);
in >> ho; strcpy_s(x.ho, ho);
in >> ten; strcpy_s(x.ten, ten);
in >> namSinh; x.namSinh = namSinh;
in >> nguyenQuan; strcpy_s(x.nguyenQuan, nguyenQuan);
InsertTail(l, x); // Sau đó chèn LLSV x này vào cuối danh sách hiện hành
while (!in.eof()) // Khi nào file "1.txt" vẫn còn dữ liệu thì vẫn tiếp tục lặp lại
{
in >> maSV; strcpy_s(x.maSV, maSV);
in >> ho; strcpy_s(x.ho, ho);
in >> ten; strcpy_s(x.ten, ten);
in >> namSinh; x.namSinh = namSinh;
in >> nguyenQuan; strcpy_s(x.nguyenQuan, nguyenQuan);
InsertTail(l, x);
}
in.close();
return 1; // Thành công
}
void DuyetDSLL(_LL l) // Duyệt xem có bao nhiêu sinh viên trong danh sách
{
int _dem = 0;
NODE_LL *p = new NODE_LL;
p = l.pHead;
for (; p != NULL; p = p->pNext) _dem++;
cout << "\nDanh sach hien tai co [[ " << _dem << " ]] sinh vien.";
}
// ============================================================
// ===================== Hàm chạy chương trình ====================
int main()
{
_LL l;
char _filename[100];
cin >> _filename;
int kq = KhoiTao_TapTin_LL(_filename, l);
if (!kq) cout << "\n||-->[FAIL]<--||";
else cout << "\n||-->[SUCEED]<--||";
DuyetDSLL(l);
system("pause");
return 1;
}
// =======================================================
Sau khi chạy chương trình nhập vào tên file “1.txt” thì màn hình đứng đơ mà không xuất hiện gì.
Mọi người giúp mình được không, minh nghĩ là do code trong hàm KhoiTao_TapTin_LL lỗi, nhưng không nghĩ ra được là lỗi ở đâu.
Đây là ScreenShot lúc mình chạy chương trình:
Mình xin cảm ơn trước!

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