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

