当我将x插入程序时,如何显示堆栈。
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int Data;
struct Node* next;
} * top;
void popStack()
{
struct Node *temp, *var = top;
if (var == top)
{
top = top->next;
free(var);
}
else
printf("\nStack Empty");
}
void push(int value)
{
struct Node* temp;
temp = (struct Node*)malloc(sizeof(struct Node));
temp->Data = value;
if (top == NULL)
{
top = temp;
top->next = NULL;
}
else
{
temp->next = top;
top = temp;
}
}
void display()
{
struct Node* var = top;
if (var != NULL)
{
printf("\nElements are as:\n");
while (var != NULL)
{
printf("\t%d\n", var->Data);
var = var->next;
}
printf("\n");
}
else
printf("\nStack is Empty");
}
int main(int argc, char* argv[])
{
printf(" Wellcome to Basic Stacking. \n");
top = NULL;
while (1)
{
当我插入“x”时,我希望程序显示堆栈并退出但是在我在此程序中插入x后它无效,它将是无限循环并且不显示堆栈而不退出应该怎么做????。
char x ;
int value;
if (value != x)
{
printf("please enter Your Name:");
scanf("%d", &value);
push(value);
fflush(stdin);
display();
}
else
{
// popStack();
display();
break;
}
}
getch();
}
答案 0 :(得分:1)
一些程序员已经发现了,但我想更明确一点:
char x;
int value;
if (value != x)
x和值都未初始化,它们可以保存任何值。如果你比较它们,它们不太可能匹配,但即使在你第一次进入循环时它们也可能偶然发生(导致立即退出)。变量x
保持'x'
的值不太可能非常 - 最后,无论如何读取未初始化的变量都是未定义的行为......
下一个问题是:您只需使用scanf("%d")
即可。如果您键入'x'
字符,则无法尝试读取输入,因为无法将其扫描为数字。所以你必须先读取一个字符串,然后解析它。两个错误都固定在一起,您的代码可能如下所示:
char buffer[128];
while(1)
{
if(!fgets(buffer, sizeof(buffer), stdin))
break; // some error occured
if(*buffer == 'x') // you can compare directly, you don't need a char x = 'x'; ...
break;
int value;
char c;
if(sscanf(buffer, "%d %c", &value, &c) == 1)
{
// ...
}
else
{
puts("invalid input");
fflush(stdout);
}
}
在数字后扫描一个附加字符(重要:需要空格字符才能跳过空格,即从fgets中获取终止换行符)以及检查sscanf的返回值,检测无效输入,例如'abc'或'1xyz'。
另外,看看你的popStack函数:
struct Node* var = top;
if (var == top)
这将总是为真,即使它顶部为NULL:那么var也是NULL,当然NULL等于它自己......
你应该这样做:
if (top)
{
struct Node* var = top;
top = top->next;
free(var);
}
好的做法总是检查malloc的返回值。虽然在像你这样的小程序中不应该失败,但是如果你从一开始就习惯了,那么你在以后编写大型程序时就不会忘记...
加上一些代码简化(承认,仅限化妆品,但如果没有必要......):
struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
if(temp)
{
temp->Data = value;
temp->next = top;
top = temp;
}
else
{
// appropriate error handling
}
最后一个建议:你的两个函数形成一个函数对,所以更喜欢在它们的名字中反映这一点:“push”和“pop”或“pushStack”和“popStack”。
答案 1 :(得分:0)
我发现了你的问题!这有点令人头疼,因为程序总是无限循环!
但问题是你正在用scanf("%d",&value)
阅读字符。此scanf不会从缓冲区中删除输入,因此您执行的每个其他扫描将具有相同的输入(&#39; x&#39;),您的scanf无法读取。
要修改此更改,请执行以下操作:
printf("please enter Your Name:");
scanf("%d", &value);
到
printf("please enter Your Name:");
if(scanf("%d", &value)==0)value=x;
因此,如果scanf不成功,那么您假设用户想要退出。
这也是一个重复的问题,租约请参阅this question,了解更多详情。
答案 2 :(得分:0)
value
与x
的比较总是调用未定义的行为。 value
的范围是循环体。每次循环时,你都会得到一个“新的”value
。
您的scanf
正在寻找一个号码。如果您希望在按键盘上的x
键时终止循环,则无法正常工作。 scanf
实际上会失败,因为x
不是%d
的有效匹配序列。另一方面,如果您键入120
x
的ASCII代码,您可能会很幸运并看到循环终止,因为未定义的行为可能包括重用value
的相同位置在循环的每次迭代中。
要解决此问题,请在进行比较之前定义读取值,以查看它是否为x
。此外,您必须使用,例如fgets()
来阅读它,然后检查它是否x
然后,如果不是,可以使用strtol()
或{{1将它转换为数字。