Xem mẫu
- Danh Sách Liên Kết
Nguyễn Thanh Hiên
Danh Sách Liên Kết (Linked List)
• Gồm nhiều phần tử (gọi mỗi phần tử là
một node)
• Các phần tử nối kết với nhau thông qua
vùng liên kết
• Các phần tử được try xuất tuần tự và bao
gồm: vùng dữ liệu và các vùng liên kết
Ai
A node in a A header node
linked list A tail node
1
- Các loại danh sách liên kết
• DSLK đơn
A2 A3 AN
A1
• DSLK kép
A1 A2 A3 AN
• DSLK vòng
A2 A3 AN
A1
Các Tác Vụ
Khởi tạo (init)
•
Kiểm tra DSLK rỗng (IsEmpty)
•
Xác định kích thước (Size)
•
• Chèn (Insert)
• Xóa (Remove)
Tìm kiếm (Retrieve)
•
Thay thế (Replace)
•
Duyệt (Traverse)
•
2
- DSLK Đơn- Cấu trúc dữ liệu
• typedef struct node{
info; // T là kiểu đã định nghĩa trước
T
struct node* link; // con trỏ chỉ đến cấu trúc node
}NODE;
• T là kiểu dữ liệu cơ bản hoặc kiểu dữ liệu
tự định nghĩa
DSLK Đơn- Cấu trúc dữ liệu
• typedef struct node
{
int info;
struct node* link;
CTDL cho một
}NODE; phần tử của DS
các số nguyên
3
- DSLK Đơn- Cấu trúc dữ liệu
• typedef struct SinhVien
{
char Ten[30];
int MaSV;
}SV;
• typedef struct svNode CTDL cho một
phần tử của DS
{
các sinh viên
SV info;
struct svNode* link;
}SVNODE;
DSLK Đơn- Cấu trúc dữ liệu
• typedef struct phanso
{
int tu;
int mau;
}PS;
• typedef struct psNode CTDL cho một
phần tử của DS
{
các phân số
PS info;
struct psNode* link;
}PSNODE;
4
- DSLK Đơn- Cấu trúc dữ liệu
pTail
A2 A3 AN
A1
pHead
• typedef struct
{
NODE* pHead;
NODE* pTail;
} LIST;
DSLK Đơn- Các Tác Vụ
• Khởi tạo DS
void init (LIST &list){
list.pHead=NULL;
list.pTail=NULL;
}
5
- DSLK Đơn- Các Tác Vụ
• Tạo một Node mới cho DS
NODE* getNode(T x){
NODE* p;
p=new NODE; x
if (p==NULL)
return NULL;
p-> info = x;
p-> link=NULL;
return p;
}
DSLK Đơn- Các Tác Vụ
Chèn một phần tử vào DS
•
Chèn vào đầu (insertHead)
–
Chèn vào cuối (insertTail)
–
Chèn sau phần tử q (insertMid)
–
6
- DSLK Đơn- Các Tác Vụ
• Chèn vào đầu (insertHead)
pTail
pHead
A2 A3 AN
A1
(1)
(2)
x
newNode
DSLK Đơn- Các Tác Vụ
• Chèn vào đầu (insertHead)
void insertHead(LIST &ds, NODE* newNode)
{
if (ds.pHead==NULL) //ds rỗng
{
ds.pHead = newNode; ds.pTail = ds.pHead;
}
else
{
newNode ->link = ds.pHead;
ds.pHead = newNode;
}
}
7
- DSLK Đơn- Các Tác Vụ
• Chèn vào cuối (insertTail)
(2)
x
pTail
(1)
A2 A3 AN
A1
pHead
DSLK Đơn- Các Tác Vụ
• Chèn vào cuối (insertTail)
void insertTail(LIST &ds, NODE *newNode)
{
if (ds.pHead==NULL)
{
ds.pHead = newNode; ds.pTail = ds.pHead;
}
else
{
ds.pTail->link = newNode;
ds.pTail = newNode;
}
}
8
- DSLK Đơn- Các Tác Vụ
• Chèn sau phần tử q (insertMid)
q pTail
A2 A3 AN
A1
pHead
(2) (1)
x
DSLK Đơn- Các Tác Vụ
• Chèn sau phần tử q (insertMid)
void insertMid(LIST &ds,NODE *q, NODE* newNode)
{
if ( q!=NULL)
{
newNode ->link = q-> link;
q-> link = newNode;
if(q == ds.pTail)
ds.pTail = newNode;
}
else //chèn vào đầu danh sách
insertHead(ds, newNode);
}
9
- DSLK Đơn- Các Tác Vụ
• Tìm một phần tử trong DS
NODE * Retrieve(LIST ds, Data k)
{
NODE *p;
p = ds.pHead;
while((p!= NULL)&&(p->info != x))
p = p->link;
return p;
}
DSLK Đơn- Các Tác Vụ
Duyệt DS
•
void * Traverse(LIST ds)
{
NODE *p;
p = ds.pHead;
while(p!= NULL){
process(p);
p = p->link;
}
}
10
- DSLK Đơn- Các Tác Vụ
Xoá một phần tử
•
– Xoá phần tử đầu
– Xoá phần tử sau phần tử q
– Xoá phần tử có khoá k
DSLK Đơn- Các Tác Vụ
Xoá phần tử đầu
•
pTail
pHead
A2 A3 AN
A1
11
- DSLK Đơn- Các Tác Vụ
• Xoá phần tử đầu
Data RemoveHead(LIST &ds)
{
NODE *p;
Data x = NULLDATA;
if ( ds.pHead != NULL)
{
p = ds.pHead; x = p->info;
ds.pHead = ds.pHead->link;
delete p;
if(ds.pHead == NULL) ds.pTail = NULL;
}
return x;
}
DSLK Đơn- Các Tác Vụ
• Xoá phân ftử sau phần tử q
pTail
q p
pHead
A2 A3 AN
A1
12
- DSLK Đơn- Các Tác Vụ
• Xoá phần tử sau phần tử q
void RemoveAfter (LIST &ds, NODE *q)
{ NODE *p;
if ( q != NULL)
{
p = q ->link ;
if ( p != NULL)
{
if(p == ds.pTail) ds.pTail = q;
q->link = p->link;
delete p;
}
}
else
RemoveHead(ds);
}
DSLK Đơn- Các Tác Vụ
• Xoá phần tử có khoá k if(q != NULL)
int RemoveNode(LIST &ds, Data k) {
{ if(p == ds.pTail)
NODE *p = ds.pHead; ds.pTail = q;
NODE *q = NULL; q->link = p->link;
while( p != NULL) delete p;
{ }
if(p->info == k) break; else //p là phần tử đầu ds
q = p; p = p->link; {
} ds.pHead = p->link;
if(p == NULL) return 0; if(ds.pHead == NULL)
//Không tìm thấy k ds.pTail = NULL;
}
return 1;
}
13
- DSLK Đơn- Hủy danh sách
void ReamoveList(LIST &ds)
{ NODE *p;
while (ds.pHead!= NULL)
{
p = ds.pHead;
ds.pHead = p->link;
delete p;
}
ds.pTail = NULL;
}
DSLK Kép- Cấu trúc dữ liệu
typedef struct DNode
{
T info;
struct DNode* pPre;
struct DNode* pNext;
}DNODE;
14
- DSLK Kép- Cấu trúc dữ liệu
DNODE* GetNode(T x)
{
DNODE *p;
p = new DNODE;
if ( p==NULL) return NULL
p ->Info = x;
p->pPrev = NULL;
p->pNext = NULL;
return p;
}
DSLK Kép- Insert
Chèn đầu
•
Chèn cuối
•
Chèn sau phần tử q
•
Chèn trước phần tử q
•
15
- DSLK Kép- Insert
DSLK Kép- Insert
void Insert(DLIST &ds, DNODE* q, DNODE* newNode)
{ DNODE* p = q->pNext;
if ( q!=NULL) {
newNode->pNext = p; //(1)
newNode->pPrev = q; //(2)
q->pNext = newNode; //(3)
if(p != NULL)
p->pPrev = newNode; //(4)
if(q == ds.pTail)
ds.pTail = newNode;
}
else //chèn vào đầu danh sách
InsertHead(ds, newNode);
}
16
- DSLK Kép- Remove
Xóa đầu
•
Xóa cuối
•
Xóa sau phần tử q
•
Xóa trước phần tử q
•
• Xóa có khóa k
DSLK Kép- Remove sau q
void Remove(DLIST &ds, DNODE *q)
{ DNODE *p;
if ( q != NULL)
{
p = q ->pNext ;
if ( p != NULL)
{
q->pNext = p->pNext;
if(p == ds.pTail) ds.pTail = q;
else p->pNext->pPrev = q;
delete p;
}
}
else
RemoveHead(ds);
}
17
- STACK
Bottom_of_stack
•Danh sách hạn chế
21
(this is where the
56
•Các phần tử được
stack started)
31
thêm vào và lấy ra ở
29
đỉnh stack
Direction
179 in which
• Hiện thực dùng dslk
top
52 stack grows
hoặc array
Empty/unfilled
portion of stack
Stack – Tác vụ
typedef struct {
• Init() T *theArray;
• Push() int top;
int size;
• Pop()
}STACK;
• IsEmpty()
void init (STACK &s, int size) {
• IsFull()
s.size = size;
s.theArray = new T[size];
s.top = -1;
}
18
- Stack- Push()
void push(STACK &s, T x){
if (!isFull(s)){
s.top++;
s.theArray[s.top]=x;
}
}
bool isFull(STACK s) {
if(s.top < s.size-1) return false;
else return true;
}
Stack- Pop(), Top()
T pop(STACK &s){
if (!isEmpty(s))
return s.theArray[s.top--];
}
T top(STACK s){
return s.theArray[s.top];
}
bool isEmpty(STACK s) {
if(s.top == -1) return true;
else return false;
}
19
- Stack-Ví dụ
21 21 21 21
56 56 56 56
31 31 31 31
pop() push(2) top()
29 29 29 29
179 179 179 179
52 2 2
top
top top
Return 52 Return 2
Queue
12 31 79 5 63
front back empty portion
of the queue
Danh sách hạn chế
•
Chèn vào một đầu, lấy ra ở đầu kia
•
Hiện thực dùng dslk hoặc array
•
• Linear and Circular Queues
20
nguon tai.lieu . vn