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

C语言双队列元素排序插入链表的代码故障排查请求

问题排查与代码修正

我帮你梳理下代码里的几个关键问题,这些问题直接导致了程序无法正常运行:

1. 队列指针未分配内存

在main函数里,你定义了queue *q1 = NULL, *q2 = NULL;,但直接把空指针传给initialize函数去操作队列成员(比如queue->counter = 0),这会触发空指针访问错误,程序直接崩溃。你需要先给队列指针分配内存空间。

2. sortedlist函数参数传递错误

C语言是值传递,你把root(一个node*指针)传给sortedlist函数后,函数里调用sortedInsert修改的只是局部的root副本,完全不会影响main函数里的原始root变量。所以要么让sortedlist返回更新后的链表头指针,要么传递node**(指针的指针)来直接修改原指针。

3. sortedInsert中内存分配错误

在创建空链表的第一个节点时,你写的是root = (node *)malloc(sizeof(node*));,这里sizeof(node*)是指针的大小(通常4或8字节),但你需要分配整个struct node的内存空间,应该改成sizeof(node),否则会导致内存分配不足,后续访问root->x或root->next会出现内存越界错误。


修正后的完整代码

#include <stdio.h>
#include <stdlib.h>
#define MAX 100
//there are 2 queues, and one empty linked list
//take elements from queues and sort it on linked list
struct q {
    int queue[MAX];
    int front;
    int rear;
    int counter;
};
struct node {
    int x;
    struct node *next;
};
typedef struct node node;
typedef struct q queue;

void enqueue(queue *queue, int x) {
    if (!(queue->counter == MAX)) {
        queue->rear++;
        queue->counter++;
        if (queue->rear == MAX)
            queue->rear = 0;
        queue->queue[queue->rear] = x;
    }
}

int dequeue(queue *queue) {
    if (!(queue->counter == 0)) {
        int x = queue->queue[queue->front];
        queue->counter--;
        queue->front++;
        if (queue->front == MAX)
            queue->front = 0;
        return x;
    } else
        return -1;
}

node* sortedInsert(node *root, int x) {
    if (root == NULL) {
        // 修正:分配node结构体的完整大小,而非指针大小
        root = (node *)malloc(sizeof(node));
        root->x = x;
        root->next = NULL;
        return root;
    }
    if (x < root->x) {
        node *temp = (node *)malloc(sizeof(node));
        temp->next = root;
        temp->x = x;
        return temp;
    }
    node *iter = root;
    while (iter->next != NULL && iter->next->x < x) {
        iter = iter->next;
    }
    node *temp = (node *)malloc(sizeof(node));
    temp->x = x;
    temp->next = iter->next;
    iter->next = temp;
    return root;
}

void printlist(node *root) {
    while (root != NULL) {
        printf("%d \n", root->x);
        root = root->next;
    }
}

void initialize(queue *queue) {
    queue->counter = 0;
    queue->front = 0;
    queue->rear = -1;
}

// 修正:返回更新后的链表头指针,让main函数能拿到新的链表根
node* sortedlist(queue *q1, queue *q2, node *root) {
    while (q1->counter != 0) {
        root = sortedInsert(root, dequeue(q1));
    }
    while (q2->counter != 0) {
        root = sortedInsert(root, dequeue(q2));
    }
    return root;
}

int main(void) {
    // 修正:给队列指针分配内存
    queue *q1 = (queue*)malloc(sizeof(queue));
    queue *q2 = (queue*)malloc(sizeof(queue));
    node *root = NULL;
    initialize(q1);
    initialize(q2);
    enqueue(q1, 10);
    enqueue(q1, 20);
    enqueue(q1, 30);
    enqueue(q1, 40);
    enqueue(q1, 50);
    enqueue(q1, 60);
    enqueue(q1, 70);
    enqueue(q2, 15);
    enqueue(q2, 25);
    enqueue(q2, 35);
    enqueue(q2, 45);
    enqueue(q2, 55);
    enqueue(q2, 65);
    enqueue(q2, 75);
    enqueue(q2, 85);
    enqueue(q2, 95);
    enqueue(q2, 105);
    enqueue(q2, 115);
    // 修正:接收sortedlist返回的新链表头
    root = sortedlist(q1, q2, root);
    printlist(root);
    
    // 可选:释放所有分配的内存,避免内存泄漏
    node *tempNode;
    while (root != NULL) {
        tempNode = root;
        root = root->next;
        free(tempNode);
    }
    free(q1);
    free(q2);
    
    return 0;
}

额外小建议

  • 如果你的队列可能存储-1这个值,那dequeue返回-1作为空队列标记的逻辑就会有问题,建议改成用指针参数返回出队值,同时返回布尔状态码来判断是否出队成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:41:45