Приведение предметов в конец связанного списка в C - PullRequest
0 голосов
/ 30 января 2012

EDIT * (8:14 PM) - Извините, я исправил свой код и вместо этого сделал его методом, чтобы его было проще понять.

Я не уверен, как правильно приводить структуру при добавлении вконец связанного списка.Компиляция этого кода дает мне предупреждение о приведении в самой последней строке.Это может быть причиной того, что остальная часть моего кода не работает должным образом.

Например:

#include <stdlib.h>

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

node *HEAD = NULL;

node *addNode(int num)
{
    if (HEAD == NULL) {
        HEAD = (node *)malloc(sizeof(node));
        HEAD->next = NULL;
        HEAD->data = num;
    }
    else {
        node *newNode;
        newNode = (node *)malloc(sizeof(node));
        newNode->data = num;
        newNode->next = NULL;

        node *iter;
        iter = (node *)malloc(sizeof(node));
        iter = (node *)HEAD;

        while(iter->next != NULL)
            iter = (node *)iter->next;

        iter->next = newNode; //warning : warning: assignment from incompatible pointer type
    } 
    return HEAD;
}

Ответы [ 3 ]

1 голос
/ 30 января 2012
  • Обязательно включите stdlib.h - необходимо использовать malloc
  • исправить все вхождения wordNode в узел - wordNode не определен в вашей программе
  • создать структуруи typedef обоих именованных узлов - стандартный трюк для самоссылочных структур

, и тогда все ваши предупреждения исчезнут;

#include <stdlib.h>
struct node{
  int data;
  struct node *next;
};
typedef struct node node;


node *HEAD = NULL;

int main(int argc, char*argv[]) {

  int x = 1;
  int y = 2;

  if(HEAD == NULL)
    {
      HEAD = (node *)malloc(sizeof(node));
      HEAD->next = NULL;
      HEAD->data = x;
    }
  else
    {
      node *newNode;
      newNode = (node *)malloc(sizeof(node));
      newNode->data = y;
      newNode->next = NULL;

      node *iter;
      iter = (node *)malloc(sizeof(node));
      iter = (node *)HEAD;

      while(iter->next != NULL)
    iter = (node *)iter->next;

      iter->next = newNode; //warning : warning: assignment from incompatible pointer type
      return 0;
    }
}
0 голосов
/ 30 января 2012

Существует ряд проблем с вашим кодом. Первым из них будет приведение к возвращаемому значению malloc и неправильная ссылка на размер типа, для которого требуется выделить некоторое пространство:

HEAD = (node *)malloc(sizeof(node));

следует заменить на

HEAD = malloc(sizeof(*HEAD))

Поскольку преобразование из void* в любой другой тип всегда определено и неявно в C, вы не получите никаких предупреждений о необходимом приведении. Указание sizeof(*HEAD) заставляет компилятор автоматически выбирать тип HEAD во время компиляции, тем самым сокращая необходимую работу в случае изменения типа.

Вам также следует помнить, что некоторым компиляторам не нравятся анонимные структуры (то есть структуры без объявленного имени). Поэтому код

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

следует заменить на

typedef struct _node {
int data;
struct _node *next;
} node;

которая объявляет структуру с именем _node, определенную по типу с именем node. А также исправляет круговую ссылку.

Кроме того, вам не нужно malloc места для iter.

0 голосов
/ 30 января 2012

Проблема в том, что вы объявляете "next" указателем на "struct node" до того, как структура полностью определена, поэтому "next" указывает на неопределенную структуру.Если вы измените "typedef struct {" на "typedef struct node {", эта ошибка исчезнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...