C语言双向链表快速入门教程

链表的声明

double_linked_list.h

c 复制代码
#ifndef ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H
#define ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

// 双向链表的节点
typedef struct doubleLinkedListNode {
    int data;
    struct doubleLinkedListNode *next; // 下一个节点
    struct doubleLinkedListNode *prev; // 上一个节点
} DoubleLinkedListNode;

// 双向链表
typedef struct doubleLinkedList {
    DoubleLinkedListNode *head; // 头节点
    DoubleLinkedListNode *tail; // 尾节点
} DoubleLinkedList;

#endif //ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

创建双向链表

double_linked_list.h

c 复制代码
#ifndef ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H
#define ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

// 双向链表的节点
typedef struct doubleLinkedListNode {
    int data;
    struct doubleLinkedListNode *next; // 下一个节点
    struct doubleLinkedListNode *prev; // 上一个节点
} DoubleLinkedListNode;

// 双向链表
typedef struct doubleLinkedList {
    DoubleLinkedListNode head; // 头节点
    DoubleLinkedListNode tail; // 尾节点
} DoubleLinkedList;

#endif //ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

double_linked_list.c

c 复制代码
#include "double_linked_list.h"

// 创建头节点
DoubleLinkedListNode *_newDoubleLinkedListNode(int value) {
    // 申请节点的空间
    DoubleLinkedListNode *node = malloc(sizeof(DoubleLinkedListNode));

    // 初始化
    node->next = NULL;
    node->prev = NULL;
    node->data = value;

    // 返回
    return node;
}

// 创建双向链表
DoubleLinkedList *newDoubleLinkedList() {
    // 申请链表的内存
    DoubleLinkedList *list = malloc(sizeof(DoubleLinkedList));

    // 头节点
    DoubleLinkedListNode *head = _newDoubleLinkedListNode(0);

    // 尾结点
    DoubleLinkedListNode *tail = _newDoubleLinkedListNode(0);

    // 初始化
    list->head = head;
    list->tail = tail;

    // 返回
    return list;
}

释放双向链表内存

核心代码:

c 复制代码
void freeDoubleLinkedList(DoubleLinkedList *list) {
    // 释放节点内存
    DoubleLinkedListNode *node = list->head->next;
    while (node->next != list->tail) {
        DoubleLinkedListNode *next = node->next;
        free(node);
        node = next;
    }
    // 释放首尾节点的内存
    free(list->head);
    free(list->tail);
    // 释放链表内存
    free(list);
}

double_linked_list.h

c 复制代码
#ifndef ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H
#define ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

// 双向链表的节点
typedef struct doubleLinkedListNode {
    int data;
    struct doubleLinkedListNode *next; // 下一个节点
    struct doubleLinkedListNode *prev; // 上一个节点
} DoubleLinkedListNode;

// 双向链表
typedef struct doubleLinkedList {
    DoubleLinkedListNode *head; // 头节点
    DoubleLinkedListNode *tail; // 尾节点
} DoubleLinkedList;

extern DoubleLinkedList *newDoubleLinkedList(); // 创建双向链表
extern void freeDoubleLinkedList(DoubleLinkedList *list); // 释放双向链表内存

#endif //ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

double_linked_list.c

c 复制代码
#include "double_linked_list.h"

// 创建头节点
DoubleLinkedListNode *_newDoubleLinkedListNode(int value) {
    // 申请节点的空间
    DoubleLinkedListNode *node = malloc(sizeof(DoubleLinkedListNode));

    // 初始化
    node->next = NULL;
    node->prev = NULL;
    node->data = value;

    // 返回
    return node;
}

// 创建双向链表
DoubleLinkedList *newDoubleLinkedList() {
    // 申请链表的内存
    DoubleLinkedList *list = malloc(sizeof(DoubleLinkedList));

    // 头节点
    DoubleLinkedListNode *head = _newDoubleLinkedListNode(0);

    // 尾结点
    DoubleLinkedListNode *tail = _newDoubleLinkedListNode(0);

    // 初始化
    list->head = head;
    list->tail = tail;

    // 返回
    return list;
}

// 释放双向链表内存
void freeDoubleLinkedList(DoubleLinkedList *list) {
    // 释放节点内存
    DoubleLinkedListNode *node = list->head->next;
    while (node->next != list->tail) {
        DoubleLinkedListNode *next = node->next;
        free(node);
        node = next;
    }
    // 释放首尾节点的内存
    free(list->head);
    free(list->tail);
    // 释放链表内存
    free(list);
}

判断链表是否为空

核心代码:

c 复制代码
int isEmptyDoubleLinkedList(DoubleLinkedList *list) {
    return list != NULL && list->head->next == list->tail;
}

优化创建链表的代码,让头节点下一个节点指向尾节点,尾节点的上一个节点指向头节点。

c 复制代码
DoubleLinkedList *newDoubleLinkedList() {
    // 申请链表的内存
    DoubleLinkedList *list = malloc(sizeof(DoubleLinkedList));

    // 头节点
    DoubleLinkedListNode *head = newDoubleLinkedListNode(0);

    // 尾结点
    DoubleLinkedListNode *tail = newDoubleLinkedListNode(0);

    // 初始化
    list->head = head;
    list->tail = tail;

    // 关系
    list->head->next = list->tail;
    list->tail->prev = list->head;

    // 返回
    return list;
}

double_linked_list.h

c 复制代码
#ifndef ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H
#define ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

// 双向链表的节点
typedef struct doubleLinkedListNode {
    int data;
    struct doubleLinkedListNode *next; // 下一个节点
    struct doubleLinkedListNode *prev; // 上一个节点
} DoubleLinkedListNode;

// 双向链表
typedef struct doubleLinkedList {
    DoubleLinkedListNode *head; // 头节点
    DoubleLinkedListNode *tail; // 尾节点
} DoubleLinkedList;

extern DoubleLinkedList *newDoubleLinkedList(); // 创建双向链表
extern void freeDoubleLinkedList(DoubleLinkedList *list); // 释放双向链表内存
extern int isEmptyDoubleLinkedList(DoubleLinkedList *list); // 判断是否为空链表

#endif //ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

double_linked_list.c

c 复制代码
#include "double_linked_list.h"

// 创建头节点
DoubleLinkedListNode *newDoubleLinkedListNode(int value) {
    // 申请节点的空间
    DoubleLinkedListNode *node = malloc(sizeof(DoubleLinkedListNode));

    // 初始化
    node->next = NULL;
    node->prev = NULL;
    node->data = value;

    // 返回
    return node;
}

// 创建双向链表
DoubleLinkedList *newDoubleLinkedList() {
    // 申请链表的内存
    DoubleLinkedList *list = malloc(sizeof(DoubleLinkedList));

    // 头节点
    DoubleLinkedListNode *head = newDoubleLinkedListNode(0);

    // 尾结点
    DoubleLinkedListNode *tail = newDoubleLinkedListNode(0);

    // 初始化
    list->head = head;
    list->tail = tail;

    // 关系
    list->head->next = list->tail;
    list->tail->prev = list->head;

    // 返回
    return list;
}

// 释放双向链表内存
void freeDoubleLinkedList(DoubleLinkedList *list) {
    // 释放节点内存
    DoubleLinkedListNode *node = list->head->next;
    while (node->next != list->tail) {
        DoubleLinkedListNode *next = node->next;
        free(node);
        node = next;
    }
    // 释放首尾节点的内存
    free(list->head);
    free(list->tail);
    // 释放链表内存
    free(list);
}

// 判断是否为空链表
int isEmptyDoubleLinkedList(DoubleLinkedList *list) {
    return list != NULL && list->head->next == list->tail;
}

获取链表的元素个数

给双向链表的结构加上size这个属性,每个新增的时候,这个数都+1,每次删除的时候都-1,这样这个属性的值代表的就是链表中元素的个数。

核心代码:

c 复制代码
int sizeDoubleLinkedList(DoubleLinkedList *list) {
    return list->size;
}

double_linked_list.h

c 复制代码
#ifndef ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H
#define ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

// 双向链表的节点
typedef struct doubleLinkedListNode {
    int data;
    struct doubleLinkedListNode *next; // 下一个节点
    struct doubleLinkedListNode *prev; // 上一个节点
} DoubleLinkedListNode;

// 双向链表
typedef struct doubleLinkedList {
    DoubleLinkedListNode *head; // 头节点
    DoubleLinkedListNode *tail; // 尾节点
    int size; // 节点的个数
} DoubleLinkedList;

extern DoubleLinkedList *newDoubleLinkedList(); // 创建双向链表
extern void freeDoubleLinkedList(DoubleLinkedList *list); // 释放双向链表内存
extern int isEmptyDoubleLinkedList(DoubleLinkedList *list); // 判断是否为空链表
extern int sizeDoubleLinkedList(DoubleLinkedList *list); // 获取链表的元素个数

#endif //ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

double_linked_list.c

c 复制代码
#include "double_linked_list.h"

// 创建头节点
DoubleLinkedListNode *newDoubleLinkedListNode(int value) {
    // 申请节点的空间
    DoubleLinkedListNode *node = malloc(sizeof(DoubleLinkedListNode));

    // 初始化
    node->next = NULL;
    node->prev = NULL;
    node->data = value;

    // 返回
    return node;
}

// 创建双向链表
DoubleLinkedList *newDoubleLinkedList() {
    // 申请链表的内存
    DoubleLinkedList *list = malloc(sizeof(DoubleLinkedList));

    // 头节点
    DoubleLinkedListNode *head = newDoubleLinkedListNode(0);

    // 尾结点
    DoubleLinkedListNode *tail = newDoubleLinkedListNode(0);

    // 初始化
    list->head = head;
    list->tail = tail;
    list->size = 0;

    // 关系
    list->head->next = list->tail;
    list->tail->prev = list->head;

    // 返回
    return list;
}

// 释放双向链表内存
void freeDoubleLinkedList(DoubleLinkedList *list) {
    // 释放节点内存
    DoubleLinkedListNode *node = list->head->next;
    while (node->next != list->tail) {
        DoubleLinkedListNode *next = node->next;
        free(node);
        node = next;
    }
    // 释放首尾节点的内存
    free(list->head);
    free(list->tail);
    // 释放链表内存
    free(list);
}

// 判断是否为空链表
int isEmptyDoubleLinkedList(DoubleLinkedList *list) {
    return list != NULL && list->head->next == list->tail;
}

// 获取链表的元素个数
int sizeDoubleLinkedList(DoubleLinkedList *list) {
    return list->size;
}

打印链表的内容

核心代码:

c 复制代码
void printDoubleLinkedList(DoubleLinkedList *list) {
    if (list == NULL) {
        return;
    }
    if (list->head == NULL || list->head->next == NULL) {
        return;
    }
    DoubleLinkedListNode *current = list->head->next;
    while (current != list->tail) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

double_linked_list.h

c 复制代码
#ifndef ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H
#define ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

// 双向链表的节点
typedef struct doubleLinkedListNode {
    int data;
    struct doubleLinkedListNode *next; // 下一个节点
    struct doubleLinkedListNode *prev; // 上一个节点
} DoubleLinkedListNode;

// 双向链表
typedef struct doubleLinkedList {
    DoubleLinkedListNode *head; // 头节点
    DoubleLinkedListNode *tail; // 尾节点
    int size; // 节点的个数
} DoubleLinkedList;

extern DoubleLinkedList *newDoubleLinkedList(); // 创建双向链表
extern void freeDoubleLinkedList(DoubleLinkedList *list); // 释放双向链表内存
extern int isEmptyDoubleLinkedList(DoubleLinkedList *list); // 判断是否为空链表
extern int sizeDoubleLinkedList(DoubleLinkedList *list); // 获取链表的元素个数
extern void printDoubleLinkedList(DoubleLinkedList *list); // 打印链表的内容

#endif //ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

double_linked_list.c

c 复制代码
#include "double_linked_list.h"

// 创建头节点
DoubleLinkedListNode *newDoubleLinkedListNode(int value) {
    // 申请节点的空间
    DoubleLinkedListNode *node = malloc(sizeof(DoubleLinkedListNode));

    // 初始化
    node->next = NULL;
    node->prev = NULL;
    node->data = value;

    // 返回
    return node;
}

// 创建双向链表
DoubleLinkedList *newDoubleLinkedList() {
    // 申请链表的内存
    DoubleLinkedList *list = malloc(sizeof(DoubleLinkedList));

    // 头节点
    DoubleLinkedListNode *head = newDoubleLinkedListNode(0);

    // 尾结点
    DoubleLinkedListNode *tail = newDoubleLinkedListNode(0);

    // 初始化
    list->head = head;
    list->tail = tail;
    list->size = 0;

    // 关系
    list->head->next = list->tail;
    list->tail->prev = list->head;

    // 返回
    return list;
}

// 释放双向链表内存
void freeDoubleLinkedList(DoubleLinkedList *list) {
    // 释放节点内存
    DoubleLinkedListNode *node = list->head->next;
    while (node->next != list->tail) {
        DoubleLinkedListNode *next = node->next;
        free(node);
        node = next;
    }
    // 释放首尾节点的内存
    free(list->head);
    free(list->tail);
    // 释放链表内存
    free(list);
}

// 判断是否为空链表
int isEmptyDoubleLinkedList(DoubleLinkedList *list) {
    return list != NULL && list->head->next == list->tail;
}

// 获取链表的元素个数
int sizeDoubleLinkedList(DoubleLinkedList *list) {
    return list->size;
}

// 打印链表的内容
void printDoubleLinkedList(DoubleLinkedList *list) {
    if (list == NULL) {
        return;
    }
    if (list->head == NULL || list->head->next == NULL) {
        return;
    }
    DoubleLinkedListNode *current = list->head->next;
    while (current != list->tail) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

添加元素到链表末尾

核心代码:

c 复制代码
void appendDoubleLinkedList(DoubleLinkedList *list, int value) {
    if (list == NULL || list->head == NULL || list->tail == NULL) {
        return;
    }

    // 构造新节点
    DoubleLinkedListNode *node = newDoubleLinkedListNode(value);

    // 插入到末尾
    DoubleLinkedListNode *oldPrev = list->tail->prev;
    oldPrev->next = node;
    node->prev = oldPrev;
    node->next = list->tail;
    list->tail->prev = node;

    // 元素个数增加
    list->size++;
}

double_linked_list.h

c 复制代码
#ifndef ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H
#define ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

// 双向链表的节点
typedef struct doubleLinkedListNode {
    int data;
    struct doubleLinkedListNode *next; // 下一个节点
    struct doubleLinkedListNode *prev; // 上一个节点
} DoubleLinkedListNode;

// 双向链表
typedef struct doubleLinkedList {
    DoubleLinkedListNode *head; // 头节点
    DoubleLinkedListNode *tail; // 尾节点
    int size; // 节点的个数
} DoubleLinkedList;

extern DoubleLinkedList *newDoubleLinkedList(); // 创建双向链表
extern void freeDoubleLinkedList(DoubleLinkedList *list); // 释放双向链表内存
extern int isEmptyDoubleLinkedList(DoubleLinkedList *list); // 判断是否为空链表
extern int sizeDoubleLinkedList(DoubleLinkedList *list); // 获取链表的元素个数
extern void printDoubleLinkedList(DoubleLinkedList *list); // 打印链表的内容
extern void appendDoubleLinkedList(DoubleLinkedList *list, int value); // 将元素添加到链表末尾

#endif //ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

double_linked_list.c

c 复制代码
#include "double_linked_list.h"

// 创建头节点
DoubleLinkedListNode *newDoubleLinkedListNode(int value) {
    // 申请节点的空间
    DoubleLinkedListNode *node = malloc(sizeof(DoubleLinkedListNode));

    // 初始化
    node->next = NULL;
    node->prev = NULL;
    node->data = value;

    // 返回
    return node;
}

// 创建双向链表
DoubleLinkedList *newDoubleLinkedList() {
    // 申请链表的内存
    DoubleLinkedList *list = malloc(sizeof(DoubleLinkedList));

    // 头节点
    DoubleLinkedListNode *head = newDoubleLinkedListNode(0);

    // 尾结点
    DoubleLinkedListNode *tail = newDoubleLinkedListNode(0);

    // 初始化
    list->head = head;
    list->tail = tail;
    list->size = 0;

    // 关系
    list->head->next = list->tail;
    list->tail->prev = list->head;

    // 返回
    return list;
}

// 释放双向链表内存
void freeDoubleLinkedList(DoubleLinkedList *list) {
    // 释放节点内存
    DoubleLinkedListNode *node = list->head->next;
    while (node->next != list->tail) {
        DoubleLinkedListNode *next = node->next;
        free(node);
        node = next;
    }
    // 释放首尾节点的内存
    free(list->head);
    free(list->tail);
    // 释放链表内存
    free(list);
}

// 判断是否为空链表
int isEmptyDoubleLinkedList(DoubleLinkedList *list) {
    return list != NULL && list->head->next == list->tail;
}

// 获取链表的元素个数
int sizeDoubleLinkedList(DoubleLinkedList *list) {
    return list->size;
}

// 打印链表的内容
void printDoubleLinkedList(DoubleLinkedList *list) {
    if (list == NULL) {
        return;
    }
    if (list->head == NULL || list->head->next == NULL) {
        return;
    }
    DoubleLinkedListNode *current = list->head->next;
    while (current != list->tail) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

// 将元素添加到链表末尾
void appendDoubleLinkedList(DoubleLinkedList *list, int value) {
    if (list == NULL || list->head == NULL || list->tail == NULL) {
        return;
    }

    // 构造新节点
    DoubleLinkedListNode *node = newDoubleLinkedListNode(value);

    // 插入到末尾
    DoubleLinkedListNode *oldPrev = list->tail->prev;
    oldPrev->next = node;
    node->prev = oldPrev;
    node->next = list->tail;
    list->tail->prev = node;

    // 元素个数增加
    list->size++;
}

main.c

c 复制代码
#include "double_linked_list.h"

int main(void) {
    // 创建链表
    DoubleLinkedList *list = newDoubleLinkedList();

    // 添加数据
    appendDoubleLinkedList(list, 11);
    printDoubleLinkedList(list);

    appendDoubleLinkedList(list, 22);
    printDoubleLinkedList(list);

    appendDoubleLinkedList(list, 33);
    printDoubleLinkedList(list);

    // 释放链表
    freeDoubleLinkedList(list);

    return 0;
}

输出:

bash 复制代码
11
11 22
11 22 33

移除元素

核心代码:

c 复制代码
int removeDoubleLinkedList(DoubleLinkedList *list, int value) {
    int index = -1;
    if (list == NULL || list->head == NULL || list->tail == NULL || list->size <= 0) {
        return index;
    }

    // 查找对应的元素
    DoubleLinkedListNode *current = list->head->next;
    while (current != list->tail) {
        index++;
        if (current->data == value) {
            break;
        }
        current = current->next;
    }

    // 如果找到了,则删除
    if (index >= 0 && index < list->size) {
        DoubleLinkedListNode *oldPrev = current->prev;
        DoubleLinkedListNode *oldNext = current->next;
        oldPrev->next = oldNext;
        oldNext->prev = oldPrev;
        free(current); // 记得释放节点的内存
    }

    // 元素个数减少
    list->size--;

    // 返回
    return index;
}

double_linked_list.h

c 复制代码
#ifndef ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H
#define ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

// 双向链表的节点
typedef struct doubleLinkedListNode {
    int data;
    struct doubleLinkedListNode *next; // 下一个节点
    struct doubleLinkedListNode *prev; // 上一个节点
} DoubleLinkedListNode;

// 双向链表
typedef struct doubleLinkedList {
    DoubleLinkedListNode *head; // 头节点
    DoubleLinkedListNode *tail; // 尾节点
    int size; // 节点的个数
} DoubleLinkedList;

extern DoubleLinkedList *newDoubleLinkedList(); // 创建双向链表
extern void freeDoubleLinkedList(DoubleLinkedList *list); // 释放双向链表内存
extern int isEmptyDoubleLinkedList(DoubleLinkedList *list); // 判断是否为空链表
extern int sizeDoubleLinkedList(DoubleLinkedList *list); // 获取链表的元素个数
extern void printDoubleLinkedList(DoubleLinkedList *list); // 打印链表的内容
extern void appendDoubleLinkedList(DoubleLinkedList *list, int value); // 将元素添加到链表末尾
extern int removeDoubleLinkedList(DoubleLinkedList *list, int value); // 从链表中移除元素,成功返回其索引,失败返回-1

#endif //ZDPC_ALGORITHM_DEV_DOUBLE_LINKED_LIST_H

double_linked_list.c

c 复制代码
#include "double_linked_list.h"

// 创建头节点
DoubleLinkedListNode *newDoubleLinkedListNode(int value) {
    // 申请节点的空间
    DoubleLinkedListNode *node = malloc(sizeof(DoubleLinkedListNode));

    // 初始化
    node->next = NULL;
    node->prev = NULL;
    node->data = value;

    // 返回
    return node;
}

// 创建双向链表
DoubleLinkedList *newDoubleLinkedList() {
    // 申请链表的内存
    DoubleLinkedList *list = malloc(sizeof(DoubleLinkedList));

    // 头节点
    DoubleLinkedListNode *head = newDoubleLinkedListNode(0);

    // 尾结点
    DoubleLinkedListNode *tail = newDoubleLinkedListNode(0);

    // 初始化
    list->head = head;
    list->tail = tail;
    list->size = 0;

    // 关系
    list->head->next = list->tail;
    list->tail->prev = list->head;

    // 返回
    return list;
}

// 释放双向链表内存
void freeDoubleLinkedList(DoubleLinkedList *list) {
    // 释放节点内存
    DoubleLinkedListNode *node = list->head->next;
    while (node->next != list->tail) {
        DoubleLinkedListNode *next = node->next;
        free(node);
        node = next;
    }
    // 释放首尾节点的内存
    free(list->head);
    free(list->tail);
    // 释放链表内存
    free(list);
}

// 判断是否为空链表
int isEmptyDoubleLinkedList(DoubleLinkedList *list) {
    return list != NULL && list->head->next == list->tail;
}

// 获取链表的元素个数
int sizeDoubleLinkedList(DoubleLinkedList *list) {
    return list->size;
}

// 打印链表的内容
void printDoubleLinkedList(DoubleLinkedList *list) {
    if (list == NULL) {
        return;
    }
    if (list->head == NULL || list->head->next == NULL) {
        return;
    }
    DoubleLinkedListNode *current = list->head->next;
    while (current != list->tail) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

// 将元素添加到链表末尾
void appendDoubleLinkedList(DoubleLinkedList *list, int value) {
    if (list == NULL || list->head == NULL || list->tail == NULL) {
        return;
    }

    // 构造新节点
    DoubleLinkedListNode *node = newDoubleLinkedListNode(value);

    // 插入到末尾
    DoubleLinkedListNode *oldPrev = list->tail->prev;
    oldPrev->next = node;
    node->prev = oldPrev;
    node->next = list->tail;
    list->tail->prev = node;

    // 元素个数增加
    list->size++;
}

// 从链表中移除元素
int removeDoubleLinkedList(DoubleLinkedList *list, int value) {
    int index = -1;
    if (list == NULL || list->head == NULL || list->tail == NULL || list->size <= 0) {
        return index;
    }

    // 查找对应的元素
    DoubleLinkedListNode *current = list->head->next;
    while (current != list->tail) {
        index++;
        if (current->data == value) {
            break;
        }
        current = current->next;
    }

    // 如果找到了,则删除
    if (index >= 0 && index < list->size) {
        DoubleLinkedListNode *oldPrev = current->prev;
        DoubleLinkedListNode *oldNext = current->next;
        oldPrev->next = oldNext;
        oldNext->prev = oldPrev;
        free(current); // 记得释放节点的内存
    }

    // 元素个数减少
    list->size--;

    // 返回
    return index;
}

main.c

c 复制代码
#include "double_linked_list.h"

int main(void) {
    // 创建链表
    DoubleLinkedList *list = newDoubleLinkedList();

    // 添加数据
    appendDoubleLinkedList(list, 11);
    appendDoubleLinkedList(list, 22);
    appendDoubleLinkedList(list, 33);
    printDoubleLinkedList(list);
    printf("元素个数:%d\n",list->size);

    // 删除数据
    removeDoubleLinkedList(list,22);
    printDoubleLinkedList(list);
    printf("元素个数:%d\n",list->size);

    // 释放链表
    freeDoubleLinkedList(list);

    return 0;
}

输出:

bash 复制代码
11 22 33
元素个数:3
11 33
元素个数:2
相关推荐
阿尼卡~8 小时前
VS Code 配置 C 语言开发环境(Windows 10/11):从 GCC 安装到运行、断点调试,一篇搞定
c语言·开发语言·windows
liyi_hz200812 小时前
O2OA(翱途) V10.1 即将发布|功能再升级,安全再加固,协同更高效!
java·javascript·windows·开源软件
七牛云行业应用14 小时前
DeepSeek Harness(dsh)安装完整指南:Windows、macOS、Linux 三平台 + 桌面端与 Web 端全覆盖
linux·windows·macos·ai·ai编程
从小白到软工16 小时前
5-2 从查表到控件:造按钮
c语言·开发语言·数据结构·经验分享·ai编程
水饺编程16 小时前
第2章:Linux 基础,解压缩【.tar.gz】压缩包
linux·c语言·汇编
cu14316 小时前
细谈IT6653的具体功能与其应用
c语言·c++·单片机·嵌入式硬件
夏虫不可与之言冰17 小时前
RMT 与 WS2812 灯带:可寻址 RGB 全彩控制
c语言·c++·单片机·物联网·visual studio
起个名字都难啊17 小时前
visual studio C/C++空项目修改为CUDA c++
c++·windows·visual studio
羊锦磊17 小时前
嵌入式基础1
c语言·c++·gnu
唐青枫18 小时前
C 语言 calloc() 详解:零初始化、动态数组与内存管理实战
c语言