三、双链表

来源:互联网 发布:单片机wifi通信编程 编辑:程序博客网 时间:2024/06/05 22:37

    • 序言
      • 双链表表示
      • 初始化
      • 获取指定节点
      • 添加
      • 删除
      • 销毁

序言

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

双链表表示

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 endbool 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

原创粉丝点击