我有一个实现堆栈的C程序。
#include <stdio.h>
#include <stdlib.h>
struct node{
int data;
struct node *link;
};
struct stack{
struct node *head;
struct node *data_node;
};
int push(struct stack *a_stack, int i){
a_stack->data_node = malloc(sizeof(struct node));
if(a_stack->data_node == NULL){
puts("Error: Cannot allocate sufficient memory.");
exit(1);
}
a_stack->data_node->data = i;
a_stack->data_node->link = a_stack->head;
a_stack->head= a_stack->data_node;
return 0;
}
int pop(struct stack *a_stack){
if(a_stack->head==NULL){
return '\n';
}
int temp = a_stack->head->data;
a_stack->data_node = a_stack->head;
a_stack->head = a_stack->head->link;
free(a_stack->data_node);
return temp;
}
int minimum(struct stack *a_stack){
if(a_stack->head==NULL){
return '\n';
}
int min = a_stack->head->data;
struct node *a_node = a_stack->head;
while(a_node!=NULL){
if(min>a_node->data){
min = a_node->data;
a_node = a_node->link;
}
}
return min;
}
int init_stack(struct stack *a_stack){
a_stack->head = NULL;
a_stack->data_node = NULL;
}
int handle_input(struct stack *test){
char* input_string = (char*)malloc(20);
scanf("%s", input_string);
// gets(input_string);
char* pop_cmd = "-";
char* min_cmd = "min";
int num;
if (strcmp(pop_cmd, input_string) == 0){
printf("%d\n", pop(test));
}
else{
if (input_string[0] == 'm'){
printf("%d\n", minimum(test));
}
else{
num = atoi(input_string);
push(test, num);
}
}
return 0;
}
int main(void){
int no_of_input, counter;
struct stack test;
init_stack(&test);
scanf("%d", &no_of_input);
for(counter=no_of_input; counter>0; counter=counter-1){
handle_input(&test);
};
return 0;
}
问题是如果我想输入'min'这是计算数组最小元素的命令,程序会在输入时等待。经过一段时间的搜索,我仍然不知道为什么会这样。
答案 0 :(得分:4)
scanf不会等待,但您有无限循环问题。在函数minimum()
中,您只有条件地将a_node
更新为链接列表中的下一个节点:
int min = a_stack->head->data; //note
struct node *a_node = a_stack->head; //note
while(a_node!=NULL){
if(min > a_node->data){<-- "Always evaluates FALSE because: min is a_node->data"
min = a_node->data;
a_node = a_node->link; <--"Should NOT be here"
}
a_node = a_node->link; <--"but it should be here"
}
此外,if
条件(min > a_node->data)
始终评估false
,原因如下:
min
为a_stack->head->data
而a_node
为a_stack->head
,因此min == a_node->date
和min > a_node->data
始终评估false
,因为您已更新a_node
在if
身体中的1}}。
此外,我在函数handle_input()
中发现你有内存泄漏。您应free()
显式动态分配内存。请阅读以下建议:
int handle_input(struct stack *test){
char* input_string = malloc(20); <-- "No need to type case"
// code here
free(input_string); <-- "Add this"
return 0;
}
答案 1 :(得分:0)
另外,在:
int init_stack(struct stack *a_stack){
a_stack->head = NULL;
a_stack->data_node = NULL;
}
我认为它应该返回void而不是int。
和handle_input()中的min_cmd未使用。