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
相关产品推荐
相关产品推荐

