Реализация очереди выдает несовместимую ошибку типа указателя - PullRequest
0 голосов
/ 06 октября 2018

Я думаю, что мне не хватает общих понятий о структурах и указателях.Следовательно, приведенный ниже код выдает 2 предупреждения / ошибки, и я не понимаю, почему.

  1. Почему «queue-> head = temp» выдает следующее предупреждение: warning: назначение из несовместимого указателятип [включен по умолчанию]

  2. Почему «queue-> tail-> next = temp» выдает следующую ошибку: ошибка: разыменование указателя на неполный тип.

Примечание: строка «Node * temp = newNode (data)» не выдает никаких ошибок / предупреждений, поэтому она успешна.

typedef struct {
  int data;
  struct Node *next;
} Node;

typedef struct {
  struct Node *head;
  struct Node *tail;
} Queue;

void enQueue(Queue *queue, int data) 
{ 
    // Create a new node
    Node *temp = newNode(data); 


    // If queue is empty, then new node is both head and tail 
    if (queue->tail == NULL) 
    { 
       queue->head = temp;
       queue->tail = temp; 
       return; 
    } 

    // Add the new node at the end of queue and change tail 
    queue->tail->next = temp; 
    queue->tail = temp;
}

1 Ответ

0 голосов
/ 07 октября 2018

Как вы получили этот код для компиляции?Ваша структура Node содержит указатель на другой Node.В способе, которым вы объявили свою структуру, компилятор не знает Node при анализе определения вашей структуры.Следовательно, вы должны написать:

1 typedef struct Node{
2   int data;
3   struct Node *next;
4 } Node;

Таким образом, компилятор знает, как обрабатывать вашу структуру при ее анализе.В строке 3 уже известно, что Node - это структура.Поскольку часть вашего кода отсутствует, я создал минимальный пример, который реализует очень простую очередь:

#include <stdlib.h>
#include <stdio.h>


#define MAX 5
typedef struct Node{
  int data;
  struct Node *next;
} Node;

typedef struct {
  struct Node *head;
  struct Node *tail;
} Queue;

Node* newNode(const int nodeData){
    Node* tmp = malloc(sizeof(*tmp));
    if (NULL == tmp){
        printf("Could not allocate Node ... exiting");
        exit(EXIT_FAILURE);
    }
    tmp->data = nodeData;
    tmp->next = NULL;
    return tmp;


}
void enQueue(Queue *queue, int data) 
{ 
    // Create a new node
    Node *temp = newNode(data); 


    // If queue is empty, then new node is both head and tail 
    if (queue->tail == NULL) 
    { 
        printf("Queue is empty\n");
       queue->head = temp;
       queue->tail = temp; 
       return; 
    } 

    // Add the new node at the end of queue and change tail 
    queue->tail->next = temp; 
    queue->tail = temp;
}

void printQueue(Queue* q){
    Node* tmp = q->head;
    while (tmp != NULL){
        printf("Value: %d\n", tmp->data);
        tmp = tmp->next;
    }
}

int main(void){
    Queue q;
    q.head = q.tail = NULL;
    int i;

    for (i = 0; i < MAX; ++i){
        printf("%d is entered into the queue\n", i);
        enQueue(&q, i);
    }
    printQueue(&q);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...