2010-02-15 3 views
0

Хорошо, у меня есть программа очереди, над которой я работаю, и, наконец, я понял большую часть ее. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что каждый раз, когда я вводим числа в клавиатуру, а затем получаю их, я получаю одинаковый номер. если я вхожу в 5, когда идет, чтобы добавить их вместе, он говорит, что ответ неверен. Вот мой код еще раз:Ошибка с моей программой

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

Если это домашнее задание, добавьте * домашнюю работу * тег. – mctylr

ответ

1

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

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

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

2

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

4

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

+0

Я вижу это сейчас. Мне нужно использовать dataPtr как мой источник, а не возвращаемое значение – shinjuo

+0

nevermind Я вижу, что использование dataPtr просто возвращает мне место памяти, а не данные. Мне нужно посмотреть немного больше – shinjuo

+0

Чтобы получить данные, на которые указывает указатель, используйте '* pointer'. – Vatine

Смежные вопросы