在说linked list数据结构前, 来想象一个场景。
假设要设计一个旅游线路,依次游览几个岛屿。如图,
第一种设计思路如下 :
typedef struct {
char * name;
char * opens;
char * closes;
}
// 使用数组存储岛屿信息, 行程按照数组下标顺序进行.
island tour[4];
但是这里有两个明显的问题 :
1. 扩展性问题, 如果临时改变行程增加游览的岛屿怎么办? 比如现在是游览4个岛屿, 要变成5个.
2. 灵活性问题, 如果游览的顺序改变怎么办? 那就要做数组的位置交换. 如图 :
那么有没有好的数据结构来解决这两个问题呢?
当然是有的, 就是这里要谈到的linked list. 也是一种递归结构. 就是结构体中存储了指向当前结构体的指针.
typedef struct island {
char *name;
char *opens;
char *closes;
struct island *next;
} island;
如图 :
代码如下 :
[root@db-172-16-3-150 zzz]# cat g.c
#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) {
fprintf(stdout, "Name: %s 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;
// 改变行程, 新增一个浏览岛屿, 放在isia nublar岛屿与shutter之间
island skull = {"Skull", "09:00", "17:00", NULL};
isla_nublar.next = &skull;
skull.next = &shutter;
// 显示行程
display(&amity);
return 0;
}
执行结果 :
[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./g.c -o g && ./g
Name: Amity open: 09:00 - 17:00
Name: Craggy open: 09:00 - 17:00
Name: Isla Nublar open: 09:00 - 17:00
Name: Skull open: 09:00 - 17:00
Name: Shutter open: 09:00 - 17:00
【其他数据结构】
时间: 2024-12-01 07:15:17