【问题标题】:Queue in C, bad printingC中的队列,打印错误
【发布时间】:2017-05-09 13:39:44
【问题描述】:

非常感谢堆栈方面的帮助,现在我自己编写了队列。但我只有一个问题。当我只添加一个项目并且我想打印它时,程序正在无限打印这个数字。我的推送/打印功能出了什么问题?

#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");
}

【问题讨论】:

  • last-&gt;next = pNewItem; last = pNewItem; --> else { last-&gt;next = pNewItem; last = pNewItem; }
  • 如果选择0,则表示为Bad value.

标签: c queue


【解决方案1】:

我猜是这一行:

last->next = pNewItem;

first == last,你在这里创建一个循环 -> 把它放在一个else 分支中。

【讨论】:

    【解决方案2】:

    函数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;
        }
    }
    

    【讨论】:

      【解决方案3】:
      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;
      }
      }
      

      你明白了,推送中有问题。考虑一下这个推送功能,这只是你推送的修改版本。您可以直接使用它而不是您的推送。请注意,推送功能有三处变化。

      【讨论】:

      • 你提交的函数实现有bug。
      猜你喜欢
      • 2014-05-14
      • 2018-04-30
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多