Danh sách liên kết là một kết cấu dữ liệu đặc biệt trong lập trình, bạn sẽ được học kiến thức và kỹ năng này tại môn học Kỹ thuật xây dựng hoặc kết cấu dữ liệu & giải thuật. Bài viết này mình vẫn giới thiệu chúng ta lý thuyết về danh sách link đơn bằng ngữ điệu lập trình C với C++.

Bạn đang xem: Bài tập danh sách liên kết đơn sinh viên

NỘI DUNG :

Danh sách link đơn và kết cấu nodeĐộ phức hợp của các thao tác với DSLK đơnVideo tutorial

image

1. Danh sách links đơn và cấu tạo tự trỏ

Danh sách link đơn - Singly linked list là một kết cấu dữ liệu, nó tương tự như như một mảng cồn với đầy đủ tính chất quan trọng đặc biệt như sau :

Mở rộng với thu thanh mảnh một biện pháp linh hoạt
Các bộ phận trong DSLK điện thoại tư vấn là node cùng được cấp phép động khi cần
Số lượng bộ phận trong DSLK phụ thuộc vào vào bộ nhớ lưu trữ heap
Dễ dàng chèn với xóa phần tử
Các phần tử trong DSLK không tồn tại thứ tự
Truy cập thành phần trong DSLK cần truy cập tuần tự ko thể truy vấn qua chỉ số
Mỗi node vào DSLK cần có thêm 1 con trỏ để lưu liên kết

Mỗi thành phần trong DSLK được gọi là 1 trong những node tuyệt nút, node vẫn lưu tin tức dữ liệu (ví dụ như một trong những nguyên, 1 chuỗi cam kết tự, 1 sinh viên...) và hình như cần có phần liên kết, phần link này giúp những node có thể liên lạc với nhau. Mỗi node sẽ lưu thêm địa chỉ cửa hàng của node phía đằng sau nó trong DSLK thông qua 1 thuộc tính con trỏ.

Node ở đầu cuối trong danh sách link thì phần liên kết của nó sẽ lưu bé trỏ NULL

image

Để xuất bản một node mang lại DSLK chúng ta cũng có thể dùng struct hoặc class, mỗi khi chúng ta cần tạo ra một node bắt đầu trong DSLK thì chúng ta cần cấp phát động, vào C bạn áp dụng malloc còn trong C++ bạn áp dụng toán tử new. Nếu như khách hàng chưa thành thục và nhỏ trỏ và cấp phép động thì bạn hãy tham khảo kiến thức đó trước khi tham gia học bài này.

Xem thêm: Căng Sức Hỗ Trợ Tân Sinh Viên Nhập Học, Nhộn Nhịp Đón Tân Sinh Viên Nhập Học

Một node trong DSLK đối kháng gồm 2 phần :

Dữ liệu của node lưu thông tin của một node, hoàn toàn có thể là kiểu tài liệu như số, chuỗi, sinh viên, ...Phần liên kết - Đây là một trong những con trỏ nhằm lưu địa chỉ cửa hàng của node sau đó nó trong DSLK, thường khắc tên là next

Cấu trúc node trong DSLK đối kháng : ngôn từ C

#include "stdio.h"#include "string.h"struct node int data; // hoàn toàn có thể thay thành kiểu tài liệu khác node *next;;typedef struct node node;int main() node *head = (node*)malloc(sizeof(node)); head->data = 100; head->next = NULL; printf("Gia tri cua head : %d ", head); printf("Du lieu node ma head quan liêu ly : %d", head->data);Output :

Gia tri cua head : 13767920Du lieu node ma head quan ly : 100

Cấu trúc node trong DSLK solo : ngôn ngữ C++

#include "iostream"#include "string.h"using namespace std;struct node int data; // rất có thể thay thành kiểu tài liệu khác node *next;;int main() node *head = new node; head->data = 100; head->next = NULL; cout "Gia tri cua head : " head endl; cout "Du lieu node ma head quan liêu ly : " head->data endl;Output :

Gia tri cua head : 0x1f14f0Du lieu node ma head quan liêu ly : 100

Chú ý :

Mỗi node trong DSLK được cấp phát động
Mỗi node trong DSLK thực chất là một con trỏ, nó là showroom một ô nhớ nhưng mà ô nhớ này được sử dụng để lưu trữ thông tin về một node.Sử dụng toán tử -> khi chúng ta cần truy cập vào data với next của một node trong DSLK thông qua con trỏ quản lý node đó
DSLK thực ra là 1 danh sách quản lý các nhỏ trỏ giao diện node

2.Độ phức hợp của các làm việc với DSLK đơn

DSLK đơn rất tiện lợi trong bài toán xóa hoặc chèn phần tử tuy nhiên khi bạn truy cập các bộ phận trong DSLK bắt buộc các bạn phải chú ý tuần tự, vày DSLK đơn không hỗ trợ chỉ số như mảng.

DSLK đối kháng được làm chủ bởi node đầu tiên trong DSLK hay được lấy tên là node head.

Độ phức tạp của các làm việc trong DSLK 1-1 được tổng hòa hợp trong bảng sau :

Thao tácĐộ phức tạp
Truy xuất phần tửO(N)
Chèn/Xóa node sống đầuO(1)
Chèn/Xóa node sống cuốiO(N)
Chèn/Xóa node làm việc giữaO(N)

technology thông tin là trong số những ngành cách tân và phát triển vượt bậc giữa những năm ngay sát đây. Ngày nay với sự phân phát triển hối hả của làng hội thì công nghệ thông tin được ứng dụng rộng rãi ở phần nhiều tất cả các nghành và ngày càng đóng vai trò quan lại trọng, trở thành một trong những phần thiết yếu ớt trong đời sống hằng ngày. Technology thông tin là 1 trong những ngành yên cầu ở bạn học một căn nguyên kiến thức vững chắc, sự tứ duy lô ghích cao, hiểu biết sâu rộng lớn trên các lĩnh vực. Với chúng em hiện giờ đang là đầy đủ sinh viên technology thông tin cần được có sự đầu tư, không kết thúc học hỏi để nâng cao kiến thức. Cho nên để củng thay lại kỹ năng và kiến thức đã học, đề tài mà em lựa chọn để thực hiện đồ án là: bài toán thống trị sinh viên bằng danh sách link đơn.


*
45 trang | phân chia sẻ: lvbuiluyen | Lượt xem: 14567 | Lượt tải: 3
*

Bạn đang xem trước trăng tròn trang tư liệu Đề tài làm chủ sinh viên bởi danh sách links đơn, giúp thấy tài liệu hoàn hảo bạn click vào nút download ở trên
c
Phần Mở đầu1. Vì sao chọn đề tài:Công nghệ thông tin là trong những ngành cải cách và phát triển vượt bậc một trong những năm sát đây. Ngày nay với sự phạt triển nhanh chóng của xóm hội thì công nghệ thông tin được ứng dụng rộng rãi ở phần nhiều tất cả các lĩnh vực và ngày càng đóng vai trò quan liêu trọng, trở thành một trong những phần thiết yếu hèn trong cuộc sống hằng ngày. Technology thông tin là 1 ngành đòi hỏi ở tín đồ học một nền tảng gốc rễ kiến thức vững chắc, sự tư duy xúc tích và ngắn gọn cao, đọc biết sâu rộng trên những lĩnh vực. Với chúng em hiện nay đang là số đông sinh viên công nghệ thông tin rất cần phải có sự đầu tư, không kết thúc học hỏi để nâng cao kiến thức. Vì vậy để củng núm lại kỹ năng và kiến thức đã học, đề tài mà em lựa chọn để thực hiện đồ án là: bài xích toán quản lý sinh viên bằng danh sách liên kết đơn..2. Mục tiêu của đề tài.Củng cầm lại kiến thức đã học về danh sách liên kết nói chung và danh sách links đơn nói riêng.Rèn luyện kỹ năng lập trình trên ngôn từ C++.Ứng dụng triết lý đã học xử lý bài toán vận dụng cụ thể3. Phạm vi nghiên cứu.Lý thuyết về danh sách links đơn
Bài toán làm chủ sinh viên4. Phương thức nghiên cứu.Nghiên cứu vãn tài liệu cấu tạo dữ liệu và giải mã trên sách.Tìm tìm và nghiên cứu và phân tích trên mạng Internet. CHƯƠNG 1: CƠ SỞ LÝTHUYẾT1. Tổng quan liêu về danh sách liên kết1.1. Định nghĩa
Danh sách link là danh sách mà các phần tử ( Node) links với nhau dựa vào vùng link của chúng. Từng node bao hàm 2 phần: Phần Data dùng để chứa dữ liệu cần xử trí và phần liên kết dùng để liên kết tới các node khác.1.2 .Phân loại.Tùy cách link giữa những phần tử, danh sách link gồm có không ít loại khác nhau:Danh sách liên kết đơn: mỗi bộ phận liên kết với phần tử đứng sau nó trong danh sách.Danh sách link đôi/kép: mỗi thành phần liên kết cùng với các bộ phận đứng trước cùng sau nó vào danh sách.Danh sách link vòng: bộ phận cuối danh sách links với phần tử đầu danh sách.1.3. Danh sách link đơn.1.3.1. Khái niệm.Danh sách links đơn là một kết cấu lưu trữ trong đó các bộ phận của danh sách không cố định, các thành phần trong list không thể truy vấn trực tiếp. ước ao truy cập bất kỳ phần tử nào đó trong list phải khởi thủy từ phần tử đầu tiên. Mỗi Node trong danh sách rất có thể được biểu diễn như sau.Data Next
Trong đó:Data: trường chưa nội dung thông tin của phần tử
Next: chứa địa chỉ của Node tiếp theo sau hay còn gọi là vùng liên kết.Cú pháp:Stuct Node Kiểu_dữ_liệu Data;Node*next; Có thể hình dung danh sách liên kết đơn qua hình vẽ sau:Hình 1.1: Danh sách liên kết đơn1.3.2.Thao tác trên 1 node.Khai báo biến con trỏ p. Là biến con trỏ đẳng cấp Node: Node *p.Cấp phát bộ nhớ cho Node new – được trỏ vày p: p=new Node.Truy cập vào trường info: p->info.Truy cập vào trường next : p->next.Hủy Node được trỏ vì chưng p: delete (p).1.3.3. Các thao tác làm việc trên danh sách links đơn
Thao tác trên danh sách liên kết khác với thao tác làm việc trên mảng, khi đề xuất thêm Node vào danh sách liên kết thì ta xin cung cấp phát bộ nhớ lưu trữ cho Node với nối Node đó vào list và khi không sử dụng thì ta giải tỏa nó khỏi danh sách. Truy cập trên danh sách cũng khác so với trên mảng. Nếu ở mảng ta truy cập trực tiếp thông qua chỉ số mảng (thông qua add ô nhớ) thì sinh hoạt danh sách liên kết ta phải truy cập một cách tuần tự. Khi làm việc trên danh sách liên kết đơn cũng như như vậy nên ta cần chăm chú những điểm sau:Danh sách luôn có con trỏ đầu danh sách: nhỏ trỏ LDanh sách luôn có quý giá báo hoàn thành danh sách: NULL.Trường next của mỗi Node chỉ chứa add của Node sau nó, trừ Node cuối.Trường next của Node ở đầu cuối chứa quý hiếm NULL.Không bóc danh sách thành 2 list con nếu list phần sau chưa có con trỏ tới.Khởi tạo list rỗng: L = NULL1.3.3.1. Phê chuẩn danh sách links đơn
Duyệt theo thứ tự qua từng Node của danh sách.Mục_đích(Node *L) Node *p=L; //cho bé trỏ p trỏ vào đầu list L.while(!điều kiện dừng) info>;//xuất thông tin ra màn hình, triển khai các phép toán… p= p->Next; //cho con trỏ p. Trỏ cho tới Node kế tiếp. 1.3.3.2. Chèn 1 phần tử vào danh sách
Để chèn một phần tử X vào list ta cấp cho phát bộ nhớ cho 1 Node mới được trỏ vì chưng q với gán cực hiếm X mang lại trường info
Node *q;q=new Node;q->info=X;Chèn một Node mới vào list có 4 ngôi trường hợp:Trường hòa hợp 1: Chèn Node được trỏ vì chưng q vào đầu sách
Bước 1: đến vùng links của q chứa add Node đầu danh sách.q->next=L;(1)Bước 2: mang lại L trỏ cho tới q : cập nhập lại nhỏ trỏ đầu danh sách.L = q; (2)Hình 1.2: ….Trường thích hợp 2: Chèn Node được trỏ bởi q vào sau cùng Node trỏ bởi p. Trong danh sách
Bước 1: đến vùng liên kết của Node được trỏ bởi vì q chứa add Node tức thì sau Node được trỏ vì chưng p.q->next=p->next; (1)Bước 2: mang lại vùng link của Node được trỏ vì q chứa showroom của Node được trỏ bởi vì p.p->next=q; (2)Hình 1.3: …Trường hòa hợp 3: Chèn Node được trỏ vì chưng q vào thời điểm cuối danh sách
Bước 1: Nếu danh sách rỗng thì danh sách bây giờ có một phần tử đó là q vừa mới chèn vào, return.Bước 2: ngược lại nếu list không rỗng
Cho bé trỏ p. Chứa địa chỉ cửa hàng Node đầu danh sách: Node *p=L;Duyệt list từ đầu tính đến Node cuối cùngwhile(p->next!=NULL) p=p->next;Cho phần link của Node được trỏ bởi p. Chứa showroom của q p->next=q;Cập nhập lại Node cuối cùng hiện nay chính là Node q vừa new tạo ra.q->next=NULL;Trường hòa hợp 4: Chèn Node được trỏ bởi vì q vào trước Node được trỏ vị p
Bước 1: Nếu phường trỏ đầu danh sách, triển khai chèn đầu danh sách(trường hợp1), return.Bước 2: ngược lại cho nhỏ trỏ t chứa địa chỉ cửa hàng Node trước Node được trỏ bởi p. Trong danh sách: Node *t; t->next=p;Chèn Node được trỏ vì q vào sau cùng Node được trỏ vày t (trường hòa hợp 2).1.3.3.3. Xóa một phần tử ra khỏi danh sách: gồm 2 trường hòa hợp xảy ra
Trường hợp 1: thực hiện xóa đầu danh sách nếu p chứa add Node đầudanh sách (L)Bước 1: Cho con trỏ đầu danh sách L trỏ vào Node sau nó.L=L->next; (1)Bước 2: giải hòa Node p ra ngoài danh sách.Delete(p);Hình 1.4: …Trường hợp 2: nhỏ trỏ phường chứa showroom Node bất kỳ nhưng không hẳn Node đầu
Bước 1: Cho bé trỏ q trỏ đầu list L , sử dụng vòng lặp mang đến nó trỏ tới showroom Node trước Node được trỏ bởi p trong danh sách.q=L; while(q->next!=p) q=q->next; (1)Bước 2: Gán showroom của Node ngay sau Node được trỏ bởi p. Vào ô nhớ next của Node được trỏ vì chưng qq->Next=p->next; (2)Bước 3: giải hòa Node được trỏ vì chưng pdelete(p);(3)Hình 1.5: …1.3.4.4. Search kiếm phần tử trong danh sách
Bước 1: Cho phường trỏ vào đầu list L với khởi tạo vươn lên là found=0Node *p=L; int found=0;Bước 2: triển khai vòng lặp nhằm duyệt p chạy từ trên đầu danh sách tới cuối danh sách, tại mỗi Node giả dụ trường info của Node được trỏ bởi phường =X thì mang lại found=1 để dừng lại vòng lặp. Trái lại nếup!=X thì cho p. Trỏ tới địa điểm Node tức thì sau Node được trỏ vì chưng p.while(p!=NULL&&found= =0)if(p->info=X) found=1;else p=p->next; (*)Bước 3: Return p
Hình 1.6: ....1.3.3.5. Đảo các phần tử trong danh sách
Bước 1: Khởi chế tạo ra 3 biến bé trỏ p, t, q. Trong số đó p trỏ vào đầu list L, t= NULL (không trỏ vào địa chỉ nào cả), q trỏ vào add Node được trỏ vì chưng p.Node *p=L,*t=NULL,*q=p ;Bước 2: sử dụng vòng lặp duyệt p chạy từ trên đầu tới cuối danh sách. Trong khi triển khai vòng lặp
Cho vùng links của Node được trỏ bởi vì q chứa add của tq->next=t;Cho t trỏ mang đến vị trí Node được trỏ bởi q (cập nhập lại t). T=q;Cụ thể như sau:While(p!=NULL) q=p; p=p->next; (1)q->next=t ; (2)t=q; (3) B ước 3 :Cho L trỏ đến vị trí Node được trỏ vì chưng t (cập nhập lại L)L=t
Hình 1.7: ...CHƯƠNG 2: ỨNG DỤNG DANH SÁCH LIÊN KẾT ĐƠN VÀO QUẢNLÝ SINH VIÊN.2.1. Đặc tả bài xích toán.Quản lý sv là công việc hằng ngày của phòng làm chủ học sinh- sinh viên. Các bước quản lý sinh viên đòi hỏi tính tỉ mỉ, cẩn trọng trong từng khâu ghi chép các thông tin cá nhân của sinh viên: mã số sinh viên, tên sinh viên, ngày tháng năm sinh, khóa, lớp….cũng như các bước thống kê tác dụng học tập cần cụ thể và chủ yếu xác. Trước đây công nghệ thông tin chưa cải tiến và phát triển mạnh mẽ, các quá trình được giải pháp xử lý thủ công,chủ yếu là ghi chép bởi bút, sổ sách chính vì vậy siêu tốn sức lực lao động và khá nhiều thời gian. Ngày nay khi nhưng khoa học tập kỹ thuật phạt triển, đặc biệt là sự bùng nổ công nghệ thông tin thì việc quản lý sinh viên sẽ dễ dãi hơn nhiều. Bắt đầu từ nhu cầu đó mà bài toán thống trị sinh viên ra đời. Yêu mong của bài toán là tạo thành chương trình có thể thực hiện các thao tác làm chủ sinh viên một giải pháp dễ dàng, tiện nghi dựa trên sự trợ giúp của máy tính. Mọi quá trình phải được làm việc trên một vùng dữ liệu chung để bảo đảm việc đồng nhất với nhau trong khâu cai quản lý.2.2. Yêu mong hệ thống.Quản lý điểm sinh viên là chương trình quản lý hồ sơ, điểm học tập của sv trong quá trình theo học tập tại trường. Chương trình hoàn toàn có thể thực hiện tại các công việc thêm mới sinh viên, tìm kiếm kiếm sv theo một đk nào đó, xóa sinh viên, liệt kê danh sách sinh viên….Chương trình được viết bằng ngữ điệu C++ cùng dựa trên cấu tạo lưu trữ của danh sách links đơn .2.3. Phân tích xây cất chương trình.2.3.1. Cấu trúc dữ liệu chương trình.Để hỗ trợ cho việc quản lý được chặt chẽ, dễ dàng dàng, chương trình quản lý điểm sinh viên sẽ sở hữu được các trường thích hợp sau:Masv (mã sinh viên) có kiểu tài liệu char, cùng với độ dài trăng tròn ký tự, từng sinh viên có một mã số riêng, không trùng lặp.Hoten (họ tên) gồm kiểu dữ liệu nvarchar, với độ nhiều năm 40 cam kết tự, chúng ta tên sinh viên rất có thể trùng nhau.Lop (lớp) bao gồm kiểu tài liệu char, cùng với độ dài 15 ký kết tự, một sv chỉ được xếp vào một lớp với 1 mã lớp tương ứng.Diemtoan (điểm môn toán) gồm kiểu dữ liệu int, trên đây là hiệu quả học tập môn toán của sv được cập nhập từ các giảng viên dạy.Diemly (điểm môn lý) gồm kiểu dữ liệu int, phía trên là công dụng học tập môn lý của sinh viên được cập nhập từ những giảng viên dạy.Diemhoa (điểm môn hoá) tất cả kiểu dữ liệu int, kết quả học tập môn hóa của sv được cập nhập từ các giảng viên dạy.Diemtb (điểm trung bình) bao gồm kiểu dữ liệu float, điểm vừa phải được tính bằng cách lấy trung bình cùng điểm thi các môn học tập của sinh viên.Struct Sinh
Vien Char Masv<20>;Char Hoten<40>;Char Lop <15>;Int Diemtoan;Int Diemly;Int Diemhoa;Int Diemtb;Sinh
Vien *Next;; 2.3.2. Các tính năng của chương trình.2.3.2.1. Nhập list sinh viên.Nhập vào mã số sinh viên.Nhập thông tin cụ thể cho từng sinh viên.2.3.2.2. Hiển thị list sinh viên.Duyệt qua danh sách sinh viên.In thông tin sinh viên ra màn hình.2.3.2.3. Tra cứu kiếm sv theo mã sinh viên.Duyệt qua danh sách.Tìm tìm theo mã sv mà người tiêu dùng yêu cầu.Hiển thị sinh viên vừa đưa ra màn hình.2.3.2.4.Xóa sv theo mã số sinh viên.Duyệt qua danh sách.Tìm tìm sinh viên theo mã sinh viên mà người tiêu dùng yêu cầu
Xóa sinh viên vừa tra cứu được.2.3.2.5. Bổ sung cập nhật sinh viên bắt đầu vào danh sách.Nhập sinh viên cần bổ sung vào danh sách.Cập nhập sv vào vào danh sách.Tăng con số sinh viên trong danh sách lên.2.3.2.6. Hiển thị sinh viên bao gồm điểm vừa đủ cao nhất.Nhập điểm từng môn của từng sinh viên vào danh sách.Tính điểm mức độ vừa phải của từng sinh viên.Tìm kiếm sinh viên có điểm vừa đủ cao nhất.Hiển thị sinh viên tất cả điểm trung bình cao nhất ra màn hình. 2.3.2.7. Thu xếp danh sách sinh viên tăng dần theo ngôi trường điểm trung bình
Duyệt qua list điểm mức độ vừa phải của từng sinh viên.Sắp xếp sinh viên tăng nhiều theo điểm vừa phải của từng sinh viên.Hiển thị danh sách sinh viên vừa thu xếp ra màn hình.2.4. Cài đặt chương trình2.4.1. Định nghĩa cấu trúc cho chương trình làm chủ sinh viên
Void insert(string ma,string ten,string l,float toan,float ly,float hoa,float dtb,node&first)Void nhap(node&first)Void xuat(node first)Void tim_ma(node first)Void xoa(node&first)Void themsv(node&first)Void dtb_max(node first)Void hoanvi(float&a,float&b)void Write(char *s,int x,int y, int color)void Ve_menu(int x0,int y0,int chon,int n,char *s<>)void menuchinh(char ch,char* st<>,int x0,int y0,int chon,int luuchon,int sodongc,int ok)Void sapxep(node first)Int main()2.4.2. Khởi tạo list sinh viênvoid nhap(node&first) // đắm đuối nhap cua ds don char ch; first=NULL; string ma,ten,lop; float toan,ly,hoa,dtb;do cout>toan; cout>ly; cout>hoa; dtb=(toan+ly+hoa)/3; insert(ma,ten,lop,toan,ly,hoa,dtb,first); coutnext; 2.4.4. Tìm kiếm sinh viên theo mã sinh viênvoid tim_ma(node first) // tim kiem sinh vien theo ma node p; p=first; string ma; cout>ma; while(p!=NULL) if(p->masv==ma) coutmasv; couthoten; coutlop; couttoan; coutly; couthoa; couttoan; break; p=p->next; 2.4.5. Xóa sv theo mã sinh viên.void xoa(node&first) // xoa sinh vien theo ma node p,q; p=first; q=first;string ma; cout>ma;while(p!=NULL&&p->masv!=ma) p=p->next; if(p==first) first=first->next; else if(p==NULL) coutnext!=p) q=q->next; q->next=p->next; 2.4.6. Bổ sung cập nhật sinh viên mới vào danh sách.void themsv(node&first) char ch; string ma,ten,lop; float toan,ly,hoa,dtb;do cout>toan; cout>ly; cout>hoa; dtb=(toan+ly+hoa)/3; insert(ma,ten,lop,toan,ly,hoa,dtb,first); coutdiemtb; p=p->next; while(p!=NULL) if(p->diemtb>max) max=p->diemtb; q=p; p=p->next; while(l!=NULL) if(l==q) coutmasv; couthoten; coutlop; couttoan; coutly; couthoa; couttoan; break; l=l->next; 2.4.8. Sắp xếp tăng dần theo điểm trung bình.void sapxep(node first) node p=first,q; while(p!=NULL) q=p->next; while(q!=NULL) if(p->diemtb>q->diemtb) hoanvi1(p->masv,q->masv); hoanvi1(p->hoten,q->hoten);hoanvi1(p->lop,q->lop); hoanvi(p->toan,q->toan); hoanvi(p->ly,q->ly); hoanvi(p->hoa,q->hoa); hoanvi(p->diemtb,q->diemtb); q=q->next; p=p->next; 2.5. Chương trình thống trị sinh viên# include # include # include #include#include#include#include "windows.h"#include using namespace std;//---------------------------------------------------------------#ifdef WIN32void gotoxy(int x, int y) COORD cur = x, y; Set
Console
Cursor
Position(Get
Std
Handle(STD_OUTPUT_HANDLE), cur); #elsevoid gotoxy(int x, int y) printf("33<%d
G33<%dd", x+1, y+1);#endifint textcolor ( int màu sắc ) HANDLE h; h = Get
Std
Handle(STD_OUTPUT_HANDLE ); return Set
Console
Text
Attribute(h, màu sắc );#define CYAN 10#define YELLOW 14//---------------------------------------------------------------struct nut string masv; string hoten; string lop; float toan; float ly; float hoa; float diemtb; string xeploai; nut *next;;typedef nut* node;node first;void insert(string ma,string ten,string l,float toan,float ly,float hoa,float dtb,node&first) node p,q; p=new(nut); p->masv=ma;p->hoten=ten; p->lop=l; p->toan=toan; p->ly=ly; p->hoa=hoa; p->diemtb=dtb; p->next=NULL; if(first==NULL) first=p; else q=first; while(q->next!=NULL) q=q->next; q->next=p; void nhap(node&first) // mê mẩn nhap cua ds don system("cls"); char ch; first=NULL; string ma,ten,lop; float toan,ly,hoa,dtb;do cout>toan; cout>ly; cout>hoa; dtb=(toan+ly+hoa)/3; insert(ma,ten,lop,toan,ly,hoa,dtb,first); coutnext; getch(); void tim_ma(node first) // tim kiem sinh vien theo ma system("cls"); node p; p=first; string ma; cout>ma; while(p!=NULL) if(p->masv==ma) coutmasv; couthoten; coutlop; couttoan; coutly; couthoa; couttoan; break; p=p->next; getch();void xoa(node&first) // xoa sinh vien theo ma system("cls"); node p,q; p=first; q=first; string ma; cout>ma; while(p!=NULL&&p->masv!=ma) p=p->next; if(p==first) first=first->next; else if(p==NULL) coutnext!=p) q=q->next; q->next=p->next; system("cls"); xuat(first); getch();void themsv(node&first) // bo sung sv moi vao danh sach{ system("cls"); char ch; string ma,ten,lop; float toan,ly,hoa,dtb;do cout>toan; cout>ly; cout>hoa; dtb=(toan+ly+hoa)/3; insert(ma,ten,lop,toan,ly,hoa,dtb,first); coutdiemtb; p=p->next; while(p!=NULL) if(p->diemtb>max) max=p->diemtb; q=p; p=p->next; while(l!=NULL) if(l==q) coutmasv; couthoten; coutlop; couttoan; coutly; couthoa; couttoan; break; l=l->next; getch();void hoanvi(float&a,float&b) float c=a; a=b; b=c; void hoanvi1(string&a,string&b) string c=a; a=b; b=c;void sapxep(node first) //sx sv tang dan theo dtb system("cls"); node p=first,q; while(p!=NULL) q=p->next; while(q!=NULL) if(p->diemtb>q->diemtb) hoanvi1(p->masv,q->masv); hoanvi1(p->hoten,q->hoten);hoanvi1(p->lop,q->lop); hoanvi(p->toan,q->toan); hoanvi(p->ly,q->ly); hoanvi(p->hoa,q->hoa); hoanvi(p->diemtb,q->diemtb); q=q->next; p=p->next; xuat(first); getch(); //----------------------------------------------------------------void Write(char *s,int x,int