2017-05-09 18 views
1

スタックに助けてくれてありがとう、今は自分でキューを書きました。 1つの項目を追加して印刷したいとき、プログラムはこの数字を無限に印刷しています。プッシュ/プリント機能の何が問題なのですか?Cのキュー、悪い印刷

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

'last-> next = pNewItem; last = pNewItem; ' - >' else {last-> next = pNewItem; last = pNewItem; } ' – BLUEPIXY

+0

' 0'を選択すると、 '不良値 'と言います。 – BLUEPIXY

答えて

2

私はそれがこのラインだと思う:

last->next = pNewItem; 

first == last、あなたがここにサイクルを作成するとき - >elseブランチにそれを置きます。

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

次のように見ることができますあなたは、それは問題がプッシュであり書きました。このプッシュ機能を、プッシュの変更されたバージョンと見なしてください。プッシュの代わりに直接使用することができます。プッシュ機能には3つの変更があります。

+0

関数の実装にはバグがあります。 –