1. 程式人生 > >資料結構(c語言)--雙向連結串列的基本操作

資料結構(c語言)--雙向連結串列的基本操作

定義一個雙向連結串列結構:

typedef struct DulNode{
    // *prior:前一個元素的地址
    // *next:後一個元素的地址
    struct DulNode *prior;
    Element data;
    struct DulNode *next;
}DulNode,*DuLinkList;

初始化一個雙向連結串列 :

DuLinkList doubleLinkedListInit(){
    DuLinkList L;
    L = (DuLinkList)malloc(sizeof(DulNode));
    L->next = NULL;
    L->prior = NULL;
}

建立一個雙向連結串列:

//尾插法
void duLinkListCreateT(DuLinkList l,int size){
    DuLinkList t;
    t = l;
    for(int i = 1; i <= size; i++){
        DuLinkList p;
        p = (DuLinkList)malloc(sizeof(DulNode));
        p->data = i;
        t->next = p;
        p->prior = t;
        t = p;
    }
    t->next = NULL;
}
// 頭插法
void duLinkListCreateH(DuLinkList l,int size){
    for(int i = 1; i <= size; i++){
        DuLinkList p;
        p = (DuLinkList)malloc(sizeof(DulNode));
        p->data = i;

        p->prior = l;
        p->next = l->next;
        if(l->next){
            l->next->prior = p;
        }
        l->next = p;
    }
}

列印輸出:

void printDuLinkList(DuLinkList l){
    DuLinkList t;
    t = l;
    printf("正向遍歷結果:[");
    while(t->next){
        t = t->next;
        printf("%d",t->data);
        if(t->next){
            printf(",");
        }
    }
    printf("]\n");

    printf("反向遍歷結果:[");
    while(t->prior&&t!=l){
        printf("%d",t->data);
        t = t->prior;
        if(t!=l){
            printf(",");
        }
    }
    printf("]\n");
}

指定位置插入

Status duLinkListInsert(DuLinkList l,int index,Element v){
    DuLinkList p,e;
    p = l->next;
    int i = 1;

    // 移到p指標到要插入位置的前一個位置
    while(p&&i<index){
        p = p->next;
        ++i;
    }
    if(!p||i>index){
        // 第index個節點不存在
        return ERROR;
    }
    e = (DuLinkList) malloc(sizeof(DulNode));
    // 設定插入節點的資料為傳遞過來的引數值
    e->data = v;

    // 將要插入節點後繼為p指標的next,前驅就是p指標
    e->next = p->next;
    e->prior = p;

    // 將原本是index位置節點的前驅指向要插入的元素
    p->next->prior = e;
    // 將p的next指向要插入的元素。
    p->next = e;

    return OK;
}

測試結果: