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

C语言用链表创建展示扑克牌卡组时打印失败、退出码异常问题求助

问题原因
  • 链表尾插逻辑错误:createCard函数中查找尾节点的循环条件写为while (p != NULL),循环结束时p已经是NULL指针,此时执行p->next = tmp属于空指针解引用,直接触发程序崩溃,这是返回异常退出码的核心原因。
  • 打印函数参数非法访问:
    1. 打印循环条件写为while (p->next != NULL)会遗漏最后一张卡牌的输出
    2. suit是char类型,printf中错误使用%s格式符(%s要求传入字符串首地址),会触发非法内存访问
    3. 未做空链表判断,若传入的head为NULL时直接访问p->next会崩溃
  • 内存泄漏:仅释放了链表头节点,剩余51个卡牌节点未释放
  • 随机数未播种:未调用srand初始化随机数种子,每次运行生成的卡牌序列完全相同
修复后完整代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct card_s {
    char suit;
    int face;
    struct card_s* next;
} card;

card* createCard(int n);
void printCard(card* head);
void freeCard(card* head);

int main(void) {
    // 初始化随机数种子
    srand((unsigned int)time(NULL));
    card* first = createCard(52);
    printCard(first);
    freeCard(first);
    return 0;
}

card * createCard(int n) {
    int i = 0;
    card* head = NULL;
    card* tmp = NULL;
    card* p = NULL;

    for (i = 0; i < n; i++) {
        tmp = (card*)malloc(sizeof(card));
        // 生成1-10的点数
        tmp->face = rand() % 10 + 1;
        // 随机取花色C/D/H/S
        tmp->suit = "CDHS"[rand() % 4];
        tmp->next = NULL;
        
        if (head == NULL) {
            head = tmp;
        } else {
            p = head;
            // 修改循环条件,找到最后一个非空节点
            while (p->next != NULL) {
                p = p->next;
            }
            p->next = tmp;
        }
    }
    return head;
}

void printCard(card * head) {
    // 空链表直接返回
    if (head == NULL) {
        return;
    }
    card* p = head;
    // 修改循环条件,遍历所有节点
    while (p != NULL) {
        // 修改格式符为%c输出char类型的花色
        printf("%d%c\n", p->face, p->suit);
        p = p->next;
    }
    return;
}

// 新增释放链表所有节点的函数
void freeCard(card* head) {
    card* p = head;
    card* tmp = NULL;
    while (p != NULL) {
        tmp = p;
        p = p->next;
        free(tmp);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:24:03