非常感谢堆栈的帮助,现在我已经自己写了队列..但我只有一个问题。当我只添加一个项目并且我想打印它时,程序正在无穷大地打印这个数字。我的推/打印功能出了什么问题?
#include <stdio.h>
#include <stdlib.h>
typedef struct Element Element;
typedef struct Element
{
int value;
Element* next;
} Element;
Element* first = NULL;
Element* last = NULL;
void pop();
void push(int x);
void printqueue();
int main()
{
int x;
int warunek;
do
{
printf("\nMENU\n");
printf("1. Push[1]\n2. Pop[2]\n3. Print[3]\n0. Wyjdz[0]\n");
printf("Podaj warunek: ");
scanf("%d", &warunek);
switch(warunek)
{
case 1:
{
printf("Give a number: ");
scanf("%d", &x);
push(x);
}
break;
case 2: pop();
break;
case 3: printqueue();
break;
default: printf("Bad value.\n");
}
}
while(warunek != 0);
return 0;
}
void push(int x)
{
Element* pNewItem = (Element*)malloc(sizeof(Element));
pNewItem->value = x;
pNewItem->next = NULL;
if(first == NULL && last == NULL)
{
first = last = pNewItem;
}
last->next = pNewItem;
last = pNewItem;
}
void pop()
{
Element* pNewItem = first;
if(first == NULL)
printf("Queue is empty.\n");
else if(first == last)
first = last = NULL;
else
first = first->next;
free(pNewItem);
}
void printqueue()
{
Element* temp = first;
printf("\nContent of queue\n");
while(temp != NULL)
{
printf("%d\n", temp->value);
temp = temp->next;
}
printf("\n");
}
答案 0 :(得分:2)
我想这就是这句话:
last->next = pNewItem;
first == last
时,你在这里创建一个循环 - &gt;把它放在else
分支。
答案 1 :(得分:0)
函数push
错误。 if后面的语句
last->next = pNewItem;
last = pNewItem;
需要包含在else语句中。
该功能可以按以下方式查看
void push(int x)
{
Element* pNewItem = (Element*)malloc(sizeof(Element));
pNewItem->value = x;
pNewItem->next = NULL;
if( last == NULL )
{
first = last = pNewItem;
}
else
{
last = last->next = pNewItem;
}
}
答案 2 :(得分:0)
void push(int x)
{
Element* pNewItem = (Element*)malloc(sizeof(Element));
pNewItem->value = x;
if(first == NULL && last == NULL)
{
first = last = pNewItem;
}
else{
last->next = pNewItem;
last = pNewItem;
last.next = NULL;
}
}
你得知它在推送中存在问题。考虑这个推送功能,这只是推送的修改版本。您可以直接使用它而不是推动。请注意,推送功能有三处变化。