好的,我有我一直在研究的队列程序,我终于想出了大部分内容。我现在遇到的问题是,每当我在键盘中输入数字然后访问它们时,我得到相同的数字。如果我把它们加在一起就输入5个,那就说答案是37,这是不对的。这是我的代码:
的main.c
#include "queue.h"
#define loop 5
int main(){
int i;
int* dataPtr;
int number;
int sum;
int average;
QUEUE* numbers;
numbers = createQueue ();
printf("Please enter the 10 numbers you want to know the sum and average of.\n");
for (i = 0; i < loop; i++){
printf("Number %d: ", i+1);
scanf("%d", &number);
*dataPtr = number;
enqueue(numbers, dataPtr);
}
for (i = 0; i < loop; i++){
number = dequeue(numbers, (void*)&dataPtr);
sum += number;
enqueue(numbers, dataPtr);
}
average = sum/loop;
printf("\nSum: %d", sum);
printf("\nAverage: %d", average);
system("Pause");
return 0;
}
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;
}
我不需要纠缠太多,但我正在努力学习这些东西
答案 0 :(得分:4)
你的出队函数返回一个bool(当转换为数字时,0为0表示假,1表示为真),因此你总结了错误的值。
答案 1 :(得分:2)
您绝对必须使用调试器并观察循环执行程序时会发生什么。 ddd是一个很棒的工具!
答案 2 :(得分:1)
好的,这里有几个问题。
首先,dataPtr
永远不会被初始化,因此*dataPtr
指向内存中的随机位置,并且您将其设置为一个arbritary整数值。这会调用未定义的行为(因此可能存在鼻子恶魔)。
其次,你需要在每次循环时分配新的存储空间,否则你最终会得到10个对你读到的最后一个数字的引用。