目录

C语言链表实现

实现思路

假设现在有个三节点的链表,每个节点具有两个指针:

  • prev —— 上一节点地址
  • next —— 下一节点地址

插入节点

注:虚线表示删除,D为插入的节点

按照这个图的操作应该是:

1
2
3
4
C->prev = D
D->next = C
D->prev = B
B->next = D

假设此时的链表传入的table是B,插入的node为D,那么C语言代码为:

1
2
3
4
table->next->prev = node
node->next = table->next
node->prev = table
table->next = node

删除节点

注:虚线表示删除,B为要删除的节点

按照这个图的操作应该是:

1
2
A->next = C
C->prev = A

假设此时的链表传入的table是B,那么C语言代码为:

1
2
3
table->prev->next = table->next;
table->next->prev = table->prev;
free(table)

代码实现

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int id;   //节点ID
    struct node *prev; //上节点地址
    struct node *next; //下节点地址
} node;

node *createNode(int uid);                      //创建(节点ID)
void addNode(node *table, int uid, int newUid); //增(链表,节点UID,新建节点UID)[在UID节点后插入]
void delNode(node *table, int uid);             //删(链表,节点UID)
void printTable(node *table);                   //打印(链表)

int main()
{
    node *table = createNode(0);
    addNode(table, 0, 1);
    addNode(table, 1, 2);
    addNode(table, 2, 3);
    addNode(table, 3, 4);
    addNode(table, 4, 5);
    addNode(table, 5, 6);
    delNode(table, 1);
    delNode(table, 2);
    delNode(table, 5);
    printTable(table);
    exit(0);
}

node *createNode(int uid)
{
    node *newTable = (node *)malloc(sizeof(node));
    newTable->id = uid;
    newTable->prev = NULL;
    newTable->next = NULL;
    return newTable;
}

void addNode(node *table, int uid, int newUid)
{
    while (1)
    {
        if (table == NULL)
        { //未查找到相应节点
            printf("Node %d not find!\n", uid);
            return;
        }
        if (table->id == newUid)
        { //节点ID已存在
            printf("Node %d exist!\n", newUid);
            return;
        }
        if (table->id == uid)
        { //查找到相应节点
            node *newTable = (node *)malloc(sizeof(node));
            if (table->next != NULL)
            { //如果存在下一节点
                //建立当前与下一链表的联系
                newTable->next = table->next;
                table->next->prev = newTable;
            }
            //建立当前与上一链表的联系
            table->next = newTable;
            newTable->prev = table;
            //写入当前链表ID
            newTable->id = newUid;
            return;
        }
        table = table->next;
    }
}

void delNode(node *table, int uid)
{
    while (1)
    {
        if (table == NULL)
        { //未查找到相应节点
            printf("Node %d not find!\n", uid);
            return;
        }
        if (table->id == uid)
        { //查找到相应节点
            if (table->next != NULL)
            { //如果存在下一节点
                //建立上一节点与下一节点的连接
                table->prev->next = table->next;
                table->next->prev = table->prev;
            }
            else
            { //如果不存在下一节点
                //设置上一节点的next为NULL
                table->prev->next = NULL;
            }
            //释放当前节点
            free(table);
            return;
        }
        table = table->next;
    }
}

void printTable(node *table)
{
    while (table != NULL)
    {
        printf("Node: %d\n", table->id);
        table = table->next;
    }
    return;
}