实现一个简单的链表,并使用TDD方法对其进行测试。

问题描述

我们要实现一个简单的链表,支持以下操作:

  • 插入一个节点到链表的头部
  • 删除链表中的一个节点
  • 查找链表中的一个节点

步骤 1: 编写测试用例

// test_linked_list.c

#include <assert.h>
#include "linked_list.h"

void test_insert_node() {
    LinkedList *list = create_linked_list();
    insert_node(list, 1);
    assert(list->head->data == 1);
    insert_node(list, 2);
    assert(list->head->data == 2);
    assert(list->head->next->data == 1);
    free_linked_list(list);
}

void test_delete_node() {
    LinkedList *list = create_linked_list();
    insert_node(list, 1);
    insert_node(list, 2);
    delete_node(list, 1);
    assert(list->head->data == 2);
    assert(list->head->next == NULL);
    delete_node(list, 2);
    assert(list->head == NULL);
    free_linked_list(list);
}

void test_find_node() {
    LinkedList *list = create_linked_list();
    insert_node(list, 1);
    insert_node(list, 2);
    Node *node = find_node(list, 1);
    assert(node != NULL);
    assert(node->data == 1);
    node = find_node(list, 3);
    assert(node == NULL);
    free_linked_list(list);
}

int main() {
    test_insert_node();
    test_delete_node();
    test_find_node();
    printf("All tests passed!\n");
    return 0;
}

步骤 2: 实现功能

首先,定义链表的结构:

// linked_list.h

#ifndef LINKED_LIST_H
#define LINKED_LIST_H

typedef struct Node {
    int data;
    struct Node *next;
} Node;

typedef struct {
    Node *head;
} LinkedList;

LinkedList* create_linked_list();
void insert_node(LinkedList *list, int data);
void delete_node(LinkedList *list, int data);
Node* find_node(LinkedList *list, int data);
void free_linked_list(LinkedList *list);

#endif // LINKED_LIST_H

接着,实现链表的功能:

// linked_list.c

#include <stdlib.h>
#include "linked_list.h"

LinkedList* create_linked_list() {
    LinkedList *list = (LinkedList *)malloc(sizeof(LinkedList));
    list->head = NULL;
    return list;
}

void insert_node(LinkedList *list, int data) {
    Node *new_node = (Node *)malloc(sizeof(Node));
    new_node->data = data;
    new_node->next = list->head;
    list->head = new_node;
}

void delete_node(LinkedList *list, int data) {
    Node *current = list->head;
    Node *prev = NULL;
    
    while (current != NULL && current->data != data) {
        prev = current;
        current = current->next;
    }
    
    if (current != NULL) {
        if (prev == NULL) {
            list->head = current->next;
        } else {
            prev->next = current->next;
        }
        free(current);
    }
}

Node* find_node(LinkedList *list, int data) {
    Node *current = list->head;
    while (current != NULL) {
        if (current->data == data) {
            return current;
        }
        current = current->next;
    }
    return NULL;
}

void free_linked_list(LinkedList *list) {
    Node *current = list->head;
    Node *next;
    
    while (current != NULL) {
        next = current->next;
        free(current);
        current = next;
    }
    
    free(list);
}

步骤 3: 运行测试

gcc -o test_linked_list test_linked_list.c linked_list.c
./test_linked_list

解释

  • test_linked_list.c: 这个文件包含了所有的测试用例。我们使用 assert 函数来验证链表操作的输出是否符合预期。
  • linked_list.h: 头文件声明了链表的结构和函数,以便在测试代码和实现代码中都能使用。
  • linked_list.c: 这个文件包含了链表的实现,包括创建链表、插入节点、删除节点、查找节点和释放链表的函数。

通过这种方式,我们可以确保链表的基本功能在实现之前就被定义和测试,从而保证代码的正确性和健壮性。这就是TDD方法的应用。