保存可变数量的数据
由于数组长度是固定的,为了保存可变数量的数据,需要一个比数组更灵活的东西,即链表。
链表就是一连串的数据
链表是一种抽象数据结构。链表是通用的,可以用来保存很多不同类型的数据,所以被称之为抽象数据结构。
链表保存了一条数据和一个指向另一条数据的链接。
在链表中插入数据
如果想在A和B之间插入C,只要将A中原本指向B的链接改成指向C,然后把C中的链接指向B,就可以插入一个新值了。他的优点就是
插入数据非常快。
相对而言,如果想在数组中插入
一个值,就不得不将插入点后所有数据后移一个位置,效率较低。
如何在C语言中创建链表?
那就是 创建递归结构
链表中的每个结构都需要与下一个结构相连。如果一个结
构包含一个链向同种结构的链接,那么这个结构就被称为
递归结构。
递归结构含有指向同种结构的指针。如果你有一张航班时间表,上面列出了将要游览的岛屿,就可以用递归结构表示 island ,
下面具体讨论递归结构是怎么工作的:
typedef struct island { // 你必须为这个结构命名。
char *name;
char *opens;
char *closes;
struct island *next; // 你在结构中保存了一个指针,指向下一座岛。
} island;
如何在当前结构中保存链向下一个结构的链接呢?用指针。
只要在结构中保存指针, island 数据就含有下一个我们将游览的 island 的地址。只要我们的代码能访问一个 island ,就能够跳到下一个island 。
注意:递归结构要有名字。
当用typedef命令定义结构时可以跳过为结构起名字这步,但在递归结构中,需要包含一个相同类型的指针, C语言的语法不允许用typedef
别名来声明它,因此必须为结构起一个名字。这就是为什么这里的结构叫struct island。
用C语言创建岛屿……
一旦定义了 island 数据类型,就可以像这样创建第一批island :
island amity = { "Amity", "09:00", "17:00", NULL};
island craggy = { "Craggy", "09:00", "17:00", NULL};
island isla_nublar = { "Isla Nublar", "09:00", "17:00", NULL};
island shutter = { "Shutter", "09:00", "17:00", NULL};
刚开始我们把每个 island 中的 next 字段都设为了 NULL 。在C语言中, NULL 的值实际上为0, NULL专门用来把某个指针设为0。
……把它们链接在一起,构成飞行之旅
一旦你创建好了岛,就可以把它们连接在一起:
amity.next = &craggy;
craggy.next = &isla_nublar;
isla_nublar.next = &shutter;
这样就创建了一次完整的跳岛游
在链表中插入值
通过修改指针的值,就可以插入 island ,就像之前做的那样:
island skull = { "Skull", "09:00", "17:00", NULL};
isla_nublar.next = &skull;
skull.next = &shutter;
短短两行代码,就在链表插入了新值。但如果用数组,为了移动数组元素,你要多写很多代码。
代码示例:
#include <stdio.h>
typedef struct island { // 你必须为这个结构命名。
char *name;
char *opens;
char *closes;
struct island *next; // 你在结构中保存了一个指针,指向下一座岛。
} island;
void display(island *start) {
island *i = start;
for (; i!=NULL ; i = i->next ) { //需要一直循环下去,直到当前island没有next值,在每次循环的最后,跳到下一座岛
printf("Name: %s\n open: %s-%s\n", i->name, i->opens , i->closes );
}
}
int main() {
island amity = { "Amity", "09:00", "17:00", NULL};
island craggy = { "Craggy", "09:00", "17:00", NULL};
island isla_nublar = { "Isla Nublar", "09:00", "17:00", NULL};
island shutter = { "Shutter", "09:00", "17:00", NULL};
amity.next = &craggy;
craggy.next = &isla_nublar;
isla_nublar.next = &shutter;
island skull = { "Skull", "09:00", "17:00", NULL};
isla_nublar.next = &skull;
skull.next = &shutter;