代码之家  ›  专栏  ›  技术社区  ›  shinjuo

用C[关闭]填充队列

  •  2
  • shinjuo  · 技术社区  · 15 年前

    更正它现在工作了,谢谢大家。

    好吧,现在我把主文件更新到
    主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语言填充一个队列,有人能给我指出正确的方向吗?

    排队: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
    

    队列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 回复  |  直到 15 年前
        1
  •  2
  •   finnw    15 年前

    类型不匹配如下:

    gets(number);
    

    这里有两个问题:

    1. 你传错了类型 int . gets() 期望A char[] )
    2. 你在按价值传递它。应该通过引用(通过指针)。

    更合适的电话是:

    scanf("%d", &number);
    

    我可以解释“正确”使用 GETSH() 但最好不要使用它。这个 Wikipedia page 解释原因。


    我想这里还有一个bug: dataPtr 未初始化。试试这个:

        scanf("%d", &number);
        dataPtr = malloc(sizeof(int));
        *dataPtr = number;
    
        2
  •  1
  •   Jeff    15 年前

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

        3
  •  1
  •   dmckee --- ex-moderator kitten    15 年前

    从你的评论来看,我认为问题状态是

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

    要做到这一点,您需要:

    • 循环输入,直到满足某个终止条件(问题状态可能表示要使用什么,如果不选择不可能出错的数据(由于预期输入是数字,请考虑使用“q”这样的字母停止输入))。
    • 对于每个输入,从键盘、文件中获取它。您不必说),请检查它是否是终止条件,如果不是,请转换为数值。
    • 将结果排队。

    如果没有对问题的更详细的定义,我就无法提供更多的帮助。 更好地指示你被困在哪里。


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

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

        4
  •  1
  •   Bill Forster    15 年前

    您已将接口发布到通用队列设施。在我看来,这是一个非常合理的排队设施。该工具允许您将项目放入队列,对队列提出简单的问题(例如队列是否为空?),并从队列中获取项目。在队列中,项目以先进先出(first-in,first-out)的方式输出,就像人们在物理队列中排队一样。因此,通常您会将新项目添加到队列的后面,同时从队列的前面移除项目。

    从您的评论中,听起来您好像不关心最初填充队列。您的问题是,您希望在不添加或删除项目的情况下对现有队列中的每个项目执行处理。一些队列设施允许您迭代队列中当前的项目,以便您可以这样做。但不幸的是,我认为你的队列不允许这样做。提示是,接收queuefront()方法输出的itemptr参数最终不是指向队列节点,而是指向无效(即任意数据)。如果此方法让您看到队列前面的队列节点,您可以首先查看该队列节点的dataptr以检查数据,然后查看下一个指针以查看下一个队列节点。但是,您的工具只是向您显示数据,而不提供查找下一个队列节点的数据的功能。

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

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

        5
  •  1
  •   csk    15 年前

    很明显,正如Finnw指出的那样,在“*dataptr=number;”之前,您没有为dataptr分配内存。我只是通过更改上面的内容,让您的程序在gcc中运行良好。