我应该将一些整数排入队列,然后计算总和和平均值......
我相信我正确地将我的数据排入队列,但是当我出队时,我似乎得到了我入队的最后一个整数。
#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
答案 0 :(得分:0)
您的数据指针设置不正确。这是完全错误的:
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**
不某些指向指针的泛型。后者是一种非常特殊的类型(指向void的指针)。因此,你的演员是不合适的。它已在上面的代码中解决,你应该仔细研究它。