struct use case - linked lists

在说linked list数据结构前, 来想象一个场景。
假设要设计一个旅游线路,依次游览几个岛屿。如图,
struct use case - linked lists - 德哥@Digoal - The Heart,The World.
 
第一种设计思路如下 : 
typedef struct {
  char * name;
  char * opens;
  char * closes;
}
// 使用数组存储岛屿信息, 行程按照数组下标顺序进行.
island tour[4];

但是这里有两个明显的问题 : 
1. 扩展性问题, 如果临时改变行程增加游览的岛屿怎么办? 比如现在是游览4个岛屿, 要变成5个.
2. 灵活性问题, 如果游览的顺序改变怎么办? 那就要做数组的位置交换. 如图 : 
struct use case - linked lists - 德哥@Digoal - The Heart,The World.

那么有没有好的数据结构来解决这两个问题呢?
当然是有的, 就是这里要谈到的linked list. 也是一种递归结构. 就是结构体中存储了指向当前结构体的指针.
typedef struct island {
  char *name;
  char *opens;
  char *closes;
  struct island *next;
} island;

如图 : 
struct use case - linked lists - 德哥@Digoal - The Heart,The World.
 
代码如下 : 
[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

【其他数据结构】
struct use case - linked lists - 德哥@Digoal - The Heart,The World.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值