现在感谢所有人的纠正。
好的,现在我已将主文件更新为
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;
}
答案 0 :(得分:2)
类型不匹配在这里:
gets(number);
这里有两件事:
int
。gets()
需要char[]
。)更恰当的呼叫是:
scanf("%d", &number);
我可以解释gets()
的“正确”用法,但最好不要使用它。 Wikipedia page解释了原因。
我认为此处还有另一个错误:dataPtr
未初始化。试试这个:
scanf("%d", &number);
dataPtr = malloc(sizeof(int));
*dataPtr = number;
答案 1 :(得分:1)
从您的评论来看,我认为问题状态类似于
接受来自用户的一系列数值输入,并用结果填充队列。
要做到这一点,你需要:
如果没有对问题进行更详细的定义,我就无法提供更多帮助和可以更好地指出您遇到的问题。
您正在使用的队列似乎是作为链接列表实现的,因此您可以 手动遍历列表以非破坏性地访问内容。这打破了抽象,但工作得很好。
使用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中正常运行。