Home » » Danh Sach Lien Ket Don

Danh Sach Lien Ket Don

Written By 1 on Thứ Hai, 21 tháng 5, 2012 | 12:20


Ý tưởng: 
Khác với stack, queue danh sách liên kết đơn cũng là một kiểu danh sách tuyến tính gồm các phần tử vào lần lượt theo thứ tự tuy nhiên nó khác stack và queue ở chỗ là nó được cấp phát trong bộ nhớ bởi các phần tử rời rạc nhau, không nằm kề nhau, tuy nhiên giữa phần tử trước thì có 1 liên kết đến phần tử sau nó.
Thông thường thì người ta xây dựng stack, queue bằng mảng, nhưng điểm hạn chế là nó sẽ bị giới hạn về số lượng phần tử, bởi thế cách hay nhất là xây dựng stack, queue bẳng danh sách liên kết đơn ==> stack, queue là 1 danh sách liên kết đơn.

Các thao tác trên danh sách liên kết đơn(single-link list):

Định nghĩa tổng quát

struct tq {
thtin_t phantu;
struc tq*tiep;
};
typedef struct tq tq_t;

Con trỏ tới 1 node

struct  node {
        int infor;
        struct node *next;
    };
    typedef struct node *NODEPTR;

Cấp phát bộ nhớ cho 1 node

NODEPTR Getnode(void) {
    NODEPTR p;
    P = (NODEPTR) malloc(sizeof( struct node));
    Return(p);
}

Giải phóng 1 node

NODEPTR Freenode( NODEPTR p){
        free(p);
    }

Thêm phần tử vào đỉnh danh sách

void Push_Top( NODEPTR *plist, int x) {
    NODEPTR p;
    p= Getnode();
    p -> infor = x;
    p ->next = *plist;
    *plist = p;
}

Thêm node mới vào cuối danh sách

void Push_Bottom( NODEPTR *plist, int x) {
    NODEPTR p, q;
    p= Getnode(); //
    p->infor = x;
    q = *plist;
    while (q-> next != NULL)
        q = q -> next;
   
    q -> next = p;
    p ->next = NULL;
}

Thêm node mới vào giữa danh sách

void Push_Before( NODEPTR p, int x ){
    NODEPTR q;
    if (p->next==NULL)
        Push_Bottom(p, x);
    else {
        q= Getnode();
        q -> infor = x;
        q-> next = p-> next;  
        p->next = q;
    }
}

Xóa 1 node đầu danh sách

void Del_Top( NODEPTR *plist) {
    NODEPTR p;
    p = *plist;
    if (p==NULL) return;
    (*plist) = (*plist) -> next;
    p-> next = NULL;
    Freenode(p);
}

Xóa node cuối danh sách

void Del_Bottom(NODEPTR *plist) {
    NODEPTR p, q;
    if (*plist==NULL) return;
    else if ( (*plist)->next==NULL))
        Del_Top(plist);
    else {
        p = *plist;
        while (p->next!=NULL){
            q = p;
            p = p->next;
        }
        // p lµ node cuèi danh s¸ch;
        q->next =NULL;
        Freenode(p);
    }
}

Xóa node giữa danh sách

void Del_before(NODEPTR p){
    NODEPTR q;
    if (p->next==NULL) return;
    q = p ->next;
    p->next = q->next;
    Freenode(q);
}

0 nhận xét:

Đăng nhận xét