C链表显示内容

时间:2016-10-21 04:55:25

标签: c struct linked-list

我在代码中遗漏了哪些部分?

我正在创建一个非空的链接 列表并显示链接列表的内容。我在哪里弄错了?

#include <stdbool.h>
#include <stdlib.h>

struct node_int
{
    void *data;
    node next;
};

typedef struct node_int *node;
typedef struct list_int { node first; } *list;

void init_list(list *lp, void *o)
{
    *lp = (list) malloc(sizeof(struct list_int));
    (*lp)->first = NULL;
    (*lp)->first->data = o;
    (*lp)->first->next = NULL;
}

void print(list ell, void (*print_data)(void *d))
{
    list c;
    c = ell;
    while (c!NULL)
    {
        print_data(c->data);
        c = ell;
    }
}

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。

首先要说的是我发现typedef指针的风格很糟糕。如果你这样做,你至少应该使用一个清楚地告诉该类型是指针的名称。 listnode等名称会让其他人想到指针。

下面是一些代码,展示了没有typedef指针的情况。

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

struct node_int
{
    void *data;
    struct node_int* next;
};

typedef struct node_int node;
typedef struct list_int { node* first; } list;


void init_list(list** lp, void *o)
{
    // Allocate the list
    *lp = malloc(sizeof(list));
    if (*lp == NULL) return;

    // Allocate the first node
    (*lp)->first = malloc(sizeof(node));
    if ((*lp)->first == NULL)
    {
        free(*lp);
        *lp = NULL;
        return;
    }

    // Initialize first element
    (*lp)->first->data = o;
    (*lp)->first->next = NULL;
}

void print(list* ell, void (*print_data)(void *d))
{
    if (ell == NULL) return;

    node* p = ell->first;
    while (p != NULL)
    {
        print_data(p->data);
        p = p->next;
    }
}

void myPrint(void* d)
{
  int* p = (int*)d;
  printf("%d\n", *p);
}

void free_list(list* ell)
{
    // Add code here ...
}

int main(void)
{
    int a = 1;
    list* myList;
    init_list(&myList, &a);
    if (myList == NULL) return 0;

    // Use the list.....
    print(myList, myPrint);

    free_list(myList);
    return 0;
}