Связанные списки превращают мой мозг в кашу.Как я должен это делать? - PullRequest
4 голосов
/ 30 июня 2011

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

In function 'append_node': 
error: request for member ‘next’ in something not a structure or union

Как правильно получить доступ (или передать) структуру по ссылке?

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

struct node {
  int val;
  struct node *next;
};

static int append_node(int val, struct node **head) {
  struct node *new_node;

  new_node = (struct node *) malloc(sizeof(struct node));
  new_node->val  = val;
  new_node->next = NULL

  *(head)->next = new;

  return 0;
}

int main() {
  int i;
  struct node *head;
  struct node *curr;

  head = NULL;
  curr = (struct node *) malloc(sizeof(struct node));

  for(i = 1; i <= 10; i++) {
      append_node(i, &curr);
      head = curr;
  }

  curr = head;
  while(curr) {
      printf("%d\n", curr->val);
      curr = curr->next ;
  }

  return 0;
}

Любая помощь будет отличной!

Ответы [ 3 ]

3 голосов
/ 30 июня 2011

Две проблемы:

Отсутствует ; в конце

new->next = NULL

и изменение

*(head)->next = new;

на

(*head)->next = new;
3 голосов
/ 30 июня 2011

Могу ли я предположить, что вы получаете ошибку в этой строке?

  *(head)->next = new;

Я думаю, вам нужно сделать одно тривиальное изменение:

  (*head)->next = new;

Так как head являетсяуказатель на указатель, при разыменовании вы получаете указатель.->next работает с этим указателем.

1 голос
/ 30 июня 2011

Попробуйте вместо этого:

(*head)->next = new_node;

Включите **head в *head, а затем вызовите участников.

...