用C填充队列

时间:2010-02-14 21:48:16

标签: c queue

现在感谢所有人的纠正。

好的,现在我已将主文件更新为
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;

}

5 个答案:

答案 0 :(得分:2)

类型不匹配在这里:

gets(number);

这里有两件事:

  1. 您传的错误类型(intgets()需要char[]。)
  2. 你是按价值传递的。它应该是通过引用(通过指针。)
  3. 更恰当的呼叫是:

    scanf("%d", &number);
    

    我可以解释gets()的“正确”用法,但最好不要使用它。 Wikipedia page解释了原因。


    我认为此处还有另一个错误:dataPtr未初始化。试试这个:

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

答案 1 :(得分:1)

从您的评论来看,我认为问题状态类似于

  

接受来自用户的一系列数值输入,并用结果填充队列。

要做到这一点,你需要:

  • 循环输入,直到满足一些终止条件(问题状态可能说明要使用什么,如果不选择不可能错误的数据(因为预期的输入是数字,考虑使用像'的字母' q'停止输入))。
  • 对于每个输入,获取它(从键盘,从文件?你没有说),检查它是否是终止条件,如果没有,转换为数值。
  • 排队结果。

如果没有对问题进行更详细的定义,我就无法提供更多帮助可以更好地指出您遇到的问题。


您正在使用的队列似乎是作为链接列表实现的,因此您可以 手动遍历列表以非破坏性地访问内容。这打破了抽象,但工作得很好。

使用ptr = queueFront()获取指向第一个节点的指针,然后在每次要移动到下一个节点时使用ptr = ptr->next。要访问单个节点的有效负载,请获取ptr->dataPtr并取消引用(即跟随指针)。

答案 2 :(得分:1)

我认为您正在寻找gets()或ssscanf()函数来从控制台获取用户输入。队列代码看起来没问题,您只需要从控制台获取整数,然后使用队列函数来执行操作。

答案 3 :(得分:1)

您已将接口发布到通用队列工具。对我来说,它看起来像一个完全合理的队列设施。该工具允许您将项目放入队列,询问队列的简单问题(例如队列是否为空?),并从队列中获取项目。对于队列,项目以FIFO(先进先出)为基础出现,就像人们在物理队列中排队一样。所以通常你会在队列的后面添加新项目,同时从队列的前面删除项目。

从您的评论中,听起来好像您并不担心最初填充队列。您的问题是您希望对现有队列中的每个项目执行处理,而无需添加或删除项目。一些队列工具允许您遍历队列中当前的项目,以便您可以执行此操作。但不幸的是,我认为你的队列不允许这样做。线索是接收queueFront()方法输出的itemPtr参数最终指向不是QUEUE_NODE而是指向void(即任意数据)。如果此方法允许您在队列的前面看到QUEUE_NODE,则可以首先查看该QUEUE_NODE的dataPtr以检查数据,然后查看下一个指针以查看下一个QUEUE_NODE。但是,您的工具只是向您显示数据,而无需查找下一个QUEUE_NODE的数据。

然而,这不是一个大问题。只需从队列中取出每个项目,处理它,然后立即将其放入新队列中。当您查看每个项目时,您的新队列将具有与原始队列相同的顺序的相同元素,并且原始队列现在将为空。换句话说,您仍将拥有一个队列,其中包含与您开始时相同顺序的相同项目。

编辑我刚刚意识到改进这个想法会略微避免需要第二个队列。只需删除队列中的每个项目,处理完毕后,将其添加回同一队列。这样,一旦处理完每个项目,队列将再次处于其原始状态,同一个项目的顺序相同。

答案 4 :(得分:1)

显然你没有在“* dataPtr = number;”之前为dataPtr分配内存。正如finnw指出的那样。我只是通过更改上面的内容,让你的程序在gcc中正常运行。