Download as pdf or txt
Download as pdf or txt
You are on page 1of 26

Chương 2

DANH SÁCH
• Danh sách: là một dãy các phần tử
• n: số phần tử của danh sách
• Danh sách rỗng: danh sách không có
phần tử nào cả, tức n=0
Danh sách là khái niệm thường gặp trong
thực tế, như danh sách sinh viên trong một
lớp, danh sách nhân viên của một công ty…
Chương 2
DANH SÁCH
Có 2 cách cơ bản biểu diễn danh sách:
• Danh sách đặc: các phần tử được lưu trữ
kế tiếp nhau trong bộ nhớ, phần tử thứ i
được lưu trữ ngay trước phần tử thứ i+1
được khai báo bởi một mảng
• Danh sách liên kết: các phần tử được lưu
trữ tại những vùng nhớ khác nhau trong
bộ nhớ, nhưng được kết nối với nhau
Chương 2
DANH SÁCH
Các thao tác thường dùng trên danh sách:
• Khởi tạo danh sách: tức là làm cho có
danh sách, nhưng là danh sách rỗng
• Kiểm tra xem danh sách có rỗng không
• Liệt kê các phần tử có trong danh sách
• Tìm kiếm phần tử trong danh sách
• Thêm phần tử vào danh sách
• Xóa phần tử ra khỏi danh sách
Chương 2
DANH SÁCH
• Sửa các thông tin của một phần tử
• Thay thế một phần tử bằng phần tử khác
• Sắp xếp thứ tự các phần tử trong danh sách
• Ghép một danh sách vào danh sách khác
• Trộn các danh sách đã có thứ tự để được một
danh sách mới cũng có thứ tự
• Tách một danh sách ra thành nhiều danh sách
Chương 2
DANH SÁCH

1.1. Danh sách đặc (mảng)


1.2. Danh sách liên kết
2.1. Danh sách đặc
Các phần tử được lưu trữ kế tiếp nhau trong bộ
nhớ, được khai báo bởi một mảng
2.1.1. Khai báo
2.1.2. Nhập danh sách
2.1.3. Xuất danh sách
2.1.4. Tìm kiếm phần tử
2.1.5. Thêm phần tử
2.1.6. Xóa phần tử
6
2.1.7. Sắp xếp danh sách
2.1. Danh sách đặc
2.1.1. Khai báo
Khai báo danh sách là mảng gồm n số nguyên
#define MAX 100
typedef int LIST[MAX];
LIST A;
int n;
Chương trình dành riêng vùng nhớ cho 100 số
nguyên liên tiếp cho danh sách A
Để khởi tạo danh sách A thì gán cho n=0
7
2.1. Danh sách đặc
2.1.2. Nhập danh sách

void Input(LIST A, int &n)


{
int i;
printf(“So phan tu n= “); scanf("%d“, &n);
for (i=0; i<n; i++){
printf("%2d: “, i+1);
scanf("%d“, &A[i]);
} 8
2.1. Danh sách đặc
2.1.3. Xuất danh sách

void Output(LIST A, int n)


{
int i;
for (i=0; i<n; i++)
printf("%2d: %d“, i+1, A[i]);
}

9
2.1. Danh sách đặc
2.1.4. Tìm kiếm phần tử
Trả về chỉ số của phần tử x đầu tiên, không có
thì trả về -1
int Search (int x, LIST A, int n)
{
int i=0;
while (i<n && A[i]!=x) i++;
if (i == n) i = -1;
return i;
} 10
2.1. Danh sách đặc
2.1.5. Thêm phần tử
Thêm phần tử x vào vị trí thứ i trong danh sách
int Insert (int x, int i, LIST A, int &n)
{
int j;
for (j=n; j>i; j--) A[j]=A[j-1];
A[i]=x;
n++;
}
11
2.1. Danh sách đặc
2.1.6. Xóa phần tử
Xóa phần tử thứ i bằng cách loại ra khỏi danh
sách
int Remove(int i, LIST A, int &n)
{
int j=0;
for (j=i; j<n-1; j++) A[j]=A[j+1];
n--;
}
12
2.1. Danh sách đặc
2.1.7. Sắp xếp danh sách
Sắp xếp danh sách theo thứ tự tăng dần
void Sort (LIST A, int n)
{
int i, j, temp;
for (i=0; i<n-1; i++)
for (j=i+1; j<n; j++)
if ( A[j] < A[i]){
temp= A[i]; A[i]=A[j]; A[j]=temp;
} 13
2.2. Danh sách liên kết

2.2.1. Danh sách liên kết đơn (một chiều)


2.2.2. Danh sách liên kết kép (hai chiều)
2.2.3. Danh sách đa liên kết

14
2.2.1 Danh sách liên kết đơn
• Khai báo
• Khởi tạo danh sách rỗng
• Kiểm tra danh sách rỗng
• Xuất danh sách
• Thêm phần tử vào đầu danh sách
• Nối hai danh sách
• Tìm phần tử trong danh sách
• Xóa phần tử 15
2.2.1.Danh sách liên kết đơn
• Khai báo

typedef struct pt{


int data;
struct pt *next;
} phantu;

16
2.2.1.Danh sách liên kết đơn
• Khởi tạo và kiểm tra danh sách rỗng
int setEmpty(phantu *L)
{
L=NULL;
}

int isEmpty(phantu *L)


{
return L==NULL; 17
2.2.1.Danh sách liên kết đơn
• Xuất danh sách
void InDS(phantu *L)
{
phantu *p = L;
while (p!=NULL){
printf (“\n%d”, p->data);
p=p->next;
}
18
2.2.1.Danh sách liên kết đơn
• Thêm phần tử x vào đầu danh sách

19
2.2.1.Danh sách liên kết đơn
• Thêm phần tử x vào đầu danh sách
void Insert (int x, phantu *L)
{
phantu *p;
p=(phantu *) malloc(sizeof(phantu));
p->data=x;
p->next=L;
L=p;
20
2.2.1.Danh sách liên kết đơn

21
2.2.1.Danh sách liên kết đơn
• Thêm phần tử x vào sau q
void Insert (int x, phantu *q, phantu *L)
{
phantu *p;
p=(phantu *) malloc(sizeof(phantu));
p->data=x;
p->next=q->next;
q->next=p;
22
2.2.1.Danh sách liên kết đơn
• Nối hai danh sách thành một danh sách mới
void Concatenate (phantu *L1 phantu *L2,
phantu *L)
{
phantu *p;
L=L1;
p=L; while (p->next!=NULL) p=p->next;
p->next=L2;
23
}
2.2.1.Danh sách liên kết đơn
• Tìm phần tử x và trả về con trỏ chỉ đến nó
phantu * Search(int x, phantu *L)
{
phantu *p;
p=L;
while (p!=NULL && p->data!=x)
p=p->next;
return p;
24
2.2.1.Danh sách liên kết đơn
• Loại phần tử sau p ra khỏi danh sách

void Remove (phantu *p, phantu *L)


{
p->next=p->next->next;
}
25
2.2.1.Danh sách liên kết đơn
• Sắp xếp danh sách tăng dần
void Sort (phantu *L){
phantu *p, *q;
p=L;
while (p-->next!=NULL){
q=p->next;
while (q!=NULL){
if (q->data<p->data)
Swap(q->data,p->data);
q=q->next;
}
p=p->next;
26
}

You might also like