【发布时间】:2022-01-11 02:25:06
【问题描述】:
我用c写了一段代码,用链表实现队列操作,比如插入、删除、查看和显示。
我使用 vscode 来运行和编译我的代码。
#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;
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;
p=q->front;
t=isempty(q);
if(t==1)
printf("Queue Empty");
else{
q->front=q->front->next;
printf("Value Deleted : %d",p->data);
free(p);
}
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);
}
}
我不明白为什么我在这个问题中遇到分段错误。
这段代码在我的书中,我只是盲目地复制了这个,但我仍然收到错误。 我还在在线编译器中测试了代码,以确保我的机器没有任何故障但仍然遇到同样的问题。
如果有人可以帮助我。
【问题讨论】:
-
如果您已经编写了一大段代码并且没有经过测试,结果发现它崩溃了,那么您应该首先使用 debugger 来捕获崩溃并定位在您的代码中何时何地发生。一旦知道这一点,您应该尝试将代码最小化为复制崩溃的最小示例,实质上是创建一个minimal reproducible example。一旦你有了这个最少的代码,就更容易调试,看看会发生什么以及如何解决它。然后逐段添加代码的其他部分,在中间进行测试(你应该从一开始就这样做)。
-
@Someprogrammerdude 我试过这样做。当我调试代码时,我在 create() 中遇到错误,我正在初始化
q->next=NULL. -
当你在
main函数中调用create(q)时,q指向哪里?请记住,指针实际上就是它听起来的样子,它指向其他地方,并且要使其有效,您的代码必须实际上使其指向有效的地方。
标签: c queue dynamic-memory-allocation singly-linked-list function-definition