Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<fstream>
- #include<string>
- using namespace std;
- struct sinhVien {
- string ten;
- string mssv;
- string lop;
- };
- typedef struct sinhVien SV;
- struct node {
- SV data;
- struct node *pNext;
- };
- typedef struct node NODE;
- struct list {
- NODE *pHead;
- NODE *pTail;
- };
- typedef struct list LIST;
- void createList(LIST &l) {
- l.pHead = l.pTail = NULL;
- }
- NODE *getNode(SV x) {
- NODE *p = new NODE;
- if (p == NULL) {
- return NULL;
- }
- p->data = x;
- p->pNext = NULL;
- return p;
- }
- void AddTail(LIST &l, NODE *p)
- {
- if (l.pHead == NULL)
- {
- l.pHead = l.pTail = p;
- }
- else
- {
- l.pTail->pNext = p;
- l.pTail = p;
- }
- }
- void nhapSinhVien(SV &x, ofstream &FileOut) {
- rewind(stdin);
- cout << "Nhap Ten: ";
- getline(cin, x.ten); // lay du lieu
- FileOut << x.ten; // ghi vao file
- FileOut << endl; // xuong dong trong file
- rewind(stdin);
- cout << "Nhap MSSV: ";
- getline(cin, x.mssv);
- FileOut << x.mssv;
- FileOut << endl;
- rewind(stdin);
- cout << "Nhap Lop: ";
- getline(cin, x.lop);
- FileOut << x.lop;
- FileOut << endl;
- }
- void inPut(LIST &l, int n)
- {
- createList(l);
- ofstream FileOut;
- FileOut.open("Data.txt", ios_base::out);
- FileOut << n << endl;
- for (int i = 1; i <= n; i++)
- {
- cout << "\nNhap thong tin sinh vien thu " << i << ": " << endl;
- SV x;
- nhapSinhVien(x, FileOut);
- NODE *p = getNode(x);
- AddTail(l, p);
- }
- FileOut.close();
- }
- void xuatSinhVien(SV x)
- {
- cout << "Ten: " << x.ten << endl;
- cout << "MSSV: " << x.mssv << endl;
- cout << "Lop: " << x.lop << endl;
- }
- void outPut(LIST l)
- {
- cout << "\n_________XUAT THONG TIN___________\n\n";
- int count = 1;
- for (NODE *p = l.pHead; p != NULL; p = p->pNext)
- {
- cout << "Thong tin sinh vien thu " << count << endl;
- xuatSinhVien(p->data);
- cout << endl;
- count++;
- }
- }
- void nhapSinhVienTuDanhSach(SV &x, ifstream &FileIn)
- {
- FileIn >> x.ten;
- FileIn >> x.mssv;
- FileIn >> x.lop;
- }
- //doc file tu file txt
- void inputDanhSach(LIST &l)
- {
- createList(l);
- ifstream FileIn;
- FileIn.open("Data.txt", ios_base::in);
- int n;
- FileIn >> n;
- for (int i = 1; i <= n; i++)
- {
- SV x;
- nhapSinhVienTuDanhSach(x, FileIn);
- NODE *p = getNode(x);
- AddTail(l, p);
- }
- FileIn.close();
- }
- //tim kiem sinh vien
- void timSinhVien(LIST &l, string mssv)
- {
- for (NODE *p = l.pHead; p != NULL; p = p->pNext)
- {
- SV sv = p->data;
- if (p->data.mssv == mssv)
- {
- xuatSinhVien(sv);
- }
- }
- }
- // them sinh vien
- void addSinhVien(SV addSV, LIST &l)
- {
- cout << "\n________________________\nNhap thong tin sinh vien can them" << endl;
- cout << "Nhap ten: ";
- getline(cin, addSV.ten);
- cout << "Nhap MSSV: ";
- getline(cin, addSV.mssv);
- cout << "Nhap lop: ";
- getline(cin, addSV.lop);
- NODE* add = getNode(addSV);
- AddTail(l, add);
- }
- // ham xoa dau
- void deleteHead(LIST &l)
- {
- // nếu danh sách rỗng
- if (l.pHead == NULL)
- {
- return;
- }
- NODE *p = l.pHead; // node p là node sẽ xóa
- l.pHead = l.pHead->pNext;// cập nhật lại l.pHead là phần tử kế tiếp
- delete p;
- }
- // xóa cuối
- void deleteTail(LIST &l)
- {
- // nếu danh sách rỗng
- if (l.pHead == NULL)
- {
- return;
- }
- // trường hợp danh sách có phần tử
- if (l.pHead->pNext == NULL)
- {
- deleteHead(l);
- return;
- }
- // duyệt từ đầu danh sách đến thằng kế cuối
- for (NODE *k = l.pHead; k != NULL; k = k->pNext)
- {
- // phát hiện thằng kế cuối
- if (k->pNext == l.pTail)
- {
- delete l.pTail; // xóa đi phần tử cuối
- k->pNext = NULL; // cho con trỏ của node kế cuối trỏ đến vùng nhớ null
- l.pTail = k; // cập nhật lại l.pTail
- return;
- }
- }
- }
- //Xóa bất kì
- void deleteAny(LIST &l, string x)
- {
- // nếu danh sách rỗng thì không làm gì hết
- if (l.pHead == NULL)
- {
- return;
- }
- // nếu node cần xóa nằm đầu danh sách
- if (l.pHead->data.mssv == x)
- {
- deleteHead(l);
- return;
- }
- // nếu node cần xóa nằm ở cuối danh sách
- if (l.pTail->data.mssv == x)
- {
- deleteTail(l);
- return;
- }
- NODE *g = new NODE; // node g là node trỏ đến node nằm trước node cần xóa: x
- // duyệt danh sách liên kết đơn để tìm
- for (NODE *k = l.pHead; k != NULL; k = k->pNext)
- {
- // phát hiện phần tử cần xóa
- if (k->data.mssv == x)
- {
- g->pNext = k->pNext; // cập nhật mối liên kết giữa node k với node sau node h
- delete k; // xóa node nằm sau node k
- return;
- }
- g = k; // cho node g trỏ đến node k
- }
- }
- void deleteSinhVien(SV delSV, LIST &l) // ham xoa sinh vien
- {
- cout << "Nhap MSSV can xoa: ";
- getline(cin, delSV.mssv);
- deleteAny(l, delSV.mssv);
- }
- void updateFile(LIST &l, int n)
- {
- ofstream FileOut; // cai nay dat ten gi cung duoc. muc dich ham nay la ghi du lieu vao file
- //FileOut, File <=> cout,cin
- FileOut.open("Data.txt", ios_base::out); // mo phai txt. ios_base::out dinh nghia ghi vao file
- //FileOut << n << endl;
- n = 0;
- for (NODE *p = l.pHead; p != NULL; p = p->pNext)
- {
- n++;
- }
- FileOut << n << endl;
- for (NODE *p = l.pHead; p != NULL; p = p->pNext)
- {
- FileOut << p->data.ten;
- FileOut << endl;
- FileOut << p->data.mssv;
- FileOut << endl;
- FileOut << p->data.lop;
- FileOut << endl;
- }
- FileOut.close(); // dong file khi ghi xong.
- }
- int main()
- {
- int chon;
- string next;
- LIST l;
- int n;
- cout << "Ban can nhap thong tin bao nhieu sinh vien: ";
- cin >> n;
- cout << "\n____________NHAP THONG TIN_________________\n";
- //Nhap vao danh sach lien ket;
- inPut(l, n);
- do
- {
- //system("cls");
- //Ghi vao file txt
- inputDanhSach(l);
- outPut(l); // xuat danh sach
- cout << "_________CAC THAO TAC VOI DANH SACH__________\n\n";
- cout << "\nNhap cac so tuong ung de thao tac voi danh sach" << endl;
- cout << "1.Tim kiem thong tin sinh vien\n2.Them thong tin sinh vien\n3.Xoa thong tin sinh vien" << endl;
- cin >> chon;
- switch (chon)
- {
- case 1:
- {
- string mssv;
- //tim kiem sinh vien bang MSSV
- cout << "Nhap MSSV can tim: ";
- cin.ignore();
- getline(cin, mssv);
- rewind(stdin);
- timSinhVien(l, mssv);
- updateFile(l, n);
- break;
- }
- case 2:
- {
- SV addSV;
- //thêm sinh viên
- cin.ignore();
- addSinhVien(addSV, l);
- outPut(l);
- updateFile(l, n);
- break;
- }
- case 3:
- {
- SV delSV;
- //delete sinh vien
- cin.ignore();
- deleteSinhVien(delSV, l);
- //cap nhat lai file/ khi thay doi gi trong danh sach thi ham update se cap nhat lai
- updateFile(l, n);
- outPut(l);
- updateFile(l, n);
- break;
- }
- default:
- cout << "Khong co thao tac nay";
- break;
- }
- printf("\nTiep tuc cac thao tac <co/khong>? ");
- getline(cin, next);
- } while (next == "co");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement