在链表中插入值

通过修改指针的值,就可以插入island,就像之前做的那样:

在链表中插入值 - 图1

短短两行代码,就在链表插入了新值。但如果用数组,为了移动数组元素,你要多写很多代码。

好了,你已经学会了链表的创建与使用,现在就来练练吧……

在链表中插入值 - 图2代码冰箱贴

不好啦,有人弄乱了冰箱门上的display()函数,你能重组代码吗?

在链表中插入值 - 图3

在链表中插入值 - 图4代码冰箱贴解答

不好啦,有人弄乱了冰箱门上的display()函数,你重组代码了吗?

在链表中插入值 - 图5

这里没有蠢问题

问:其他语言,比如Java,有内置链表,C语言有内置数据结构吗?

:C语言没有内置数据结构,你必须自己创建它们。

问:要是我有一个很长的链表,如果我想使用第700个元素,就必须从第一个开始一路读下去吗?

:是的,你必须这样做。

问:这样可不好,本来我以为链表比数组好。

:数据结构没有好与坏之分,只有适合或不适合于它的应用场合之分。

问:也就是说如果我想快速地插入数据,就需要链表,但如果我想直接访问元素,就应该用数组。是这样吗?

:完全正确。

问:你给出的这个结构含有一个指向其他结构的指针。我能把指针换成一个递归定义的结构吗?

:不行。

问:为什么?

:C语言需要知道结构在存储器中占的具体大小,如果在结构中递归地复制它自己,那么两条数据就会不一样大。

在链表中插入值 - 图6试驾

我们对island链表使用display()函数,并把代码编译成一个叫tour的程序。

在链表中插入值 - 图7

妙极了,代码创建了island链表,还能方便地插入元素。

好了,现在你已经掌握了使用递归结构和链表的基本方法,现在来看主程序。你需要从下面这个文件中读取飞行之旅的数据:

在链表中插入值 - 图8

机场的工作人员还在创建文件,在程序停止之前,你都不知道文件有多大。文件中每一行都是一个岛名,把文件转换为链表应该不难,你说呢?

在链表中插入值 - 图9C标准礼貌指南

本页上的代码在中间的位置声明了新变量skull,只有C99和C11标准才允许这样做,在ANSI C中,必须在函数的顶部声明局部变量。

在链表中插入值 - 图10

没错,需要以某种方法创建动态存储。

到目前为止你写过的所有程序都使用了静态存储。每当你想保存一样东西,都在代码中添加了一个变量。这些变量通常保存在栈中,别忘了,栈是存储器中专门用来保存局部变量的区域。

当你创建前四座岛时,写了:

  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结构都需要自己的变量。上面这段代码始终只会创建这四座岛。如果想要让代码保存更多的island,需要使用更多的局部变量。如果在编译时知道需要保存多少数据,那没问题,但程序在运行前往往不知道自己需要多少存储空间。打个比方,假如你在编写网页浏览器,那么在读取网页之前就不知道保存网页需要多少存储空间。因此C程序需要以某种方式让操作系统在它们需要的时候分配存储空间。

程序需要动态存储。

在链表中插入值 - 图11