You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言商店管理程序:实现增删后动态更新列表及代码评估

C语言商店管理程序动态列表实现与代码评估

一、动态列表实现方案

针对经销商、客户、员工列表的增删需求,推荐两种适合C语言的动态实现方式:

1. 链表实现(适合频繁增删操作)

链表无需预先分配固定内存,增删操作效率高,适配元素数量不确定的场景。

结构定义

以经销商为例,客户、员工可参照修改结构属性:

typedef struct Dealer {
    char name[50];
    // 可扩展属性:如地址char addr[100]、联系电话char phone[20]等
    struct Dealer *next;
} Dealer;

添加元素(新增Cafe Tokyo)

创建新节点并插入链表尾部:

Dealer* addDealer(Dealer *head, const char *name) {
    Dealer *newDealer = (Dealer*)malloc(sizeof(Dealer));
    if (!newDealer) {
        fprintf(stderr, "内存分配失败\n");
        return head;
    }
    strncpy(newDealer->name, name, sizeof(newDealer->name)-1);
    newDealer->name[sizeof(newDealer->name)-1] = '\0'; // 确保字符串终止
    newDealer->next = NULL;

    if (!head) {
        return newDealer; // 空链表时,新节点作为头节点
    }

    // 遍历到链表尾部
    Dealer *temp = head;
    while (temp->next) {
        temp = temp->next;
    }
    temp->next = newDealer;
    return head;
}

删除元素(移除Cafe Manila)

遍历找到目标节点,调整指针并释放内存:

Dealer* removeDealer(Dealer *head, const char *name) {
    if (!head) return NULL;

    // 处理头节点匹配的情况
    if (strcmp(head->name, name) == 0) {
        Dealer *temp = head;
        head = head->next;
        free(temp);
        return head;
    }

    Dealer *current = head;
    // 查找目标节点的前一个节点
    while (current->next && strcmp(current->next->name, name) != 0) {
        current = current->next;
    }

    if (current->next) {
        Dealer *temp = current->next;
        current->next = temp->next;
        free(temp);
    } else {
        printf("未找到要删除的经销商:%s\n", name);
    }
    return head;
}

动态打印列表

遍历链表输出所有元素:

void printDealers(Dealer *head) {
    puts("=== 经销商列表 ===");
    Dealer *temp = head;
    int idx = 1;
    while (temp) {
        printf("%d. %s\n", idx++, temp->name);
        temp = temp->next;
    }
}

2. 动态数组实现(适合需要随机访问的场景)

如果需要频繁按索引访问元素,动态数组更合适,通过realloc动态调整容量。

结构定义

typedef struct DynamicList {
    char **items;  // 存储元素的指针数组
    int count;     // 当前元素数量
    int capacity;  // 数组当前容量
} DynamicList;

初始化数组

void initDynamicList(DynamicList *list, int initialCap) {
    list->items = (char**)malloc(sizeof(char*) * initialCap);
    list->count = 0;
    list->capacity = initialCap;
}

添加元素

元素数量达容量时自动扩容(通常翻倍):

int addItem(DynamicList *list, const char *item) {
    if (list->count >= list->capacity) {
        int newCap = list->capacity * 2;
        char **newItems = (char**)realloc(list->items, sizeof(char*) * newCap);
        if (!newItems) {
            fprintf(stderr, "内存扩容失败\n");
            return -1;
        }
        list->items = newItems;
        list->capacity = newCap;
    }

    list->items[list->count] = (char*)malloc(strlen(item) + 1);
    if (!list->items[list->count]) {
        fprintf(stderr, "内存分配失败\n");
        return -1;
    }
    strcpy(list->items[list->count], item);
    list->count++;
    return 0;
}

删除元素

找到目标元素后,后续元素前移并释放对应内存:

int removeItem(DynamicList *list, const char *item) {
    int targetIdx = -1;
    for (int i = 0; i < list->count; i++) {
        if (strcmp(list->items[i], item) == 0) {
            targetIdx = i;
            break;
        }
    }

    if (targetIdx == -1) {
        printf("未找到要删除的元素:%s\n", item);
        return -1;
    }

    free(list->items[targetIdx]);
    // 后续元素前移
    for (int i = targetIdx; i < list->count - 1; i++) {
        list->items[i] = list->items[i + 1];
    }
    list->count--;
    return 0;
}

打印列表

void printDynamicList(DynamicList *list, const char *listName) {
    printf("=== %s列表 ===\n", listName);
    for (int i = 0; i < list->count; i++) {
        printf("%d. %s\n", i + 1, list->items[i]);
    }
}

二、硬编码列表的代码评估

硬编码(比如固定大小数组char dealers[5][50] = {"Cafe A", "Cafe B"};)存在以下问题:

  • 灵活性缺失:数组大小固定,无法动态添加超出容量的元素,强行添加会导致缓冲区溢出(未定义行为)。
  • 维护成本高:修改列表内容必须修改源代码并重新编译,无法在运行时通过用户操作调整。
  • 内存浪费:预设容量远大于实际使用量时会占用冗余内存;容量太小又无法满足需求。
  • 扩展性差:后续给元素增加属性(如客户消费金额)时,硬编码结构修改繁琐,难以复用逻辑。

三、实现注意事项

  • 内存泄漏防范:所有malloc/realloc分配的内存,必须在程序退出或删除元素时用free释放。
  • 字符串安全:复制字符串优先用strncpy代替strcpy,避免缓冲区溢出;分配字符串内存时要预留'\0'的空间。
  • 代码复用:可将链表或动态数组的核心逻辑抽象为通用函数(比如用void*指针),让经销商、客户、员工列表共用一套增删逻辑,减少重复代码。

内容的提问来源于stack exchange,提问作者Iver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:10:37