2009-08-06 63 views
11

这是C编程语言中链接列表的代码。如何在C中使用结构?

#include <stdio.h> /* For printf */ 
#include <stdlib.h> /* For malloc */ 

typedef struct node { 
    int data; 
    struct node *next; /* Pointer to next element in list */ 
} LLIST; 

LLIST *list_add(LLIST **p, int i); 
void list_remove(LLIST **p); 
LLIST **list_search(LLIST **n, int i); 
void list_print(LLIST *n); 

该代码没有完成,但我认为这足以满足我的问题。这里在结构节点“LLIST”的末尾使用了,它也被用作功能list_add原型中的返回类型。到底是怎么回事?

回答

6

typedef在程序中创建一个新的“类型”,所以这些函数的返回值和参数类型就是你的结构。这只是使用struct node的简写。

如果您要创建一个新的节点,你可以做这样的(使用类型):

LLIST *node = malloc(sizeof(LLIST)); 
node->data = 4; 
node->next = someOtherItem; 
list_add(node, 1) 

而且,在你的问题中的函数原型,你并不真的需要双指针;因为在你的结构中的数据仅仅是一个int,你可以不喜欢

LLIST *list_add(int data, int position); 

那么list_add函数将处理分配,复制int到结构,并将其添加到链表。

把它在一定的位置是改变的节点处的next指针在它之前的新分配的节点的地址一样简单,并且next指针中的新节点到下一个点(一个该节点之前的节点最初指向的节点)。请记住(给定剩下的函数原型),你将不得不跟踪你创建的每个节点的指针,以便全部删除它们。

我不确定我了解搜索功能是如何工作的。这整个事情可以更好地实施。你不应该当你创建一个节点时提供节点的位置(如果你指定一个比节点更高的数字?)等。

10

LLIST只是已创建结构的另一个类型名称。在一般情况下,下面的格式将创建一个类型为“NAME”这是一个“结构X”:

typedef struct x { ... } NAME; 
23

这是一个typedef。它实际上一次做两件事。首先,它定义了一个结构:

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

,然后再执行typedef

typedef struct node LLIST; 

这意味着LLIST是一种类型,就像intFILEchar,那就是为struct node的简写,你链表节点结构。这不是必要的 - 您可以在所有这些位置替换LLISTstruct node - 但它使读起来更容易一些,并有助于隐藏最讨厌的最终用户的实现。

10

C要求您引用带有“struct”前缀的结构,因此通常引入typedef以减少冗长的提及。

也就是说,你的结构的声明有两个部分,并且可以改写成这样:

struct node { 
    int data; 
    struct node *next; /* pointer to next element in list */ 
}; 

typedef struct node LLIST; 

所以,LLISTstruct node(感谢克里斯·鲁茨)的另一个名称。

3

LLIST*是指向由LLIST结构定义的结构的指针。

你应该做

LLIST* myList = malloc(sizeof(LLIST)*number_of_elements); 

有分配给该列表中的某些记忆。添加和删​​除项目需要使用realloc重新分配内存。我已经为列表编写了一些代码(由数组构成)。

我可能在我回家后立即发布代码,目前情况并非如此。

+0

从技术上讲,你应该为每个项目做一个'malloc'在列表中,因为它不是一个严格的列表,而是一个带有指向列表中下一项的指针('* next')的结构。因此,您在创建每个列表项时都会执行单独的malloc。 – wizzwizz4 2016-04-09 14:45:15