Advertisement
thinhckhcmus

code ve kt sinh vien (Code Bui Quang Tuyen)

May 9th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.70 KB | None | 0 0
  1. #include<iostream>
  2. #include<fstream>
  3. #include<string>
  4.  
  5. using namespace std;
  6. struct sinhVien {
  7. string ten;
  8. string mssv;
  9. string lop;
  10. };
  11. typedef struct sinhVien SV;
  12. struct node {
  13. SV data;
  14. struct node *pNext;
  15. };
  16. typedef struct node NODE;
  17. struct list {
  18. NODE *pHead;
  19. NODE *pTail;
  20. };
  21. typedef struct list LIST;
  22. void createList(LIST &l) {
  23. l.pHead = l.pTail = NULL;
  24. }
  25. NODE *getNode(SV x) {
  26. NODE *p = new NODE;
  27. if (p == NULL) {
  28. return NULL;
  29. }
  30. p->data = x;
  31. p->pNext = NULL;
  32. return p;
  33. }
  34. void AddTail(LIST &l, NODE *p)
  35. {
  36. if (l.pHead == NULL)
  37. {
  38. l.pHead = l.pTail = p;
  39. }
  40. else
  41. {
  42. l.pTail->pNext = p;
  43. l.pTail = p;
  44. }
  45. }
  46. void nhapSinhVien(SV &x, ofstream &FileOut) {
  47. rewind(stdin);
  48. cout << "Nhap Ten: ";
  49. getline(cin, x.ten); // lay du lieu
  50. FileOut << x.ten; // ghi vao file
  51. FileOut << endl; // xuong dong trong file
  52. rewind(stdin);
  53. cout << "Nhap MSSV: ";
  54. getline(cin, x.mssv);
  55. FileOut << x.mssv;
  56. FileOut << endl;
  57. rewind(stdin);
  58. cout << "Nhap Lop: ";
  59. getline(cin, x.lop);
  60. FileOut << x.lop;
  61. FileOut << endl;
  62. }
  63. void inPut(LIST &l, int n)
  64. {
  65. createList(l);
  66. ofstream FileOut;
  67. FileOut.open("Data.txt", ios_base::out);
  68. FileOut << n << endl;
  69. for (int i = 1; i <= n; i++)
  70. {
  71. cout << "\nNhap thong tin sinh vien thu " << i << ": " << endl;
  72. SV x;
  73. nhapSinhVien(x, FileOut);
  74. NODE *p = getNode(x);
  75. AddTail(l, p);
  76. }
  77. FileOut.close();
  78. }
  79. void xuatSinhVien(SV x)
  80. {
  81. cout << "Ten: " << x.ten << endl;
  82. cout << "MSSV: " << x.mssv << endl;
  83. cout << "Lop: " << x.lop << endl;
  84. }
  85. void outPut(LIST l)
  86. {
  87. cout << "\n_________XUAT THONG TIN___________\n\n";
  88. int count = 1;
  89. for (NODE *p = l.pHead; p != NULL; p = p->pNext)
  90. {
  91. cout << "Thong tin sinh vien thu " << count << endl;
  92. xuatSinhVien(p->data);
  93. cout << endl;
  94. count++;
  95. }
  96. }
  97.  
  98. void nhapSinhVienTuDanhSach(SV &x, ifstream &FileIn)
  99. {
  100. FileIn >> x.ten;
  101. FileIn >> x.mssv;
  102. FileIn >> x.lop;
  103. }
  104. //doc file tu file txt
  105. void inputDanhSach(LIST &l)
  106. {
  107. createList(l);
  108. ifstream FileIn;
  109. FileIn.open("Data.txt", ios_base::in);
  110. int n;
  111. FileIn >> n;
  112. for (int i = 1; i <= n; i++)
  113. {
  114. SV x;
  115. nhapSinhVienTuDanhSach(x, FileIn);
  116. NODE *p = getNode(x);
  117. AddTail(l, p);
  118. }
  119. FileIn.close();
  120. }
  121. //tim kiem sinh vien
  122. void timSinhVien(LIST &l, string mssv)
  123. {
  124. for (NODE *p = l.pHead; p != NULL; p = p->pNext)
  125. {
  126. SV sv = p->data;
  127. if (p->data.mssv == mssv)
  128. {
  129. xuatSinhVien(sv);
  130. }
  131. }
  132. }
  133. // them sinh vien
  134. void addSinhVien(SV addSV, LIST &l)
  135. {
  136. cout << "\n________________________\nNhap thong tin sinh vien can them" << endl;
  137. cout << "Nhap ten: ";
  138. getline(cin, addSV.ten);
  139. cout << "Nhap MSSV: ";
  140. getline(cin, addSV.mssv);
  141. cout << "Nhap lop: ";
  142. getline(cin, addSV.lop);
  143. NODE* add = getNode(addSV);
  144. AddTail(l, add);
  145. }
  146. // ham xoa dau
  147. void deleteHead(LIST &l)
  148. {
  149. // nếu danh sách rỗng
  150. if (l.pHead == NULL)
  151. {
  152. return;
  153. }
  154. NODE *p = l.pHead; // node p là node sẽ xóa
  155. l.pHead = l.pHead->pNext;// cập nhật lại l.pHead là phần tử kế tiếp
  156. delete p;
  157. }
  158.  
  159. // xóa cuối
  160. void deleteTail(LIST &l)
  161. {
  162.  
  163. // nếu danh sách rỗng
  164. if (l.pHead == NULL)
  165. {
  166. return;
  167. }
  168. // trường hợp danh sách có phần tử
  169. if (l.pHead->pNext == NULL)
  170. {
  171. deleteHead(l);
  172. return;
  173. }
  174. // duyệt từ đầu danh sách đến thằng kế cuối
  175. for (NODE *k = l.pHead; k != NULL; k = k->pNext)
  176. {
  177. // phát hiện thằng kế cuối
  178. if (k->pNext == l.pTail)
  179. {
  180. delete l.pTail; // xóa đi phần tử cuối
  181. k->pNext = NULL; // cho con trỏ của node kế cuối trỏ đến vùng nhớ null
  182. l.pTail = k; // cập nhật lại l.pTail
  183. return;
  184. }
  185. }
  186. }
  187. //Xóa bất kì
  188. void deleteAny(LIST &l, string x)
  189. {
  190. // nếu danh sách rỗng thì không làm gì hết
  191. if (l.pHead == NULL)
  192. {
  193. return;
  194. }
  195. // nếu node cần xóa nằm đầu danh sách
  196. if (l.pHead->data.mssv == x)
  197. {
  198. deleteHead(l);
  199. return;
  200. }
  201. // nếu node cần xóa nằm ở cuối danh sách
  202. if (l.pTail->data.mssv == x)
  203. {
  204. deleteTail(l);
  205. return;
  206. }
  207. NODE *g = new NODE; // node g là node trỏ đến node nằm trước node cần xóa: x
  208. // duyệt danh sách liên kết đơn để tìm
  209. for (NODE *k = l.pHead; k != NULL; k = k->pNext)
  210. {
  211. // phát hiện phần tử cần xóa
  212. if (k->data.mssv == x)
  213. {
  214. g->pNext = k->pNext; // cập nhật mối liên kết giữa node k với node sau node h
  215. delete k; // xóa node nằm sau node k
  216. return;
  217. }
  218. g = k; // cho node g trỏ đến node k
  219. }
  220. }
  221. void deleteSinhVien(SV delSV, LIST &l) // ham xoa sinh vien
  222. {
  223. cout << "Nhap MSSV can xoa: ";
  224. getline(cin, delSV.mssv);
  225. deleteAny(l, delSV.mssv);
  226. }
  227. void updateFile(LIST &l, int n)
  228. {
  229. ofstream FileOut; // cai nay dat ten gi cung duoc. muc dich ham nay la ghi du lieu vao file
  230. //FileOut, File <=> cout,cin
  231. FileOut.open("Data.txt", ios_base::out); // mo phai txt. ios_base::out dinh nghia ghi vao file
  232. //FileOut << n << endl;
  233. n = 0;
  234. for (NODE *p = l.pHead; p != NULL; p = p->pNext)
  235. {
  236. n++;
  237. }
  238. FileOut << n << endl;
  239. for (NODE *p = l.pHead; p != NULL; p = p->pNext)
  240. {
  241. FileOut << p->data.ten;
  242. FileOut << endl;
  243. FileOut << p->data.mssv;
  244. FileOut << endl;
  245. FileOut << p->data.lop;
  246. FileOut << endl;
  247. }
  248. FileOut.close(); // dong file khi ghi xong.
  249. }
  250. int main()
  251. {
  252. int chon;
  253. string next;
  254. LIST l;
  255. int n;
  256.  
  257. cout << "Ban can nhap thong tin bao nhieu sinh vien: ";
  258. cin >> n;
  259. cout << "\n____________NHAP THONG TIN_________________\n";
  260. //Nhap vao danh sach lien ket;
  261. inPut(l, n);
  262.  
  263. do
  264. {
  265. //system("cls");
  266.  
  267.  
  268. //Ghi vao file txt
  269. inputDanhSach(l);
  270. outPut(l); // xuat danh sach
  271.  
  272. cout << "_________CAC THAO TAC VOI DANH SACH__________\n\n";
  273. cout << "\nNhap cac so tuong ung de thao tac voi danh sach" << endl;
  274. cout << "1.Tim kiem thong tin sinh vien\n2.Them thong tin sinh vien\n3.Xoa thong tin sinh vien" << endl;
  275.  
  276. cin >> chon;
  277.  
  278. switch (chon)
  279. {
  280. case 1:
  281. {
  282. string mssv;
  283. //tim kiem sinh vien bang MSSV
  284. cout << "Nhap MSSV can tim: ";
  285. cin.ignore();
  286. getline(cin, mssv);
  287. rewind(stdin);
  288. timSinhVien(l, mssv);
  289. updateFile(l, n);
  290. break;
  291. }
  292.  
  293. case 2:
  294. {
  295.  
  296. SV addSV;
  297. //thêm sinh viên
  298. cin.ignore();
  299. addSinhVien(addSV, l);
  300. outPut(l);
  301. updateFile(l, n);
  302. break;
  303.  
  304. }
  305. case 3:
  306. {
  307. SV delSV;
  308. //delete sinh vien
  309. cin.ignore();
  310. deleteSinhVien(delSV, l);
  311. //cap nhat lai file/ khi thay doi gi trong danh sach thi ham update se cap nhat lai
  312. updateFile(l, n);
  313. outPut(l);
  314. updateFile(l, n);
  315. break;
  316. }
  317. default:
  318. cout << "Khong co thao tac nay";
  319. break;
  320. }
  321. printf("\nTiep tuc cac thao tac <co/khong>? ");
  322. getline(cin, next);
  323. } while (next == "co");
  324. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement