这是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);
Run Code Online (Sandbox Code Playgroud)
代码没有完成,但我认为这对我的问题已经足够了.这里在结构节点的末尾使用"LLIST",它也用作函数原型的返回类型list_add.到底是怎么回事?
Chr*_*utz 24
那是一个typedef.它实际上是一次做两件事.首先,它定义了一个结构:
struct node {
int data;
struct node *next;
}
Run Code Online (Sandbox Code Playgroud)
然后做一个typedef:
typedef struct node LLIST;
Run Code Online (Sandbox Code Playgroud)
这意味着LLIST是一种,就像int或者FILE或者char,这是一个速记struct node,您链接列表节点结构.这是没有必要-你可以替换LLIST使用struct node在所有这些点-但它使一个有点易于阅读,并帮助隐藏讨厌的最终用户执行.
Amb*_*ber 11
LLIST只是已创建的结构的另一个类型名称.通常,以下格式将创建一个"结构x"类型"NAME":
typedef struct x { ... } NAME;
Run Code Online (Sandbox Code Playgroud)
Kim*_*man 10
C要求您使用"struct"前缀引用结构,因此引入typedef以减少冗长的提及是很常见的.
也就是说,你的struct的声明有两个部分,可以这样重写:
struct node {
int data;
struct node *next; /* pointer to next element in list */
};
typedef struct node LLIST;
Run Code Online (Sandbox Code Playgroud)
所以,LLIST这只是另一个名字struct node(谢谢Chris Lutz).
typedef在程序中创建一个新的"类型",因此这些函数的返回值和参数类型只是你的结构.它只是struct node用于该类型的简写.
如果要创建新节点,可以这样做(使用类型):
LLIST *node = malloc(sizeof(LLIST));
node->data = 4;
node->next = someOtherItem;
list_add(node, 1)
Run Code Online (Sandbox Code Playgroud)
另外,在你的问题中使用函数原型,你真的不需要双指针; 因为结构中的数据只是一个int,你可以做类似的事情
LLIST *list_add(int data, int position);
Run Code Online (Sandbox Code Playgroud)
然后该list_add函数将处理分配,将其复制int到结构中并将其添加到链接列表中.
将它放在某个位置就像next将节点前的指针更改为新分配的节点的地址一样简单,新节点中的next指针指向下一个节点(该节点之前的节点之一)最初指着).
请记住(给定其余的函数原型),您必须跟踪指向您创建的每个节点的指针,以便全部删除它们.
我不确定我是否理解搜索功能如何工作.整个事情可以更好地实施.你不应该有,当你创建它提供一个节点的位置(如果指定一个较大的数字比有节点什么?)等.
| 归档时间: |
|
| 查看次数: |
33568 次 |
| 最近记录: |