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

C语言基于链表实现队列操作出现Segmentation Fault(core dumped)错误

错误原因
  • 空指针非法访问:全局队列指针q初始值为NULL,未分配内存就直接传入create函数,函数内部对空指针执行q->front = NULL的解引用操作,直接触发段错误。
  • 判断逻辑语法错误:insert函数中if(q->front=NULL)是赋值操作,会强制将q->front设为NULL,导致后续队列操作逻辑完全错乱,需要改为相等判断q->front == NULL。
  • 边界逻辑缺失:原delete函数删除队列最后一个元素后,仅修改了front指针,rear指针仍指向已释放的节点,会触发后续操作的潜在内存错误。
修复后完整代码
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
    int data;
    struct Node *next;
}node;
typedef struct Queue{
    node *front;
    node *rear;
}queue;
queue *q=NULL;
int isempty(queue *);
void create(queue *);
queue *insert(queue *);
queue *delete(queue *);
void display(queue *);
void peek(queue *);
int main(){
    int o;
    // 先为队列结构体分配内存
    q = (queue *)malloc(sizeof(queue));
    create(q);
    do{
        printf("\nQueue Operations");
        printf("\n1. Insert");
        printf("\n2. Delete");
        printf("\n3. Peek");
        printf("\n4. Display");
        printf("\n5. Exit");
        printf("\nEnter Option : ");
        scanf("%d",&o);
        switch(o){
            case 1:
                insert(q);
                break;
            case 2:
                delete(q);
                break;
            case 3:
                peek(q);
                break;
            case 4:
                display(q);
                break;
            case 5:
                break;
            default:
                printf("Invalid Option");
                break;
        }
    }
    while(o!=5);
}
void create(queue *q)
{
    q->front=NULL;
    q->rear=NULL;
}
queue *insert(queue *q){
    node *p;
    p=(node *)malloc(sizeof(node));
    printf("Enter Data : ");
    scanf("%d",&p->data);
    // 修正为相等判断
    if(q->front == NULL){
        q->front=p;
        q->rear=p;
        q->front->next=q->rear->next=NULL;
    }
    else{
        q->rear->next=p;
        q->rear=p;
        q->rear->next=NULL;
    }
    return q;
}
int isempty(queue *q){
    if(q->front==NULL)
        return 1;
    else 
        return 0;
}
queue *delete(queue *q){
    node *p;
    int t;
    t=isempty(q);
    if(t==1)
        printf("Queue Empty");
    else{
        p=q->front;
        q->front=q->front->next;
        printf("Value Deleted : %d",p->data);
        free(p);
        // 删除最后一个元素时同步重置rear指针
        if(q->front == NULL){
            q->rear = NULL;
        }
    }
    return q;
}
void peek(queue *q){
    int t;
    t=isempty(q);
    if(t==1)
        printf("Queue Empty");
    else
        printf("Peek:%d",q->front->data);
}
void display(queue *q){
    node *p;
    p=q->front;
    if(p==NULL)
        printf("Queue is Empty");
    else{
        while(p!=q->rear){
            printf("%d\t",p->data);
            p=p->next;
        }
        printf("%d\t",p->data);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:18:02