我应该将一些整数排入队列,然后计算总和和平均值...

我相信我正确地排队了我的数据,但是当我出队时,我似乎得到了我排队的最后一个整数。

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

int main(void)
{
  int intgr;
  int avg = 0;
  int sum = 0;
  int* dataPtr;
  QUEUE* queue;
  queue = createQueue();

  printf("Enter 5 integers to calc sum and average:\n\n");

  for(int i = 0; i < 5; i++)
  {
    intgr = (int*)malloc(sizeof(int));
    printf("Enter a number:");
    scanf("%d", &intgr);
    dataPtr = &intgr;
    enqueue(queue, dataPtr);
  }

  for(int i = 0; i < 5; i++)
  {
    dequeue(queue, (void*)&dataPtr);
    printf("%d", *dataPtr);
    sum += *dataPtr;
  }

  printf("Sum: %d\n", sum);
  printf("Avg: %d\n", sum/5);

  return 0;
}


我的出队操作:

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

  //Statements
  if(!queue->count)
    return false;

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

  return true;
} // dequeue

最佳答案

您的数据指针设置不正确。这是完全错误的:

intgr = (int*)malloc(sizeof(int));


由于转换不正确,该警告不仅会发出巨大警告,而且不能保证它还会起作用。此外,intgr中的值以后会被覆盖:

scanf("%d", &intgr);


因此,即使平台上的int足够大以容纳void*,您还是会泄漏内存。

您要执行的操作是:

int main(void)
{
    int sum = 0;
    QUEUE* queue = createQueue();

    printf("Enter 5 integers to calc sum and average:\n\n");

    for(int i = 0; i < 5; i++)
    {
        int value;
        printf("Enter a number:");
        scanf("%d", &value);

        int *dataPtr = malloc(sizeof *dataPtr);
        *dataPtr = value;
        enqueue(queue, dataPtr);
    }

    for(int i = 0; i < 5; i++)
    {
        void *vptr = NULL;
        dequeue(queue, &vptr);
        if (vptr)
        {
            int *dataPtr = vptr;
            printf("%d", *dataPtr);
            sum += *dataPtr;
        }
        free(vptr);
    }

    printf("Sum: %d\n", sum);
    printf("Avg: %d\n", sum/5);

    return 0;
}


显然,应该有更多的错误检查,清除等方法,但是我留给您。

您还有另一个问题,已经涵盖了许多问题。 void*是C中的无类型泛型指针类型。void**不是某些指针到指针的泛型。后者是一种非常特定的类型(指向空指针的指针)。因此,您的演员阵容不正确。上面的代码已经解决了它,您应该仔细看一下。

关于c - 为什么每次出队时都会得到相同的号码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42259350/

10-10 18:29
查看更多