Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 45 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
45
Dung lượng
297,13 KB
Nội dung
Đề tài: Quảnlýsinhviênbằngdanhsáchliênkết đơn
c
Nguyễn Ngọc Quang 1
Đề tài: Quảnlýsinhviênbằngdanhsáchliênkết đơn
Phần Mở đầu
1. Lýdo chọn đề tài:
Công nghệ thông tin là một trong những ngành phát triển vượt bậc
trong những năm gần đây. Ngày nay với sự phát triển nhanh chóng của xã
hội thì công nghệ thông tin được ứng dụng rộng rãi ở hầu hết tất cả các lĩnh
vực và ngày càng đóng vai trò quan trọng, trở thành một phần thiết yếu trong đời
sống hằng ngày. Công nghệ thông tin là một ngành đòi hỏi ở người học một nền
tảng kiến thức vững chắc, sự tư duy logic cao, hiểu biết sâu rộng trên nhiều
lĩnh vực. Với chúng em hiện đang là những sinhviên công nghệ thông tin
cần phải có sự đầu tư, không ngừng học hỏi để nâng cao kiến thức. Dođó
để củng cố lại kiến thức đã học, đề tài mà em chọn để thực hiện đồán là: Bàitoán
Quản lýsinhviênbằngdanhsáchliênkếtđơn
2. Mục tiêu của đề tài.
- Củng cố lại kiến thức đã học về danhsáchliênkết nói chung và danh
sách liênkếtđơn nói riêng.
- Rèn luyện kỹ năng lập trình trên ngôn ngữ C++.
- Ứng dụng lý thuyết đã học giải quyết bàitoán ứng dụng cụ thể
3. Phạm vi nghiên cứu.
- Lý thuyết về danhsáchliênkết đơn
- Bàitoánquảnlýsinh viên
4. Phương pháp nghiên cứu.
- Nghiên cứu tài liệu cấu trúc dữ liệu và giải thuật trên sách.
- Tìm kiếm và nghiên cứu trên mạng Internet.
Nguyễn Ngọc Quang 2
Đề tài: Quảnlýsinhviênbằngdanhsáchliênkết đơn
CHƯƠNG 1: CƠ SỞ LÝTHUYẾT
1. Tổng quan về danhsáchliên kết
1.1. Định nghĩa
Danh sáchliênkết là danhsách mà các phần tử ( Node) liênkết với nhau nhờ
vào vùng liênkết của chúng. Mỗi node bao gồm 2 phần: Phần Data dùng để chứa dữ
liệu cần xử lý và phần liênkết dùng để liênkết tới các node khác.
1.2 .Phân loại.
Tùy cách liênkết giữa các phần tử, danhsáchliênkết gồm có nhiều loại khác
nhau:
- Danhsáchliênkết đơn: mỗi phần tử liênkết với phần tử đứng sau nó trong danh
sách.
- Danhsáchliênkết đôi/kép: mỗi phần tử liênkết với các phần tử đứng trước và
sau nó trong danh sách.
- Danhsáchliênkết vòng: phần tử cuối danhsáchliênkết với phần tử đầu danh
sách.
1.3. Danhsáchliênkết đơn.
1.3.1. Khái niệm.
Danh sáchliênkếtđơn là một cấu trúc lưu trữ trong đó các phần tử của danhsách
không cố định, các phần tử trong danhsách không thể truy cập trực tiếp. Muốn truy
cập bất kỳ phần tử nào đó trong danhsách phải xuất phát từ phần tử đầu tiên. Mỗi
Node trong danhsách có thể được biểu diễn như sau.
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 hay còn gọi là vùng liên kết.
Cú pháp:
Nguyễn Ngọc Quang 3
Data Next
Đề tài: Quảnlýsinhviênbằngdanhsáchliênkết đơn
Stuct Node {
Kiểu_dữ_liệu Data;
Node*next;
}
Có thể hình dung danhsáchliênkếtđơn qua hình vẽ sau:
Hình 1.1: Danhsáchliênkết đơn
1.3.2.Thao tác trên 1 node.
- Khai báo biến con trỏ p là biến con trỏ kiểu Node: Node *p.
- Cấp phát bộ nhớ cho Node mới – được trỏ bởi 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ỏ bởi p: delete (p).
1.3.3. Các thao tác trên danhsáchliênkết đơn
Thao tác trên danhsáchliênkết khác với thao tác trên mảng, khi cần thêm Node
vào danhsáchliênkết thì ta xin cấp phát bộ nhớ cho Node và nối Node đó vào danh
sách và khi không sử dụng thì ta giải phóng nó khỏi danh sách. Truy cập trên danhsá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 địa chỉ ô nhớ) thì ở danhsáchliênkết ta phải truy cập một cách tuần tự. Khi
làm việc trên danhsáchliênkếtđơn cũng tương tự như vậy nên ta cần chú ý những
điểm sau:
- Danhsách luôn có con trỏ đầu danh sách: con trỏ L
- Danhsách luôn có giá trị báo kết thúc danh sách: NULL.
- Trường next của mỗi Node chỉ chứa địa chỉ của Node sau nó, trừ Node cuối.
- Trường next của Node cuối cùng chứa giá trị NULL.
- Không tách danhsách thành 2 danhsách con nếu danhsách phần sau
chưa có con trỏ tới.
- Khởi tạo danhsách rỗng: L = NULL
Nguyễn Ngọc Quang 4
Đề tài: Quảnlýsinhviênbằngdanhsáchliênkết đơn
1.3.3.1. Duyệt danhsáchliênkết đơn
Duyệt lần lượt qua từng Node của danh sách.
Mục_đích(Node *L)
{
Node *p=L; //cho con trỏ p trỏ vào đầu danhsách L.
while(!điều kiện dừng)
{
[xử lý p->info];//xuất thông tin ra màn hình, thực hiện các phép toán…
p= p->Next; //cho con trỏ p trỏ tới Node kế tiếp.
}
1.3.3.2. Chèn một phần tử vào danh sách
Để chèn một phần tử X vào danhsách ta cấp phát bộ nhớ cho 1 Node
mới được trỏ bởi q và gán giá trị X cho trường info
Node *q;
q=new Node;
q->info=X;
Chèn một Node mới vào danhsách có 4 trường hợp:
- Trường hợp 1: Chèn Node được trỏ bởi q vào đầu sách
Bước 1: cho vùng liênkết của q chứa địa chỉ Node đầu danh sách.
q->next=L;(1)
Bước 2: cho L trỏ tới q : cập nhập lại con trỏ đầu danh sách.
L = q; (2)
Nguyễn Ngọc Quang 5
Đề tài: Quảnlýsinhviênbằngdanhsáchliênkết đơn
Hình 1.2: ….
- Trường hợp 2: Chèn Node được trỏ bởi q vào sau Node trỏ bởi p trong danh
sách
Bước 1: Cho vùng liênkết của Node được trỏ bởi q chứa địa chỉ Node
ngay sau Node được trỏ bởi p.
q->next=p->next; (1)
Bước 2: Cho vùng liênkết của Node được trỏ bởi q chứa địa chỉ của
Node được trỏ bởi p.
p->next=q; (2)
Hình 1.3: …
- Trường hợp 3: Chèn Node được trỏ bởi q vào cuối danh sách
Bước 1: Nếu danhsách rỗng thì danhsách hiện tại có 1 phần tử chính là
q vừa mới chèn vào, return.
Bước 2: Ngược lại nếu danhsách không rỗng
• Cho con trỏ p chứa địa chỉ Node đầu danh sách:
Nguyễn Ngọc Quang 6
Đề tài: Quảnlýsinhviênbằngdanhsáchliênkết đơn
Node *p=L;
• Duyệt danhsách từ đầu cho tới Node cuối cùng
while(p->next!=NULL) p=p->next;
• Cho phần liênkết của Node được trỏ bởi p chứa địa chỉ của q
p->next=q;
• Cập nhập lại Node cuối cùng bây giờ chính là Node q vừa mới tạo ra.
q->next=NULL;
- Trường hợp 4: Chèn Node được trỏ bởi q vào trước Node được trỏ bởi p
Bước 1: Nếu p trỏ đầu danh sách, thực hiện chèn đầu danh sách(trường
hợp1), return.
Bước 2: Ngược lại cho con trỏ t chứa địa chỉ Node trước Node được trỏ bởi
p trong danh sách: Node *t;
t->next=p;
Chèn Node được trỏ bởi q vào sau Node được trỏ bởi t (trường hợp 2).
1.3.3.3. Xóa một phần tử ra khỏi danh sách: có 2 trường hợp xảy ra
- Trường hợp 1: Thực hiện xóa đầu danhsách nếu p chứa địa chỉ
Node đầudanh sách (L)
Bước 1: Cho con trỏ đầu danhsách L trỏ vào Node sau nó.
L=L->next; (1)
Bước 2: Giải phóng Node p ra khỏi danh sách.
Delete(p);
Nguyễn Ngọc Quang 7
Đề tài: Quảnlýsinhviênbằngdanhsáchliênkết đơn
Hình 1.4: …
- Trường hợp 2: Con trỏ p chứa địa chỉ Node bất kỳ nhưng không
phải Node đầu
Bước 1: Cho con trỏ q trỏ đầu danhsách L , dùng vòng lặp cho nó trỏ tới địa chỉ
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 địa chỉ của Node ngay sau Node được trỏ bởi p vào ô nhớ next của
Node được trỏ bởi q
q->Next=p->next; (2)
Bước 3: Giải phóng Node được trỏ bởi p
delete(p);(3)
Hình 1.5: …
Nguyễn Ngọc Quang 8
Đề tài: Quảnlýsinhviênbằngdanhsáchliênkết đơn
1.3.4.4. Tìm kiếm phần tử trong danh sách
Bước 1: Cho p trỏ vào đầu danhsách L và khởi tạo biến found=0
Node *p=L; int found=0;
Bước 2: Thực hiện vòng lặp để duyệt p chạy từ đầu danhsách tới cuối danh sách,
tại mỗi Node nếu trường info của Node được trỏ bởi p =X thì cho found=1 để dừng
vòng lặp. Ngược lại nếup!=X thì cho p trỏ tới vị trí Node ngay sau Node
được trỏ bởi 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 tạo 3 biến con trỏ p, t, q. Trong đó p trỏ vào đầu danhsách L, t=
NULL (không trỏ vào địa chỉ nào cả), q trỏ vào địa chỉ Node được trỏ bởi p.
Node *p=L,*t=NULL,*q=p ;
Nguyễn Ngọc Quang 9
Đề tài: Quảnlýsinhviênbằngdanhsáchliênkết đơn
Bước 2: Dùng vòng lặp duyệt p chạy từ đầu tới cuối danh sách. Trong
khi thực hiện vòng lặp
• Cho vùng liênkết của Node được trỏ bởi q chứa địa chỉ của t
q->next=t;
• Cho t trỏ đế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ỏ bởi t (cập nhập lại L)
L=t
Hình 1.7:
Nguyễn Ngọc Quang 10
[...]... bằngdanhsáchliênkếtđơn } // int main() { menu_chinh(); } 2.6 Màn hình kết quả 2.6.1 Menu chính của chương trình Nguyễn Ngọc Quang 34 Đề tài: Quản lýsinhviênbằngdanhsáchliênkếtđơn 2.6.2 Tạo danhsáchsinhviên 2.6.3 Hiển thị danhsáchsinhviên Nguyễn Ngọc Quang 35 Đề tài: Quản lýsinhviênbằngdanhsáchliênkếtđơn 2.6.4 Tìm kiếm sinhviên theo mã sinh viên. .. Quản lýsinhviênbằngdanhsáchliênkếtđơn C H Ư Ơ N G 2 : Ứ N G D Ụ N G DA N H S ÁC H L I Ê N K Ế T Đ Ơ N VÀ O Q UẢ N LÝSINHVIÊN 2.1 Đặc tả bài toánQuảnlýsinhviên là công việc hằng ngày của phòng quảnlý học sinh- sinhviên Công việc quảnlýsinhviên đòi hỏi tính tỉ mỉ, cẩn thận 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, ... danhsáchsinhviên - In thông tin sinhviên ra màn hình Nguyễn Ngọc Quang 12 Đề tài: Quản lýsinhviênbằngdanhsáchliênkếtđơn 2.3.2.3 Tìm kiếm sinhviên theo mã sinhviên - Duyệt qua danhsách - Tìm kiếm theo mã sinhviên mà người dùng yêu cầu - Hiển thị sinhviên vừa tìm ra màn hình 2.3.2.4.Xóa sinhviên theo mã số sinhviên - Duyệt qua danhsách - Tìm kiếm sinhviên theo mã sinhviên mà người... " ch=getch(); cin.sync(); }while(ch!=27); }} 2.4.3 Hiển thị danhsáchsinhviên void xuat(node first) { node p; p=first; while(p!=NULL) { cout< >ma; while(p!=NULL&&p->masv!=ma) . tài: Quản lý sinh viên bằng danh sách liên kết đơn
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 toán.
Quản lý sinh viên. tài: Quản lý sinh viên bằng danh sách liên kết đơn
CHƯƠNG 1: CƠ SỞ LÝTHUYẾT
1. Tổng quan về danh sách liên kết
1.1. Định nghĩa
Danh sách liên kết là danh sách