我的程序出错了

时间:2010-02-15 02:47:55

标签: c algorithm queue data-structures

好的,我有我一直在研究的队列程序,我终于想出了大部分内容。我现在遇到的问题是,每当我在键盘中输入数字然后访问它们时,我得到相同的数字。如果我把它们加在一起就输入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;
}

我不需要纠缠太多,但我正在努力学习这些东西

3 个答案:

答案 0 :(得分:4)

你的出队函数返回一个bool(当转换为数字时,0为0表示假,1表示为真),因此你总结了错误的值。

答案 1 :(得分:2)

您绝对必须使用调试器并观察循环执行程序时会发生什么。 ddd是一个很棒的工具!

答案 2 :(得分:1)

好的,这里有几个问题。

首先,dataPtr永远不会被初始化,因此*dataPtr指向内存中的随机位置,并且您将其设置为一个arbritary整数值。这会调用未定义的行为(因此可能存在鼻子恶魔)。

其次,你需要在每次循环时分配新的存储空间,否则你最终会得到10个对你读到的最后一个数字的引用。