я не могу распечатать связанный список - PullRequest
0 голосов
/ 29 июня 2018
#include<stdio.h>
#include<stdlib.h>

main()
{  
    struct node
    {   
         int data;
         struct node *next;
    };

    struct node *first=(struct node*)malloc(sizeof(struct node));
    struct node *second=(struct node*)malloc(sizeof(struct node));
    struct node *third=(struct node*)malloc(sizeof(struct node));

    scanf("%d %d %d",&(first->data),&(second->data),&(third->data));
    first->next=second;
    second->next=third;
    third->next=NULL;
    struct node *t=(struct node *)first;
    f(t);
 }

f(struct node *a)
{
    while(a!=NULL)
    {
        printf("%d",a->data);
        a= a->next;
    }
}

приведенный выше код выдает предупреждение и ошибку «объявлен узел структуры внутри списка параметров» и «указатель разыменования на неполный тип»

пожалуйста, помогите мне запустить код и устранить ошибку.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* ===== Define structure outside function ===== */
/*
    Use `typedef` to rename the data type.
    `node_t` is equal with `struct node_t`, and
    `node` is equal with `struct node_t *`.
 */
typedef struct node_t
{
    int data;
    struct node_t *next;
} node_t, *node;

/*  Define link list
 */
typedef struct list_t
{
    node head;
    node rear;
    int size;
} list_t, *list;

list list_create()
{
    list l = NULL;

    if ((l = malloc(sizeof(list_t))) == NULL)
    {
        exit(-1);
    }
    memset(l, 0, sizeof(list_t));

    return l;
}

int list_destroy(list *pl)
{
    node cur;
    node prev;

    if (pl == NULL || *pl == NULL)
        return -1;

    cur = (*pl)->head;
    while (cur != NULL)
    {
        prev = cur;
        cur = cur->next;
        free(prev);
    }

    free(*pl);
    *pl = NULL;

    return 0;
}

int list_push(list l, int data)
{
    node n;

    if (l == NULL)
        return -1;

    if ((n = malloc(sizeof(node_t))) == NULL)
    {
        exit(-1);
    }

    n->data = data;
    n->next = NULL;

    if (l->head == NULL)
    {
        l->head = n;
    }
    else
    {
        l->rear->next = n;
    }

    l->rear = n;
    l->size++;

    return 0;
}

int list_pop(list l, int *pdata)
{
    if (l == NULL || l->head == NULL)
    {
        return -1;
    }

    *pdata = l->head->data;
    if (l->head == l->rear)
    {
        l->rear = NULL;
    }
    l->head = l->head->next;

    l->size--;

    return 0;
}

void list_foreach(list l, void (*func)(int data, void *arg), void *arg)
{
    node cur = l->head;

    while (cur != NULL)
    {
        func(cur->data, arg);
        cur = cur->next;
    }
}


static void print_node(int data, void *arg)
{
    printf("%d\n", data);
}

int main(int argc, char *argv[])
{
    int i;
    int d;
    list l;

    l = list_create();

    for (i = 0; i < 5; i++)
    {
        scanf("%d", &d);
        getchar();
        list_push(l, d);
    }

    list_foreach(l, print_node, NULL);

    printf("Pop: [status %d], ", list_pop(l, &d));
    printf("[value %d]\n", d);

    printf("Pop: [status %d], ", list_pop(l, &d));
    printf("[value %d]\n", d);

    list_foreach(l, print_node, NULL);

    list_destroy(&l);

    return 0;

}
0 голосов
/ 29 июня 2018

Есть несколько проблем.

  • у ваших функций нет типа возврата
  • ваш struct node объявлен только в области действия main.
  • вы используете функцию f до того, как она была объявлена.
  • И последнее, но не менее важное: форматирование вашего кода ужасно. Форматирование не важно для компилятора, но только для читателя, включая вас

Вот как должна выглядеть ваша программа:

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

struct node               // structure declared at global scope
{
  int data;
  struct node *next;
};

void f(struct node *a);   // declare function

int main()                // function has now return type int
{
  struct node *first = (struct node*)malloc(sizeof(struct node));
  struct node *second = (struct node*)malloc(sizeof(struct node));
  struct node *third = (struct node*)malloc(sizeof(struct node));

  scanf("%d %d %d", &(first->data), &(second->data), &(third->data));
  first->next = second;
  second->next = third;
  third->next = NULL;
  struct node *t = (struct node *)first;
  f(t);
}

void f(struct node *a)   // function has now return type void
{
  while (a != NULL)
  {
    printf("%d", a->data);
    a = a->next;
  }
}

Отказ от ответственности: эта программа просто правильно компилируется без предупреждений, но я не проверял, имеет ли она смысл.

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