HeadFirstC笔记_6  数据结构与动态存储:牵线搭桥

保存可变数量的数据
由于数组长度是固定的,为了保存可变数量的数据,需要一个比数组更灵活的东西,即链表。

链表就是一连串的数据
链表是一种抽象数据结构。链表是通用的,可以用来保存很多不同类型的数据,所以被称之为抽象数据结构。
链表保存了一条数据和一个指向另一条数据的链接。

在链表中插入数据
如果想在A和B之间插入C,只要将A中原本指向B的链接改成指向C,然后把C中的链接指向B,就可以插入一个新值了。他的优点就是
插入数据非常快。
相对而言,如果想在数组中插入
一个值,就不得不将插入点后所有数据后移一个位置,效率较低。

如何在C语言中创建链表?
那就是 创建递归结构
链表中的每个结构都需要与下一个结构相连。如果一个结
构包含一个链向同种结构的链接,那么这个结构就被称为 
递归结构。
递归结构含有指向同种结构的指针。如果你有一张航班时间表,上面列出了将要游览的岛屿,就可以用递归结构表示 island ,
下面具体讨论递归结构是怎么工作的:
       
       
       
  1. typedef struct island { // 你必须为这个结构命名。
  2. char *name;
  3. char *opens;
  4. char *closes;
  5. struct island *next; // 你在结构中保存了一个指针,指向下一座岛。
  6. } island;
如何在当前结构中保存链向下一个结构的链接呢?用指针。
只要在结构中保存指针, island 数据就含有下一个我们将游览的 island 的地址。只要我们的代码能访问一个 island ,就能够跳到下一个island 。
注意:递归结构要有名字。
当用typedef命令定义结构时可以跳过为结构起名字这步,但在递归结构中,需要包含一个相同类型的指针, C语言的语法不允许用typedef
别名来声明它,因此必须为结构起一个名字。这就是为什么这里的结构叫struct island。

用C语言创建岛屿……
一旦定义了 island 数据类型,就可以像这样创建第一批island :
       
       
       
  1. island amity = { "Amity", "09:00", "17:00", NULL};
  2. island craggy = { "Craggy", "09:00", "17:00", NULL};
  3. island isla_nublar = { "Isla Nublar", "09:00", "17:00", NULL};
  4. island shutter = { "Shutter", "09:00", "17:00", NULL};
刚开始我们把每个 island 中的 next 字段都设为了 NULL 。在C语言中, NULL 的值实际上为0, NULL专门用来把某个指针设为0。

……把它们链接在一起,构成飞行之旅
一旦你创建好了岛,就可以把它们连接在一起:
        
        
        
  1. amity.next = &craggy;
  2. craggy.next = &isla_nublar;
  3. isla_nublar.next = &shutter;
这样就创建了一次完整的跳岛游

在链表中插入值
通过修改指针的值,就可以插入 island ,就像之前做的那样:
         
         
         
  1. island skull = { "Skull", "09:00", "17:00", NULL};
  2. isla_nublar.next = &skull;
  3. skull.next = &shutter;
短短两行代码,就在链表插入了新值。但如果用数组,为了移动数组元素,你要多写很多代码。

代码示例:
         
         
         
  1. #include <stdio.h>
  2. typedef struct island { // 你必须为这个结构命名。
  3. char *name;
  4. char *opens;
  5. char *closes;
  6. struct island *next; // 你在结构中保存了一个指针,指向下一座岛。
  7. } island;
  8. void display(island *start) {
  9. island *i = start;
  10. for (; i!=NULL ; i = i->next ) { //需要一直循环下去,直到当前island没有next值,在每次循环的最后,跳到下一座岛
  11. printf("Name: %s\n open: %s-%s\n", i->name, i->opens , i->closes );
  12. }
  13. }
  14. int main() {
  15. island amity = { "Amity", "09:00", "17:00", NULL};
  16. island craggy = { "Craggy", "09:00", "17:00", NULL};
  17. island isla_nublar = { "Isla Nublar", "09:00", "17:00", NULL};
  18. island shutter = { "Shutter", "09:00", "17:00", NULL};
  19. amity.next = &craggy;
  20. craggy.next = &isla_nublar;
  21. isla_nublar.next = &shutter;
  22. island skull = { "Skull", "09:00", "17:00", NULL};
  23. isla_nublar.next = &skull;
  24. skull.next = &shutter;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值