Tìm hiểu danh sách liên kết đơn và cài đặt một số bài toán trên danh sách liên kết đơn - Pdf 25

TRƯỜNG ĐẠI HỌC DUY TÂN
KHOA CÔNG NGHỆ THÔNG TIN
ĐỒ ÁN CƠ SỞ
ĐỀ TÀI:
TÌM HIỂU DANH SÁCH LIÊN KẾT ĐƠN VÀ CÀI ĐẶT MỘT SỐ BÀI
TOÁN TRÊN DANH SÁCH LIÊN KẾT ĐƠN
Giảng viên hướng dẫn : PHẠM KHÁNH LINH
Sinh viên thực hiện : LÊ HỒNG LĨNH
Lớp : T16TMT
Đà Nẵng, tháng 04/2011
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn
MỤC LỤC

LỜI NGỎ 3
PHẦN MỞ ĐẦU 4
1- Lý do chọn đề tài: 4
2- Mục tiêu của đề tài: 5
3- Phạm vi nghiên cứu: 5
4- Phương pháp nghiên cứu: 5
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 5
1.1. Dữ liệu kiểu con trỏ 5
1.1.1. Giới thiệu chung và định nghĩa con trỏ: 5
1.1.2. Khai báo: 6
1.1.3. Sử dụng: 6
1.2.2. Phân loại: 7
1.2.3. Khai báo: 8
1.2.4. Các thao tác cơ bản trên Danh sách liên kết đơn : 8
1.2.4.1. Định nghĩa Node 8
1.2.4.2. Khai báo một Node 9
1.2.4.3. Chèn một Node P có giá trị x vào DSLK: 9
1.2.4.3.1. Chèn Node P có chứa giá trị x vào đầu danh sách liên kết 9

SVTH: Lê Hồng Lĩnh
Lớp : T16TMT
2
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn
Tài liệu tham khảo: 29
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN 30
NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN 31
LỜI NGỎ

SVTH: Lê Hồng Lĩnh
Lớp : T16TMT
3
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn
Trong nền khoa học và kỹ thuật ngày nay, ngành công nghệ thông tin đã có những
bước phát triển mạnh mẽ, có mặt hầu hết mọi nơi trong đời sống. Ứng dụng của công nghệ
thông tin ngày càng mở rộng trong các lĩnh vực khác nhau của đời sống kinh tế - xã hội, từ
một thiết bị nhỏ như điện thoại, hay đến các hệ thống lớn như hệ thống điều khiển giao
thông hàng không, điều khiển hoạt động của các nhà máy điện nguyên tử, hay quản lý hoạt
động của các bệnh viện v…v Chính vì các ứng dụng rộng rãi của công nghệ thông tin
mà các cá nhân cũng như các chuyên gia công nghệ thông tin quan tâm và nghiên cứu ra
những nguyên lý, công nghệ, giải pháp tối ưu để máy tính làm việc phục vụ cho đời sống
con người ngày một tốt hơn và hiệu quả hơn.
Với những đặc điểm trên đây ta có thể thấy rõ tầm quan trọng và đa dạng của ngành
công nghệ thông tin, điều đó đòi hỏi những sinh viên ngành công nghệ thông tin cần nắm
vững các nguyên lý và ứng dụng của các môn học nói chung và những cấu trúc dữ liệu và
giải thuật nói riêng. Trong phạm vi đề tài cơ sở, nhằm tìm hiểu về Danh sách liên kết đơn,
cấu trúc và các ứng dụng của nó, em xin trình bày đề tài: Tìm hiểu Danh sách liên kết đơn
và cài đặt một số bài toán trên Danh sách liên kết đơn.
Tuy đã cố gắng học hỏi và áp dụng dựa trên cơ sở kiến thức bộ môn “Cấu trúc dữ liệu
và giải thuật” đã được học và một số tài liệu tham khảo nhưng do khả năng và thời gian có

1.1.1. Giới thiệu chung và định nghĩa con trỏ:
- Các biến được sử dụng từ trước đến nay đều là biến có kích thước và kiểu dữ liệu
xác định, người ta gọi là biến tĩnh (static).
- Khi chạy chương trình, gặp những biến này, máy sẽ cung cấp lương bộ nhớ và địa
chỉ cho các biến đó mà không cần biết các biến đó sử dụng luc nào hoặc thậm chí có được
sử dụng hay không.
SVTH: Lê Hồng Lĩnh
Lớp : T16TMT
5
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn
- Các biến tĩnh tồn tại trong suốt thời gian thực hiện chương trình. Vì vậy, nếu chạy
một chương trình lớn trong khi máy lại hạn chế bộ nhớ thì sẽ xay ra tình trạng không đủ bộ
nhớ.
- Đối với những chương trình mà ta không dự đoán trước được kích thước của
chúng ra sao thì sẽ xảy ra tình trạng:
+ Cấp dư, gây lãng phí bộ nhớ.
+ Cấp thiếu, chương trình không chạy được.
- Để khắc phục những nhược điểm trên, các ngôn ngữ lập trình cấp cao như Pascal,
Turbo C, … thường sử dụng biến động (dynamic) vì có những đặc điểm sau:
+ Biến động được sinh ra trong quá trình thực hiện chương trình.
+ Biến động là loại biến có biến đổi được kích thước, vùng nhớ và địa chỉ
của vùng nhớ được cấp phát lúc chạy chương trình.
+ Có thể giải phóng biến động sau kho đã sử dụng để tiết kiệm bộ nhớ.
- Thế nhưng biến động cũng có nhược điểm là không thể truy cập đến nó được bởi
biến động không chứa địa chỉ nhất định.
- Để khắc phục nhược điểm này, người ta sử dụng một loại biến đặc biệt gọi là biến
con trỏ (pointer).
- Biến con trỏ có các đặc điểm:
+ Không chứa dữ liệu nhưng chứa địa của dữ liệu tức địa chỉ của biến khác.
+ Kích thước của biến con trỏ không phụ thuộc vào đối tượng mà nó trỏ tới.

SVTH: Lê Hồng Lĩnh
Lớp : T16TMT
6
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn
+ Dùng con trỏ để lưu địa chỉ của biến: Bản thân con trỏ sẽ được trỏ vào địa
chỉ của một biến có cùng kiểu dữ liệu với nó. Cú pháp của phép gán như
sau:
<tên con trỏ> = &<tên biến>;
Lưu ý:
+ Trong phép toán này, tên con trỏ không có dấu “*”
Ví dụ:
int x, *px;
px = &x;
Hai dòng lệnh trên sẽ cho con trỏ px có kiểu int trỏ vào địa chỉ của biến x có kiểu
nguyên. Phép toán &<tên biến> sẽ cho địa chỉ của biến tương ứng.
- Lấy giá trị của biến do con trỏ trỏ đến: Phép lấy giá trị của biến do con trỏ trỏ đến
được thực hiện bằng cách gọi tên:
*<tên con trỏ>;
Lưu ý:
+Trong phép toán này phải có dấu con trỏ “*”, nếu không có dấu con trỏ sẽ
trở thành phép lấy địa chỉ của biến do con trỏ trỏ tới.
Ví dụ:
int x=12, y, *px;
px = &y;
*px = x;
Quy trình diễn ra như sau:
int x=12, y, *px; x=12 y=0 px  NULL
px = &y; x=12 y=0  px
*px = x; x=12 y=x=12 px
Con trỏ px vẫn trỏ tới địa chỉ biến y và giá trị biến y sẽ là 12.

struct Node
{
int Info;
Node *Next;
};
- Danh sách liên kết đơn có thể hình dung qua hình vẽ sau:
first A B C D NULL
- first là con trỏ chứa địa chỉ Node đầu danh sách.
- Danh sách rỗng thì first=NULL.
- Khi làm việc trên danh sách liên kết đơn chúng ta cần có những chú ý sau:
+ Danh sách luôn có con trỏ trỏ đầu danh sách: con trỏ first.
+ Danh sách luôn có một giá trị báo kết thúc danh sách: giá trị NULL.
+ Trường Next của mỗi Node chỉ chứa địa chỉ Node ở sau nó, trừ Node cuối
cùng.
+ Trường Next của Node cuối cùng chứa giá trị NULL.
+ Không tách danh sách thành hai danh sách con nếu danh sách phần sau
chưa có con trỏ trỏ tới.
+ Khởi tạo danh sách rỗng: first = NULL;
1.2.4. Các thao tác cơ bản trên Danh sách liên kết đơn :
1.2.4.1. Định nghĩa Node
struct Node
{
int Info; // khai báo trường Info là kiểu int
Node *Next; // khai báo con trỏ Next kiểu Node (vì nó chứa địa chỉ
trỏ tới 1 Node khác có 2 trường)
};
SVTH: Lê Hồng Lĩnh
Lớp : T16TMT
8
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn

first=P;
else
{
PNext=first;
First=P;
}
}
1.2.4.3.2. Chèn Node P có chứa giá trị x vào vị trí bất kỳ trên danh sách liên kết
- Dữ liệu:
Đầu vào : Giá trị x, vị trí k , DSLK
Đầu ra : DSLK.
- Thuật toán:
Bước 1: Nhập giá trị x và vị trí k.
Bước 2: Khởi tạo Node P có giá trị x, chạy hàm Tìm Node Q có vị trí k.
SVTH: Lê Hồng Lĩnh
Lớp : T16TMT
9
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn
Bước 3: So sánh Q với NULL .Nếu Q bằng NULL thì thực hiện bước 4, nếu không thì qua
bước 5.
Bước 4: Kết luận không chèn.
Bước 5: Khai báo Node R=first.
Bước 6: So sánh RNext với Q. Nếu khác thì thực hiện bước 7, nếu không thì qua bước 8.
Bước 7: Gán R=RNext. Quay lại bước 6.
Bước 8: Gán RNext=P và PNext=Q.
Bước 9: Kết thúc hàm.
- Chương trình:
void Insert(int x,int k,Node *&first)
{
cout<<"\nNhap gia tri can chen:";

Lớp : T16TMT
10
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn
Bước 1: Nhập giá trị x
Bước 2: Khởi tạo Node P có giá trị x
Bước 3: So sánh first với NULL .Nếu first bằng NULL thì thực hiện bước 4, nếu không thì
qua bước 5.
Bước 4: Gán first = P. Thực hiện bước
Bước 5: Khai báo Node R=first.
Bước 6: So sánh RNext với NULL. Nếu khác NULL thì qua bước 7, nếu bằng NULL thì
qua bước 8.
Bước 7: Gán R=RNext. Quay lại bước 6.
Bước 8: Gán RNext=P và PNext=NULL.
Bước 9: Kết thúc hàm.
- Chương trình
void PushEnd(int x,Node *&first)
{
Node *P;
P=MakeNode(x);
if(first= = NULL)
first=P;
else
{
Node *R=first;
while(RNext!=NULL)
R=RNext;
RNext=P;
PNext=NULL;
}
}

- Sơ đồ khối:
2.2 Xuất DSLK:
- Dữ liệu:
Đầu vào : DSLK
Đầu ra : DSLK
- Thuật toán:
Bước 1: Khai báo Node R=first.
Bước 2: So sánh R với NULL. Nếu R khác NULL thì qua bước 3, nếu không qua bước 5.
Bước 3: In giá trị RInfo ra màn hình.
Bước 4: Gán R=RNext. Quay lại bước 2.
Bước 5: Kết thúc hàm.
SVTH: Lê Hồng Lĩnh
Lớp : T16TMT
12
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn
- Sơ đồ khối:
2.3 Tính tổng các giá trị lẻ trong DSLK:
- Dữ liệu:
Đầu vào: DSLK
Đầu ra: Tổng các giá trị lẽ
- Thuật toán:
Bước 1: Khai báo Node R=first, Tong Le=0.
Bước 2: So sánh R với NULL. Nếu R khác NULL thì thực hiện bước 3, nếu không thì qua
bước 6.
Bước 3: So sánh RInfo có chia hết cho 2 không, nếu không thì thực hiện bước 4, nếu
đúng thì thực hiện bước 5.
Bước 4: TongLe bằng TongLe cộng với giá trị RInfo.
Bước 5: Gán R=RNext. Quay lại bước 2.
Bước 6: Kết thúc hàm.
- Sơ đồ khối:

14
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn
2.5 Đếm xem trong DSLK có bao nhiêu phần tử chẵn:
- Dữ liệu:
Đầu vào : DSLK
Đầu ra : Số phần tử chẵn.
- Thuật toán:
Bước 1: Khai bào Node R=first. Dem=0
Bước 2: So sánh R với NULL. Nếu R khác NULL thì thực hiện bước 3, nếu không thì qua
bước 6.
Bước 3: So sánh xem RInfo có chia hết cho 2 hay không. Nếu có thì qua bước 4, nếu
không chuyển sang bước 5.
Bước 4: Dem tăng thêm 1.
Bước 5: Gán R=RNext. Quay lại bước 2
Bước 6: Kết thúc hàm.
SVTH: Lê Hồng Lĩnh
Lớp : T16TMT
15
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn
- Sơ đồ khối:
2.6 Kiểm tra DSLK có chứa các số chẵn hay không?
- Dữ liệu:
Đầu vào : DSLK
Đầu ra : Kết luận DSLK có chẵn hay không.
- Thuật toán:
Bước 1: Khai báo biến Check. R=first.
Bước 2: So sánh R với NULL. Nếu R khác NULL thì thực hiện bước 3, nếu không thì qua
bước 7.
Bước 3: So sánh xem RInfo có chia hết cho 2 hay không, nếu có thì qua bước 4, nếu
không qua bước 6:

Bước 1: Nhập giá trị x và vị trí k.
Bước 2: Khởi tạo Node P có giá trị x, chạy hàm Tìm Node Q có vị trí k.
Bước 3: So sánh Q với NULL .Nếu Q bằng NULL thì thực hiện bước 4, nếu không thì qua
bước 5.
Bước 4: Kết luận không chèn.
Bước 5: Khai báo Node R=first.
Bước 6: So sánh RNext với Q. Nếu khác thì thực hiện bước 7, nếu không thì qua bước 8.
Bước 7: Gán R=RNext. Quay lại bước 6.
Bước 8: Gán RNext=P và PNext=Q.
Bước 9: Kết thúc hàm.
- Sơ đồ khối:
SVTH: Lê Hồng Lĩnh
Lớp : T16TMT
18
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn
2.9 Xoá một phần tử tại vị trí k trong DSLK:
- Dữ liệu:
Đầu vào : vị trí k, DSLK
Đầu ra : DSLK
-Thuật toán:
Bước 1: Nhập vị trí k.
Bước 2: Khởi chạy hàm Tìm Node Q có vị trí k.
Bước 3: So sánh Q với NULL .Nếu Q bằng NULL thì thực hiện bước 4, nếu không thì qua
bước 5.
Bước 4: Kết luận không xóa.
Bước 5: Khai báo Node R=first.
Bước 6: So sánh RNext với Q. Nếu khác thì thực hiện bước 7, nếu không thì qua bước 8.
Bước 7: Gán R=RNext. Quay lại bước 6.
Bước 8: Gán RNext=QNext. xóa Node Q.
Bước 9: Kết thúc hàm.

#include <stdio.h>
#include <iostream.h>
#include <math.h>
struct Node
{
int Info;
Node *Next;
};
Node *MakeNode(int x)
{
Node *P;
P=new Node;
P->Info=x;
P->Next=NULL;
return P;
}
void PushTop(int x,Node *&first)
{
Node *P;
P=MakeNode(x);
if(first==NULL)
SVTH: Lê Hồng Lĩnh
Lớp : T16TMT
21
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn
first=P;
else
{
P->Next=first;
first=P;

int TongLe=0;
Node *R=first;
while(R!=NULL)
{
if(R->Info%2==1)
TongLe=TongLe+R->Info;
R=R->Next;
}
cout<<"\nTong cac gia tri le trong DSLK
la:"<<TongLe;
return TongLe;
SVTH: Lê Hồng Lĩnh
Lớp : T16TMT
22
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn
}
3.1.4 Tính trung bình cộng các số nguyên tố trong DSLK:
void TBCSNT(Node *first)
{
float Tong=0,DemSNT=0,TBC;
Node *R=first;
int CheckNumber;
while(R!=NULL)
{
int x=R->Info;
if(x==2)
CheckNumber=1;
else
{
for(int i=2;i<x;i++)

R=R->Next;
}
cout<<"\nCo "<<Dem<<" phan tu chan trong DSLK";
SVTH: Lê Hồng Lĩnh
Lớp : T16TMT
23
Đề tài: Tìm hiểu Danh sách liên kết đơn và cài đặt một số bài toán trên Danh sách liên kết đơn
}
3.1.6 Kiểm tra DSLK có chẵn hay không:
void CheckChan(Node *first)
{
int Check;
Node *R=first;
while(R!=NULL)
{
if(R->Info%2==0)
Check=1;
else
{
Check=0;
break;
}
R=R->Next;
}
if(Check==1)
cout<<"\nDSLK gom cac phan tu chan";
else
cout<<"\nDSLK khong chan";
}
3.1.7 Tìm Node Q ở vị trí k trong DSLK:

P->Next=first;
first=P;
}
else
{
Node *R=first;
while(R->Next!=Q)
R=R->Next;
R->Next=P;
P->Next=Q;
}
}
}
3.1.9 Xóa một Node tại vị trí k trong DSLK:
void Delete(int k,Node *&first)
{
Node *Q=FindQ(k,first);
if(Q==NULL)
cout<<"\nDSLK rong,khong the xoa.";
else
{
if(Q==first)
{
first=first->Next;
delete(Q);
}
else
{
Node *R=first;
while(R->Next!=Q)


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status