Ошибка с моей программой - PullRequest
       16

Ошибка с моей программой

0 голосов
/ 15 февраля 2010

Хорошо, у меня есть программа очередей, над которой я работал, и я наконец понял большую ее часть.Проблема, с которой я сталкиваюсь сейчас, заключается в том, что каждый раз, когда я набираю цифры на клавиатуре, а затем получаю к ним доступ, я получаю один и тот же номер.если я ввожу 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 ]

4 голосов
/ 15 февраля 2010

Ваша функция удаления возвращает логическое значение (которое при преобразовании в число равно 0 для false и 1 для true), поэтому вы суммируете неправильное значение.

2 голосов
/ 15 февраля 2010

Вы обязательно должны использовать отладчик и следить за тем, что происходит при циклическом просмотре программы DDD - отличный инструмент!

1 голос
/ 16 февраля 2010

ОК, здесь есть пара проблем.

Во-первых, dataPtr никогда не инициализируется, поэтому *dataPtr указывает на случайное место в памяти, и вы устанавливаете для него произвольное целочисленное значение. Это вызывает неопределенное поведение (так что носовые демоны возможны).

Во-вторых, вам нужно каждый раз выделять новое хранилище в цикле, иначе вы получите десять ссылок на последнее прочитанное число.

...