堆栈和队列程序中的分段错误
Segmentation fault in stack and queue program
这段代码应该允许用户随意在堆栈和队列之间切换。我现在面临的问题是在我启动程序后,它会像它应该的那样要求 q 或 s。但是一旦你真正输入了你的输入,它就会给出一个分段错误。有人知道我能做些什么来解决这个问题吗?
#include <stdio.h>
#include <stdlib.h>
struct node{
int info;
struct node *ptr;
}*front,*rear,*temp,*front1;
struct stack
{
int stk[10];
int top;
} s;
void push();
void pop();
void emptys();
void search();
void queue();
void stack();
void insertq(int data);
void removeq();
void emptyq();
void printq();
void create();
void help();
int count = 0;
void main(){
char ch;
printf("\n s - Switch to stack mode");
printf("\n q - Switch to queue mode");
create();
while(1)
{
printf("\nWhat mode would you like to start in?\n");
scanf("%s", ch);
switch (ch){
case 's':
stack();
break;
case 'q':
queue();
break;
}
}
return;
}
void create(){/* Create an empty queue */
front = rear = NULL;
}
void queue(){
int no, e;
char ch;
printf("\n s - Switch to stack mode");
printf("\n i - Insert a new number");
printf("\n p - Remove front of queue or top of stack");
printf("\n Q - Exit program");
printf("\n h - Help");
while(1){
printf("\n What would you like to do?\n");
scanf("%s", ch);
switch (ch)
{
case 's':
stack();
break;
case 'i':
printf("Enter data : ");
scanf("%d", &no);
insertq(no);
break;
case 'p':
removeq();
break;
case 'Q':
printf("\nGoodbye");
exit;
case 'h':
help();
break;
}
}
return;
}
void stack(){
int no, e;
char ch;
printf("\n q - Switch to queue mode");
printf("\n i - Insert a new number");
printf("\n p - Remove front of queue or top of stack");
printf("\n Q - Exit program");
printf("\n h - Help");
while(1){
printf("\n What would you like to do?\n");
scanf("%s", ch);
switch (ch)
{
case 'q':
queue();
break;
case 'i':
push();
break;
case 'p':
pop();
break;
case 'Q':
printf("\nGoodbye");
exit;
case 'h':
help();
break;
}}
return;
}
void push (){
int num;
if (s.top == (9))
{
printf ("Error: Overflow\n");
}
else
{
printf ("Enter the element to be pushed\n");
scanf ("%d", &num);
s.top = s.top + 1;
s.stk[s.top] = num;
}
}
void pop(){
int num;
if (s.top == - 1)
{
printf ("Error: Stack Empty\n");
}
else
{
num = s.stk[s.top];
printf ("popped element is = %d\n", num);
s.top = s.top - 1;
}
}
void insertq(int data){
if (rear == NULL)
{
rear = (struct node *)malloc(1*sizeof(struct node));
rear->ptr = NULL;
rear->info = data;
front = rear;
}
else
{
temp=(struct node *)malloc(1*sizeof(struct node));
rear->ptr = temp;
temp->info = data;
temp->ptr = NULL;
rear = temp;
}
count++;
}
void removeq(){
front1 = front;
if (front1 == NULL)
{
printf("\n Error: Trying to display elements from empty queue");
return;
}
else
if (front1->ptr != NULL)
{
front1 = front1->ptr;
printf("\n Dequed value : %d", front->info);
free(front);
front = front1;
}
else
{
printf("\n Dequed value : %d", front->info);
free(front);
front = NULL;
rear = NULL;
}
count--;
}
void printq(){
front1 = front;
if ((front1 == NULL) && (rear == NULL))
{
printf("Queue is empty");
return;
}
while (front1 != rear)
{
printf("%d ", front1->info);
front1 = front1->ptr;
}
if (front1 == rear)
printf("%d", front1->info);
printf("%d", front1->info);
}
void help(){
printf("\n q - switch to queue mode");
printf("\n s - Switch to stack mode");
printf("\n i - Insert a new number");
printf("\n p - Remove front of queue or top of stack");
printf("\n e - Tells if empty or not");
printf("\n Q - Exit program");
printf("\n h - Help");
}
这 scanf("%s", ch);
导致您的段错误。更改它 scanf("%c", &ch);
。在所有方法中更正此问题。在你的 scanf 调用之后,还要放置这样的代码来吃掉缓冲区中的尾随新行:
scanf("%c", &ch);
char c;
while((c = getchar()) != '\n' && c != EOF);
完整代码:
#include <stdio.h>
#include <stdlib.h>
struct node{
int info;
struct node *ptr;
}*front,*rear,*temp,*front1;
struct stack
{
int stk[10];
int top;
} s;
void push();
void pop();
void emptys();
void search();
void queue();
void stack();
void insertq(int data);
void removeq();
void emptyq();
void printq();
void create();
void help();
int count = 0;
int main(){
char ch;
printf("\n s - Switch to stack mode");
printf("\n q - Switch to queue mode");
create();
while(1)
{
printf("\nWhat mode would you like to start in?\n");
scanf("%c", &ch);
char c;
while((c = getchar()) != '\n' && c != EOF);
switch (ch){
case 's':
stack();
break;
case 'q':
queue();
break;
}
}
return;
}
void create(){/* Create an empty queue */
front = rear = NULL;
}
void queue(){
int no, e;
char ch;
printf("\n s - Switch to stack mode");
printf("\n i - Insert a new number");
printf("\n p - Remove front of queue or top of stack");
printf("\n Q - Exit program");
printf("\n h - Help");
while(1){
printf("\n What would you like to do?\n");
scanf("%c", &ch);
char c;
while((c = getchar()) != '\n' && c != EOF);
switch (ch)
{
case 's':
stack();
break;
case 'i':
printf("Enter data : ");
scanf("%d", &no);
insertq(no);
break;
case 'p':
removeq();
break;
case 'Q':
printf("\nGoodbye");
exit;
case 'h':
help();
break;
}
}
return;
}
void stack(){
int no, e;
char ch;
printf("\n q - Switch to queue mode");
printf("\n i - Insert a new number");
printf("\n p - Remove front of queue or top of stack");
printf("\n Q - Exit program");
printf("\n h - Help");
while(1){
printf("\n What would you like to do?\n");
scanf("%c", &ch);
char c;
while((c = getchar()) != '\n' && c != EOF);
switch (ch)
{
case 'q':
queue();
break;
case 'i':
push();
break;
case 'p':
pop();
break;
case 'Q':
printf("\nGoodbye");
exit;
case 'h':
help();
break;
}}
return;
}
void push (){
int num;
if (s.top == (9))
{
printf ("Error: Overflow\n");
}
else
{
printf ("Enter the element to be pushed\n");
scanf ("%d", &num);
s.top = s.top + 1;
s.stk[s.top] = num;
}
}
void pop(){
int num;
if (s.top == - 1)
{
printf ("Error: Stack Empty\n");
}
else
{
num = s.stk[s.top];
printf ("popped element is = %d\n", num);
s.top = s.top - 1;
}
}
void insertq(int data){
if (rear == NULL)
{
rear = (struct node *)malloc(1*sizeof(struct node));
rear->ptr = NULL;
rear->info = data;
front = rear;
}
else
{
temp=(struct node *)malloc(1*sizeof(struct node));
rear->ptr = temp;
temp->info = data;
temp->ptr = NULL;
rear = temp;
}
count++;
}
void removeq(){
front1 = front;
if (front1 == NULL)
{
printf("\n Error: Trying to display elements from empty queue");
return;
}
else
if (front1->ptr != NULL)
{
front1 = front1->ptr;
printf("\n Dequed value : %d", front->info);
free(front);
front = front1;
}
else
{
printf("\n Dequed value : %d", front->info);
free(front);
front = NULL;
rear = NULL;
}
count--;
}
void printq(){
front1 = front;
if ((front1 == NULL) && (rear == NULL))
{
printf("Queue is empty");
return;
}
while (front1 != rear)
{
printf("%d ", front1->info);
front1 = front1->ptr;
}
if (front1 == rear)
printf("%d", front1->info);
printf("%d", front1->info);
}
void help(){
printf("\n q - switch to queue mode");
printf("\n s - Switch to stack mode");
printf("\n i - Insert a new number");
printf("\n p - Remove front of queue or top of stack");
printf("\n e - Tells if empty or not");
printf("\n Q - Exit program");
printf("\n h - Help");
}
您可以使用 ch = getchar() 而不是 scanf(%d", &ch),它将读取单个字符,您可以使用 switch 语句来处理输入。
while(1)
{
printf("Enter you choice");
ch = getchar();
switch(ch)
{
case 's':
stack();
break;
default :
printf("Invalid input \n");
help();
break;
}
}
在上面的代码中,默认值是可选的,但用于错误处理。
谢谢,
苏迪尔
这段代码应该允许用户随意在堆栈和队列之间切换。我现在面临的问题是在我启动程序后,它会像它应该的那样要求 q 或 s。但是一旦你真正输入了你的输入,它就会给出一个分段错误。有人知道我能做些什么来解决这个问题吗?
#include <stdio.h>
#include <stdlib.h>
struct node{
int info;
struct node *ptr;
}*front,*rear,*temp,*front1;
struct stack
{
int stk[10];
int top;
} s;
void push();
void pop();
void emptys();
void search();
void queue();
void stack();
void insertq(int data);
void removeq();
void emptyq();
void printq();
void create();
void help();
int count = 0;
void main(){
char ch;
printf("\n s - Switch to stack mode");
printf("\n q - Switch to queue mode");
create();
while(1)
{
printf("\nWhat mode would you like to start in?\n");
scanf("%s", ch);
switch (ch){
case 's':
stack();
break;
case 'q':
queue();
break;
}
}
return;
}
void create(){/* Create an empty queue */
front = rear = NULL;
}
void queue(){
int no, e;
char ch;
printf("\n s - Switch to stack mode");
printf("\n i - Insert a new number");
printf("\n p - Remove front of queue or top of stack");
printf("\n Q - Exit program");
printf("\n h - Help");
while(1){
printf("\n What would you like to do?\n");
scanf("%s", ch);
switch (ch)
{
case 's':
stack();
break;
case 'i':
printf("Enter data : ");
scanf("%d", &no);
insertq(no);
break;
case 'p':
removeq();
break;
case 'Q':
printf("\nGoodbye");
exit;
case 'h':
help();
break;
}
}
return;
}
void stack(){
int no, e;
char ch;
printf("\n q - Switch to queue mode");
printf("\n i - Insert a new number");
printf("\n p - Remove front of queue or top of stack");
printf("\n Q - Exit program");
printf("\n h - Help");
while(1){
printf("\n What would you like to do?\n");
scanf("%s", ch);
switch (ch)
{
case 'q':
queue();
break;
case 'i':
push();
break;
case 'p':
pop();
break;
case 'Q':
printf("\nGoodbye");
exit;
case 'h':
help();
break;
}}
return;
}
void push (){
int num;
if (s.top == (9))
{
printf ("Error: Overflow\n");
}
else
{
printf ("Enter the element to be pushed\n");
scanf ("%d", &num);
s.top = s.top + 1;
s.stk[s.top] = num;
}
}
void pop(){
int num;
if (s.top == - 1)
{
printf ("Error: Stack Empty\n");
}
else
{
num = s.stk[s.top];
printf ("popped element is = %d\n", num);
s.top = s.top - 1;
}
}
void insertq(int data){
if (rear == NULL)
{
rear = (struct node *)malloc(1*sizeof(struct node));
rear->ptr = NULL;
rear->info = data;
front = rear;
}
else
{
temp=(struct node *)malloc(1*sizeof(struct node));
rear->ptr = temp;
temp->info = data;
temp->ptr = NULL;
rear = temp;
}
count++;
}
void removeq(){
front1 = front;
if (front1 == NULL)
{
printf("\n Error: Trying to display elements from empty queue");
return;
}
else
if (front1->ptr != NULL)
{
front1 = front1->ptr;
printf("\n Dequed value : %d", front->info);
free(front);
front = front1;
}
else
{
printf("\n Dequed value : %d", front->info);
free(front);
front = NULL;
rear = NULL;
}
count--;
}
void printq(){
front1 = front;
if ((front1 == NULL) && (rear == NULL))
{
printf("Queue is empty");
return;
}
while (front1 != rear)
{
printf("%d ", front1->info);
front1 = front1->ptr;
}
if (front1 == rear)
printf("%d", front1->info);
printf("%d", front1->info);
}
void help(){
printf("\n q - switch to queue mode");
printf("\n s - Switch to stack mode");
printf("\n i - Insert a new number");
printf("\n p - Remove front of queue or top of stack");
printf("\n e - Tells if empty or not");
printf("\n Q - Exit program");
printf("\n h - Help");
}
这 scanf("%s", ch);
导致您的段错误。更改它 scanf("%c", &ch);
。在所有方法中更正此问题。在你的 scanf 调用之后,还要放置这样的代码来吃掉缓冲区中的尾随新行:
scanf("%c", &ch);
char c;
while((c = getchar()) != '\n' && c != EOF);
完整代码:
#include <stdio.h>
#include <stdlib.h>
struct node{
int info;
struct node *ptr;
}*front,*rear,*temp,*front1;
struct stack
{
int stk[10];
int top;
} s;
void push();
void pop();
void emptys();
void search();
void queue();
void stack();
void insertq(int data);
void removeq();
void emptyq();
void printq();
void create();
void help();
int count = 0;
int main(){
char ch;
printf("\n s - Switch to stack mode");
printf("\n q - Switch to queue mode");
create();
while(1)
{
printf("\nWhat mode would you like to start in?\n");
scanf("%c", &ch);
char c;
while((c = getchar()) != '\n' && c != EOF);
switch (ch){
case 's':
stack();
break;
case 'q':
queue();
break;
}
}
return;
}
void create(){/* Create an empty queue */
front = rear = NULL;
}
void queue(){
int no, e;
char ch;
printf("\n s - Switch to stack mode");
printf("\n i - Insert a new number");
printf("\n p - Remove front of queue or top of stack");
printf("\n Q - Exit program");
printf("\n h - Help");
while(1){
printf("\n What would you like to do?\n");
scanf("%c", &ch);
char c;
while((c = getchar()) != '\n' && c != EOF);
switch (ch)
{
case 's':
stack();
break;
case 'i':
printf("Enter data : ");
scanf("%d", &no);
insertq(no);
break;
case 'p':
removeq();
break;
case 'Q':
printf("\nGoodbye");
exit;
case 'h':
help();
break;
}
}
return;
}
void stack(){
int no, e;
char ch;
printf("\n q - Switch to queue mode");
printf("\n i - Insert a new number");
printf("\n p - Remove front of queue or top of stack");
printf("\n Q - Exit program");
printf("\n h - Help");
while(1){
printf("\n What would you like to do?\n");
scanf("%c", &ch);
char c;
while((c = getchar()) != '\n' && c != EOF);
switch (ch)
{
case 'q':
queue();
break;
case 'i':
push();
break;
case 'p':
pop();
break;
case 'Q':
printf("\nGoodbye");
exit;
case 'h':
help();
break;
}}
return;
}
void push (){
int num;
if (s.top == (9))
{
printf ("Error: Overflow\n");
}
else
{
printf ("Enter the element to be pushed\n");
scanf ("%d", &num);
s.top = s.top + 1;
s.stk[s.top] = num;
}
}
void pop(){
int num;
if (s.top == - 1)
{
printf ("Error: Stack Empty\n");
}
else
{
num = s.stk[s.top];
printf ("popped element is = %d\n", num);
s.top = s.top - 1;
}
}
void insertq(int data){
if (rear == NULL)
{
rear = (struct node *)malloc(1*sizeof(struct node));
rear->ptr = NULL;
rear->info = data;
front = rear;
}
else
{
temp=(struct node *)malloc(1*sizeof(struct node));
rear->ptr = temp;
temp->info = data;
temp->ptr = NULL;
rear = temp;
}
count++;
}
void removeq(){
front1 = front;
if (front1 == NULL)
{
printf("\n Error: Trying to display elements from empty queue");
return;
}
else
if (front1->ptr != NULL)
{
front1 = front1->ptr;
printf("\n Dequed value : %d", front->info);
free(front);
front = front1;
}
else
{
printf("\n Dequed value : %d", front->info);
free(front);
front = NULL;
rear = NULL;
}
count--;
}
void printq(){
front1 = front;
if ((front1 == NULL) && (rear == NULL))
{
printf("Queue is empty");
return;
}
while (front1 != rear)
{
printf("%d ", front1->info);
front1 = front1->ptr;
}
if (front1 == rear)
printf("%d", front1->info);
printf("%d", front1->info);
}
void help(){
printf("\n q - switch to queue mode");
printf("\n s - Switch to stack mode");
printf("\n i - Insert a new number");
printf("\n p - Remove front of queue or top of stack");
printf("\n e - Tells if empty or not");
printf("\n Q - Exit program");
printf("\n h - Help");
}
您可以使用 ch = getchar() 而不是 scanf(%d", &ch),它将读取单个字符,您可以使用 switch 语句来处理输入。
while(1)
{
printf("Enter you choice");
ch = getchar();
switch(ch)
{
case 's':
stack();
break;
default :
printf("Invalid input \n");
help();
break;
}
}
在上面的代码中,默认值是可选的,但用于错误处理。
谢谢,
苏迪尔