2010-02-14 66 views
2

更正它現在的作用,謝謝大家。用C填寫隊列C

好了,所以我現在已經更新了我的主文件到
的main.c

#include "queue.h" 

int main(){ 
    int i; 
    int* dataPtr; 
    int number; 
    QUEUE* numbers; 
    numbers = createQueue(); 

    printf("Please enter the 10 numbers you want to know the sum and average of.\n"); 

    for (i = 0; i < 10; i++){ 
     printf("Number %d: ", i+1); 
     scanf("%d", &number); 
     *dataPtr = number; 
     enqueue(numbers, dataPtr); 
    } 



    system("Pause"); 
    return 0; 

} 

但我的程序崩潰時,它跑了
有誰知道爲什麼發生這種情況?

原貼

我有麻煩搞清楚如何填補與C.用戶輸入的隊列任何人都可以點我在正確的方向。

queue.h:

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 

//Queue ADT Type Definitions 
     typedef struct node{ 
       void* dataPtr; 
       struct node* next; 
     } QUEUE_NODE; 

     typedef struct{ 
       QUEUE_NODE* front; 
       QUEUE_NODE* rear; 
       int count; 
     } QUEUE; 

//Prototype Declarations  
     QUEUE* createQueue (void); 
     QUEUE* destroyQueue (QUEUE* queue); 

     bool dequeue  (QUEUE* queue, void** itemPtr); 
     bool enqueue  (QUEUE* queue, void* itemPtr); 
     bool queueFront  (QUEUE* queue, void** itemPtr); 
     bool queueRear  (QUEUE* queue, void** itemPtr); 
     int queueCount  (QUEUE* queue); 

     bool emptyQueue  (QUEUE* queue); 
     bool fullQueue  (QUEUE* queue); 
//End of Queue ADT definitions 

Queue.c

#include <stdio.h> 
#include <stdlib.h> 
#include "queue.h" 
QUEUE* createQueue (void){ 
     QUEUE* queue; 

     queue = (QUEUE*) malloc (sizeof (queue)); 
     if (queue){ 
      queue->front = NULL; 
      queue->rear = NULL; 
      queue->count = 0; 
     } 
     return queue; 
} 

bool enqueue (QUEUE* queue, void* itemPtr){ 
    QUEUE_NODE* newPtr; 

    if(!(newPtr = (QUEUE_NODE*)malloc(sizeof(QUEUE_NODE)))) 
       return false; 

    newPtr->dataPtr = itemPtr; 
    newPtr->next  = NULL; 

    if (queue->count == 0) 
     queue->front = newPtr; 
    else 
     queue->rear->next = newPtr; 

    (queue->count)++; 
    queue->rear = newPtr; 
    return true; 
} 

bool dequeue (QUEUE* queue, void** itemPtr){ 
    QUEUE_NODE* deleteLoc; 

    if (!queue->count) 
     return false; 

    *itemPtr = queue->front->dataPtr; 
    deleteLoc = queue->front; 
    if(queue->count == 1) 
     queue->rear = queue->front = NULL; 
    else 
     queue->front = queue->front->next; 
    (queue->count)--; 
    free (deleteLoc); 

    return true; 
} 

bool queueFront (QUEUE* queue, void** itemPtr){ 
    if (!queue->count) 
     return false; 
    else{ 
      *itemPtr = queue->front->dataPtr; 
      return true; 
    } 
} 

bool queueRear (QUEUE* queue, void** itemPtr){ 
    if (!queue->count) 
     return true; 
    else{ 
      *itemPtr = queue->rear->dataPtr; 
      return false; 
    } 
} 

bool emptyQueue (QUEUE* queue){ 
    return (queue->count == 0); 
} 

bool fullQueue(QUEUE* queue){ 
    QUEUE_NODE* temp; 

    temp = (QUEUE_NODE*)malloc(sizeof(*(queue->rear))); 
    if (temp){ 
       free (temp); 
       return true; 
       } 
    return false; 
} 

int queueCount(QUEUE* queue){ 
    return queue->count; 
} 

QUEUE * destroyQueue (QUEUE* queue){ 
     QUEUE_NODE* deletePtr; 

     if (queue){ 
       while (queue->front != NULL){ 
         free (queue->front->dataPtr); 
         deletePtr = queue->front; 
         queue->front = queue->front->next; 
         free(deletePtr); 
       } 
       free (queue); 
     } 
     return NULL; 
} 

main.c 
#include <stdio.h> 
#include <stdlib.h> 
#include "queue.h" 

int main(){ 
    int number; 
    int *dataPtr; 
    QUEUE* numbers; 
    numbers = createQueue(); 

    printf("Please enter the 10 numbers you want to know the sum and average of.\n"); 

    for (int i = 0, i < 10; i++){ 
     if (!(dataPtr = (int*) malloc (sizeof (int)))) 
      printf("Overflow trying to fill queues.\n"), exit(100); 




    system("Pause"); 
    return 0; 

} 
+0

你有任何代碼示例將是有用的:) – Jedidja

+0

你如何發佈代碼標籤? – shinjuo

+1

我的意思是你如何發佈代碼塊? – shinjuo

回答

2

的類型不匹配的是在這裏:

gets(number); 

兩個錯在這裏的東西:

  1. 您傳遞錯誤的類型(一intgets()需要一個char[]。)
  2. 你傳入它的價值。它應該是通過引用

一個更合適的通話將(通過指針):

scanf("%d", &number); 

我可以解釋的「正確」使用gets(),但最好不要使用它在所有。 Wikipedia page解釋了原因。


我想這裏還有另一個bug:dataPtr是未初始化的。試試這個:

scanf("%d", &number); 
    dataPtr = malloc(sizeof(int)); 
    *dataPtr = number; 
+0

我改變了它,但現在程序甚至沒有運行。 – shinjuo

+0

does C support&or is that C++ – shinjuo

+0

在這種情況下,它是返回指向(單)參數的指針的「地址」運算符。兩者都支持。請注意,此用法與C++中的「reference」運算符(僅稍微)不同,後者看起來完全相同。 – dmckee

1

從你來看的意見,我認爲問題狀態是一樣的東西

接受的數字值序列來自用戶的輸入,並用結果填充隊列。

要做到這一點,你需要:

  • 循環輸入直到某些滿足終止條件(問題狀態可能說用什麼,如果不撿東西,這是不可能犯的錯誤對於數據(因爲期望的輸入是數字,請考慮使用像'q'這樣的字母來停止輸入))。
  • 對於每個輸入,從鍵盤獲得它(從文件?你不說),檢查它是否是終止條件,如果不是,則轉換爲數值。
  • 排隊結果。

沒有問題你被卡住的地方更好地指明的仔細定義,我不能提供更多的幫助。


您正在使用的出現隊列被實現爲一個鏈表,這樣你就可以列表用手非破壞性訪問的內容。這打破了抽象,但會工作得很好。

使用ptr = queueFront()獲取指向第一個節點的指針,然後在每次要移動到下一個節點時使用ptr = ptr->next。要訪問單個節點的有效負載,請獲取ptr->dataPtr並取消引用(即按照指針)。

+0

現在好了,現在一旦我填滿了隊列,有沒有辦法查看每個項目,或者我需要拉出每個項目,然後把它放回到底?實際上,應該從用戶(鍵盤)中將10個數字插入隊列中,以便將這些數字用於某些數學工作。但隊列必須多次使用,所以我不能刪除或修改數學函數之間的內容 – shinjuo

+0

如果是這樣的話,那麼你不應該真的在使用隊列。 –

+0

@Anon:同意,但如果這是家庭作業或學習練習,OP可能會停留在規範中。 – dmckee

1

我想你正在尋找gets()或ssscanf()函數來從控制檯獲取用戶輸入。隊列代碼看起來不錯,你只需要從控制檯獲取整數,然後使用你的隊列函數來執行操作。

1

您已將接口發佈到通用隊列設施。它看起來像一個完全合理的排隊設施給我。該工具可讓您將物品放入隊列中,詢問隊列中的簡單問題(例如,隊列是否爲空?),並從隊列中取出物品。隊列中的項目以FIFO(先入先出)爲基礎出現,就像人們排隊在物理隊列中一樣。所以通常情況下,你會在隊列的後面添加新的物品,同時從隊列的正面移除物品。

從您的意見,聽起來好像你不關心最初填充隊列。您的問題是,您希望對現有隊列中的每個項目執行處理,而無需添加或移除項目。有些隊列設施可讓您迭代隊列中當前的項目,以便您可以執行此操作。但不幸的是,我不認爲你的隊列允許這樣做。線索是,接收queueFront()方法輸出的itemPtr參數最終不是指向QUEUE_NODE,而是指向void(即任意數據)。如果此方法讓您看到隊列前面的QUEUE_NODE,則可以先查看該QUEUE_NODE的dataPtr以檢查數據,然後查看下一個指針以查看下一個QUEUE_NODE。但是,您的工廠只是向您顯示數據,而無需查找下一個QUEUE_NODE的數據。

但是這不是一個大問題。只需從隊列中取出每個項目,對其進行處理,然後立即將其放入新的隊列中。當您查看每個項目時,您的新隊列將具有與原始隊列具有相同順序的相同元素,並且原始隊列現在將爲空。換句話說,您仍然有一個隊列,其中包含與您開始的順序相同的項目。

編輯我剛剛意識到細化這個想法可以避免需要第二個隊列。只需刪除隊列中的每個項目,並在處理它之後,將其添加回相同的隊列。這樣,每處理完一個項目後,隊列將再次處於其原始狀態,同一項目的順序相同。

+0

我會盡快嘗試這個工作 – shinjuo

1

顯然你還沒有爲dataPtr分配內存之前「* dataPtr = number;」正如finnw指出的那樣。我只是通過改變上面的方式讓你的程序在gcc中運行良好。