三、双链表

序言

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。 所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。

双链表表示

typedef struct DNode {
    struct DNode *next;
    struct DNode *pre;
    ELEMENT data;
} DNode, *PDNode;

初始化

void init_dlist(PDNode *pHead) {
    *pHead = malloc(sizeof(DNode));
    if (*pHead == NULL) {
   
   /* 存儲分配失敗 */
        exit(OVERFLOW);
    }
    (*pHead)->next = NULL;
    (*pHead)->pre = NULL;
};

获取指定节点

int get_length_dlist(PDNode pHead) {
    PDNode tempHead = pHead;
    int count = 0;
    while (tempHead != NULL) {
        tempHead = tempHead->next;
        count++;
    }
    return count;
};

添加

找到pos-1在pos位置插入.图解

//add to list end
bool insert_element_dlist(PDNode pHead, int pos, ELEMENT data) {
    PDNode tempHead = pHead;
    if (pos < 1 || pos > get_length_dlist(tempHead)) {
        return false;
    }
    if (pos == 1) { //链表没有0位置.要找的是pos-1位置插入.所以pos==1特殊处理
        PDNode newNode = malloc(sizeof(DNode));
        newNode->next = tempHead->next;
        newNode->data = data;
        tempHead->next = newNode;
        newNode->pre = tempHead;
        return true;
    }
    tempHead = get_element_dlist(tempHead, pos - 1);
    PDNode newNode = malloc(sizeof(DNode));
    newNode->data = data;
    newNode->pre = tempHead;
    newNode->next = tempHead->next;
    tempHead->next = newNode;
    return true;
};

删除

找到pos-1的位置.删除pos



bool del_element_dlist(PDNode pHead, int pos, ELEMENT *data) {
    PDNode tempHead = pHead;
    if (pos < 1 || pos > get_length_dlist(tempHead) + 1) {
        return false;
    }
    if (pos == 1) {
        PDNode freeNode = tempHead->next;
        if (freeNode == NULL) {
            return false;
        }
        freeNode->pre->next = freeNode->next;
        if (freeNode->next == NULL) {
            return false;
        }
        freeNode->next->pre = freeNode->pre;
        return true;
    }
    tempHead = get_element_dlist(tempHead, pos - 1);
    if (tempHead == NULL) {
        return false;
    }
    PDNode freeNode = tempHead->next;
    *data = freeNode->data;
    freeNode->pre->next = freeNode->next;
    if (freeNode->next != NULL) {
        freeNode->next->pre = tempHead;
    }

    free(freeNode);
    return true;
}

销毁


void destroy_dlist(PDNode *pHead) {
    PDNode q, p = (*pHead)->next; /* p指向第一个结点 */
    while (p != *pHead) /* p没到表头 */
    {
        q = p->next;
        free(p);
        p = q;
    }
    free(*pHead);
};

打印

void print_dlist(PDNode pHead) {
    PDNode tempNode = pHead->next;
    while (tempNode != NULL) {
        printf("%d", tempNode->data);
        tempNode = tempNode->next;

    }
};

github:
https://github.com/HumorSmith/DataStructure/tree/master/link_list

引用:
http://blog.csdn.net/qq490691606/article/details/49948263

猜你喜欢

转载自blog.csdn.net/aa375809600/article/details/72566427