1. Trang chủ
  2. » Luận Văn - Báo Cáo

Đề tài thao tác chèn và xóa phần tử trong danh sách

29 0 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN ĐỒ ÁN CƠ SỞ TÊN ĐỀ TÀI: THAO TÁC CHÈN VÀ XÓA PHẦN TỬ TRONG DANH SÁCH Người hướng dẫn: ThS NGUYỄN THỊ LỆ QUYÊN Sinh viên thực hiện: HUỲNH THỊ HỒNG VÂN LỚP:20TCLC-DT2 NHÓM: 20Nh11B Đà Nẵng, 25/08/2021 MỤC LỤC MỤC LỤC DANH MỤC HÌNH VẼ .3 LỜI MỞ ĐẦU 1 TỔNG QUAN ĐỀ TÀI 2 CƠ SỞ LÝ THUYẾT 2.1 2.2 Ý tưởng .2 Cơ sở lý thuyết 2.2.1 Con trỏ 2.2.2 Kiểu cấu trúc (struct): .3 2.2.3 Cấp phát nhớ động .4 2.2.4 Mảng: .4 TỔ CHỨC CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN 3.1 3.2 Phát biểu toán Cấu trúc liệu 3.2.1 Mảng động (Dynamic array) 3.2.2 Danh sách liên kết đơn 3.3 Thuật toán 3.3.1 Danh sách liên kết đơn: 3.3.2 Mảng động 3.3.3 Độ phức tạp thuật toán: 11 CHƯƠNG TRÌNH VÀ KẾT QUẢ 11 4.1 Tổ chức chương trình 11 4.2 4.3 Ngôn ngữ cài đặt .12 Kết 12 4.3.1 Giao diện chương trình 12 4.3.2 Kết thực thi chương trình .12 4.3.3 Nhận xét đánh giá 15 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN .15 5.1 Kết luận .15 5.2 Hướng phát triển .15 TÀI LIỆU THAM KHẢO 16 PHỤ LỤC 17 DANH MỤC HÌNH VẼ Hình 1: Mô danh sách liên kết đơn Hình 2: Thêm node vào đầu danh sách liên kết đơn Hình 3: Thêm node vào cuối danh sách liên kết đơn Hình 4: Thêm node vào vị trí danh sách liên kết đơn Hình 5: Xóa node khỏi đầu danh sách liên kết đơn Hình 6: Xóa node khỏi cuối danh sách liên kết đơn Hình 7: Xóa node khỏi vị trí danh sách liên kết đơn Hình 8: Thêm giá trị mảng 10 Hình 9: Xóa vị trí mảng 10 Hình 10: Giao diện bắt đầu chương trình .12 Hình 11: Nhập giá trị n từ bàn phím .12 Hình 12: Nhập lựa chọn chèn, giá trị vị trí chèn 13 Hình 13: Nhập lựa chọn xóa vị trí cần xóa 13 Hình 14 Nhập tiếp lựa chọn giá trị tương ứng với lựa chọn .14 Hình 15: Hiển thị danh sách theo thứ tự .14 Đồ án lập trình tính tốn LỜI MỞ ĐẦU Trong khoa học máy tính, danh sách liên kết đơn mảng cấu trúc liệu thường gặp sử dụng nhiều thuật toán khác Mỗi cấu trúc liệu có ưu nhược điểm khác Cả hai cấu trúc có thao tác giống chèn phần tử, xóa phần tử, truy cập phần tử,…Trong đó, thao tác chèn xóa phần tử danh sách góp phần lớn nghiên cứu khoa học thực tế Vậy nên để nâng cao độ xác, tạo tảng kiến thức vững cho người học, đề tài hôm giúp cho hiểu rõ thao tác danh sách liên kết đơn mảng động Xuất phát từ mục đích người đọc khảo sát thực tế, với hướng dẫn tận tình ThS Nguyễn Thị Lệ Quyên, chọn nghiên cứu đề tài : “Thao tác chèn xóa phần tử danh sách” Tập trung phân tích chuyên sâu, đưa chương trình giúp ích q trình học nghiên cứu có liên quan thao tác chèn xóa phần tử chương trình Đồ án lập trình tính tốn TỔNG QUAN ĐỀ TÀI Xây dựng so sánh chương trình thêm xóa phần tử danh sách liên kết đơn với mảng động chiều CƠ SỞ LÝ THUYẾT 2.1 Ý tưởng Dùng ngơn ngữ lập trình C để xây dựng chương trình thêm xóa phần tử danh sách, có lựa chọn để dễ dàng sử dụng danh sách liên kết đơn mảng động chiều Từ rút so sánh khả thêm xóa phần tử chúng 2.2 Cơ sở lý thuyết 2.2.1 Con trỏ - Định nghĩa: Con trỏ là biến, khai báo, khởi tạo lưu trữ giá trị có địa riêng Nhưng biến trỏ khơng lưu giá trị bình thường, biến trỏ tới địa khác, tức mang giá trị địa - Cú pháp khai báo trỏ: < Kiểu liệu > *< Tên trỏ>;  Trong đó:  Kiểu liệu là: void, int, float, double,…  Dấu * trước tên biến ký hiệu báo cho trình biên dịch biết ta - khai báo trỏ  Tên trỏ: tuân theo quy tắc đặt tên biến Biến trỏ có đặc điểm:  Không chứa liệu chứa địa liệu tức địa biến khác  Kích thước biến trỏ không phụ thuộc vào đối tượng mà trỏ tới  Con trỏ có kiểu liệu với kiểu liệu biến mà trỏ tới - Sử dụng: Con trỏ dùng để truy cập biến thông qua địa biến chương trình tham khảo biến gián tiếp qua biến địa Con trỏ sử dụng theo cách: Đồ án lập trình tính tốn  Dùng trỏ để lưu địa biến: lấy giá trị biến trỏ trỏ đến thao tác  Dùng trỏ để lưu địa biến: Bản thân trỏ trỏ vào địa biến có kiểu liệu với Cú pháp phép gán sau: < Tên trỏ > =&< Tên biến >; - Lấy giá trị biến trỏ trỏ đến: phép lấy giá trị biến trỏ trỏ đến thực cách gọi tên: *< Tên trỏ >; 2.2.2 Kiểu cấu trúc (struct): - Định nghĩa: Struct kiểu liệu bao gồm nhiều thành phần thuộc nhiều kiểu liệu khác Các phần tử truy cập qua tên - Cú pháp định nghĩa struct: C1 : Không dùng typedef struct struct_name { Kiểu_dữ_liệu member1; Kiểu_dữ_liệu member2; … }; C2 : Dùng typedef Typedef struct struct_name { Kiểu_dữ_liệu member1; Kiểu_dữ_liệu member2; … }New_struct_name; Sau định nghĩa xong cấu trúc struct_name coi kiểu liệu ta tự định nghĩa Đồ án lập trình tính tốn - Khai báo biến cấu trúc (có cách): C1 : Khai báo trực tiếp định nghĩa cấu trúc VD: struct sinh_vien { char fullname[100]; char quequan[100]; int namsinh; }SV1,SV2; C2 : Khai báo gián tiếp sau định nghĩa xong cấu trúc VD: struct sinh_vien { char fullname[100]; char quequan[100]; int namsinh; }; struct sinh_vien SV1,SV2; - Chúng ta có tốn tử dùng để truy xuất tới biến thành viên kiểu struct C  Sử dụng ‘.’ :Toán tử truy xuất tới thành viên khai báo biến bình thương  Sử dụng ‘->’: Toán tử truy xuất tới thành viên biến trỏ 2.2.3 Cấp phát nhớ động - Hàm calloc:  Cú pháp khai báo: void *calloc(so_phan_tu,kich_co_phan_tu); Trong đó:  so_phan_tu: số phần tử để cấp phát  kich_co_phan_tu: kích cỡ phần tử  Hàm trả trỏ tới nhớ cấp phát, trả NULL yêu cầu thất bại Đồ án lập trình tính tốn -  Giá trị khởi tạo: gán Hàm realloc:  Cú pháp khai báo: void *realloc(void *ptr, kich_co); Trong đó:  ptr: trỏ tới khối nhớ cấp phát trước với malloc, calloc realloc để tái cấp phát Nếu giá trị NULL, khối cấp phát trỏ tới trả hàm  Kich_co: kích cỡ cho khối nhớ Nếu giá trị trỏ ptr trỏ tới khối nhớ tồn tại, khối nhớ trỏ tới ptr giải phóng trỏ NULL trả  Giá trị khởi tạo: gán giá trị rác 2.2.4 Mảng: - Định nghĩa: Mảng tập hợp phần tử, phần tử xác định mục (index), có kiểu liệu Các phần tử mảng truy cập cách sử dụng số - Mảng có kích thước n đánh dấu số từ đến n-1 - Khai báo cấu trúc: Type arrayName[so_luong_phan_tu];  Trong đó:  Type kiểu liệu phần tử mảng  So_luong_phan_tu kích thước mảng hay gọi tổng số 0lượng phần tử lưu trữ mảng - Khởi tạo giá trị mảng: C1: Khởi tạo phần tử khai báo: Type ArrayNames[so_luong_phan_tu] = {element} Trong đó: element: giá trị thành phần C2: Gán thủ cơng phần tử mảng cho giá trị có kiểu liệu Đồ án lập trình tính toán TỔ CHỨC CẤU TRÚC DỮ LIỆU VÀ THUẬT TỐN 3.1 Phát biểu tốn - Mơ tả: Chương trình viết ngơn ngữ C cho phép thêm phần tử vào vị trí nhập từ bàn phím xóa phần tử vị trí Ta có danh sách rỗng  Input:  Nhập vào số nguyên dương n, n ≤ 105  n dòng tiếp, dịng cho thơng tin thao tác Mỗi dịng bắt đầu ký tự thuộc {I, D}  Nếu ký tự đầu dịng “I” hai số nguyên v, i  Nếu ký tự đầu dịng D số ngun tương ứng i  Output: Các phần tử danh sách cuối in theo thứ tự 3.2 Cấu trúc liệu 3.2.1 Mảng động (Dynamic array) - Mảng cấp phát nhớ cách động trình chạy chương trình C malloc calloc,realloc - Ưu điểm : Kích thước mảng động thay đổi, co giãn cần nên tránh việc lãng phí nhớ - Nhược điểm:  Khai báo phức tạp cấp phát tĩnh  Phải kiểm soát vùng nhớ động sử dụng trình biên dịch khơng tự động thu hồi vùng nhớ cấp phát Phải sử dụng toán tử free để giải phóng nhớ 3.2.2 Danh sách liên kết đơn - Danh sách liên kết đơn (Single Linked List) cấu trúc liệu động, danh sách mà phần tử liên kết với phần tử sau danh sách Mỗi phần tử (được gọi node hay nút) danh sách liên kết đơn cấu trúc có hai thành phần: Đồ án lập trình tính tốn Hình 8: Thêm giá trị mảng - Thuật tốn xóa giá trị vị trí mảng: B1 : Phân bố lại nhớ cấp phát B2 : Kiểm tra vị trí cần chèn có hợp lệ khơng B3 : Thực dịch chuyển mảng lùi số phần phía sau vị trí xóa B4 : Giảm số lượng phần tử Hình 9: Xóa vị trí mảng 11 Đồ án lập trình tính tốn 3.3.3 Độ phức tạp thuật tốn: Thuật tốn Danh sách liên kết đơn Mảng động Xóa đầu O(1) O(n) Xóa cuối O(n) O(1) Xóa vị trí O(i) O(n-i) Thêm đầu O(1) O(n) Thêm cuối O(n O(1) Thêm vị trí O(i) O(n-i)  Trong đó:  n số lượng giá trị có danh sách  i vị trí cần chèn/xóa CHƯƠNG TRÌNH VÀ KẾT QUẢ 4.1 Tổ chức chương trình - Nhập vào số nguyên n - Nhập vào chữ I D  Nếu chữ I  Nhập vào giá trị v vị trí i cần thêm vào danh sách  Tiến hành kiểm tra vị trí cần thêm  Tiến hành thêm giá trị v vào vị trí i danh sách  Nếu chữ D  Nhập vào vị trí i cần xóa danh sách  Tiến hành kiểm tra vị trí cần xóa  Tiến hành xóa vị trí i danh sách - Xuất giá trị có danh sách 4.2 Ngơn ngữ cài đặt Ngôn ngữ cài đặt : Ngôn ngữ C 12 Đồ án lập trình tính tốn 4.3 Kết 4.3.1 Giao diện chương trình Hình 10: Giao diện bắt đầu chương trình 4.3.2 Kết thực thi chương trình Hình 11: Nhập giá trị n từ bàn phím 13 Đồ án lập trình tính tốn Hình 12: Nhập lựa chọn chèn, giá trị vị trí chèn Hình 13: Nhập lựa chọn xóa vị trí cần xóa 14 Đồ án lập trình tính tốn Hình 14 Nhập tiếp lựa chọn giá trị tương ứng với lựa chọn Hình 15: Hiển thị danh sách theo thứ tự 4.3.3 Nhận xét đánh giá - Ưu điểm: 15 Đồ án lập trình tính tốn  Danh sách liên kết đơn: Viê Ÿc chèn hay xóa mơ Ÿt phần tử danh sách liên kết dễ dàng, ta cần thay đổi vị trí trỏ trỏ thay phải dịch tồn bơ Ÿ phần liê Ÿu cịn lại Chương trình hiển thị kết nhanh chóng xác  Mảng: Việc chèn hay xóa phần tử cuối danh sách nhanh chóng Có thể truy cập ngẫu hiên phần tử trực tiếp ngẫu nhiên - Nhược điểm:  Danh sách liên kết đơn: Ta truy câpŸ ngẫu nhiên mô Ÿt phần tử danh sách liên kết lâ Ÿp tức, mà phải thực hiê Ÿn duyêtŸ từ đầu danh sách gă Ÿp phần tử Do vâ Ÿy ta khơng thể thực hiê Ÿn tìm kiếm nhị phân với danh sách liên kết  Mảng: Việc chèn hay xóa phần tử đầu vị trí ngẫu nhiên khác vị trí cuối chậm, phải thực nhiều thao tác dịch chuyển - Qua bảng so sánh độ phức tạp, ta thấy vị trí chèn xóa vị trí cuối thao tác mảng động đem lại kết nhanh Nhưng vị trí cịn lại, danh sách liên kết đơn dễ dàng, nhanh chóng tiện lợi mảng Vì vậy, tùy vào vị trí thao tác mục đích mà ta đưa lựa chọn phù hợp KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 5.1 Kết luận Vậy qua đề tài thao tác chèn xóa phần tử danh sách, ta nắm khái quát khái niệm, ưu điểm, nhược điểm danh sách liên kết đơn, mảng động thuật toán cấu trúc liệu để thực thao tác chèn xóa phần tử danh sách Sau thực thi đánh giá, ta thấy việc chèn xóa phần tử danh sách liên kết đơn nhanh chóng đơn giản mảng động 5.2 Hướng phát triển - Kiểm tra xem người dùng muốn sử dụng thao tác chèn hay xóa phần tử để thực - Thuật tốn sử dụng để xây dựng loại cấu trúc liệu khác ngăn xếp, hàng đợi, đồ thị - Có thể sử dụng thuật tốn để quản lý danh sách, liệu,… 16 Đồ án lập trình tính tốn TÀI LIỆU THAM KHẢO [1] Phan Chí Tùng, Bài giảng Cấu trúc liệu, Khoa CNTT, ĐHBK-ĐHĐN, lưu hành nội [2] Danh sách liên kết đơn https://codelearn.io/learning/data-structure-and-algorithms/777654 [3] Mảng chiều cấp phát động: https://www.youtube.com/watch?v=3ZO9zd46uP0&t=2026s [4] Hàm calloc c: https://quantrimang.com/ham-calloc-trong-c-157952 [5] Hàm realloc c: https://vietjack.com/thu-vien-c/ham-realloc-trong-c.jsp [6] Mảng động: https://vimentor.com/vi/lesson/ma-ng-do-ng-1 17 Đồ án lập trình tính tốn PHỤ LỤC Danh sách liên kết đơn: #include #include struct node { int data; struct node *next; }; typedef struct node *NODE; NODE create(NODE L) { L=NULL; } NODE Create_Node(int value) { NODE temp; temp=(NODE)malloc(sizeof(NODE)); temp->next=NULL; temp->data=value; return temp; } NODE Add_Tail(NODE L, int value) { NODE temp,p; temp=Create_Node(value); if(L==NULL) { L=temp; } else { p=L; while(p->next!=NULL) { p=p->next; } p->next=temp; 18 Đồ án lập trình tính tốn } return L; } NODE Add_Head(NODE L, int value) { NODE temp=Create_Node(value); if(L==NULL) { L=temp; } else { temp->next=L; L=temp; } return L; } NODE Insert(NODE L, int value, int position) { if(position==1||L==NULL) { L=Add_Head(L,value); } else { int k = 2; NODE p=L; while(p!=NULL&&k!=position) { p=p->next; ++k; } if(k!=position) { L=Add_Tail(L,value); } else { 19 Đồ án lập trình tính tốn NODE temp=Create_Node(value); temp->next=p->next; p->next=temp; } } return L; } NODE De_Head(NODE L) { if(L == NULL) { return; } else { L=L->next; } return L; } NODE De_Tail(NODE L) { if(L==NULL||L->next==NULL) { return De_Head(L); } NODE p=L; while(p->next->next!=NULL) { p=p->next; } p->next=p->next->next; return L; } NODE Delete(NODE L, int position) { if(position==1||L==NULL||L->next==NULL) L=De_Head(L); else { int k = 2; 20 Đồ án lập trình tính tốn NODE p = L; while(p->next->next!=NULL&&k!=position) { p=p->next; ++k; } if(k!=position) { L=De_Tail(L); } else { p->next=p->next->next; } } return L; } void display(NODE L) { NODE p; p=L; while(p!=NULL) { printf("%d ",p->data); p=p->next; } } int main() { NODE L=create(L); int n,i,v,k; char c; printf("%25s========================================= ====================\n"," "); printf("%25s|%22s%-37s|\n"," "," ","BANG LUA CHON"); printf("%25s========================================= ====================\n"," "); printf("%25s|*****%44s*****|\n"," NHAP VA CHEN PHAN TU TRONG DANH SACH"); ","CHUONG TRINH 21 Đồ án lập trình tính tốn printf("%25s| |\n"," "); printf("%25s|Nhap|%-54s|\n"," ","Thuc hien"); printf("%25s| |\n"," "); printf("%25s|%4s|%-54s|\n"," ","I","Chen them phan tu v vao vi tri thu i danh sach"); printf("%25s|%4s|%-54s|\n"," ","D","Xoa phan tu o vi tri thi i danh sach"); printf("%25s| |\n"," "); printf("Nhap so thao tac n "); scanf("%d",&n); printf("Bat dau nhap lua chon \n"); for(k=0;kvitri-1;i ) { a[i]=a[i-1]; } a[vitri-1]=giatri; n++; } void Delete(int *a,int &n,int vitri) { int i; realloc(a,(n-1)*sizeof(int)); if(vitri>n+1) printf("khong ton them!"); for(i=vitri-1;i

Ngày đăng: 03/07/2023, 15:27

Xem thêm:

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w