在链表中插入值
通过修改指针的值,就可以插入island
,就像之前做的那样:
短短两行代码,就在链表插入了新值。但如果用数组,为了移动数组元素,你要多写很多代码。
好了,你已经学会了链表的创建与使用,现在就来练练吧……
代码冰箱贴
不好啦,有人弄乱了冰箱门上的display()
函数,你能重组代码吗?
代码冰箱贴解答
不好啦,有人弄乱了冰箱门上的display()
函数,你重组代码了吗?
这里没有蠢问题
问:其他语言,比如Java,有内置链表,C语言有内置数据结构吗?
答:C语言没有内置数据结构,你必须自己创建它们。
问:要是我有一个很长的链表,如果我想使用第700个元素,就必须从第一个开始一路读下去吗?
答:是的,你必须这样做。
问:这样可不好,本来我以为链表比数组好。
答:数据结构没有好与坏之分,只有适合或不适合于它的应用场合之分。
问:也就是说如果我想快速地插入数据,就需要链表,但如果我想直接访问元素,就应该用数组。是这样吗?
答:完全正确。
问:你给出的这个结构含有一个指向其他结构的指针。我能把指针换成一个递归定义的结构吗?
答:不行。
问:为什么?
答:C语言需要知道结构在存储器中占的具体大小,如果在结构中递归地复制它自己,那么两条数据就会不一样大。
试驾
我们对island
链表使用display()
函数,并把代码编译成一个叫tour
的程序。
妙极了,代码创建了island
链表,还能方便地插入元素。
好了,现在你已经掌握了使用递归结构和链表的基本方法,现在来看主程序。你需要从下面这个文件中读取飞行之旅的数据:
机场的工作人员还在创建文件,在程序停止之前,你都不知道文件有多大。文件中每一行都是一个岛名,把文件转换为链表应该不难,你说呢?
C标准礼貌指南
本页上的代码在中间的位置声明了新变量
skull
,只有C99和C11标准才允许这样做,在ANSI C中,必须在函数的顶部声明局部变量。
没错,需要以某种方法创建动态存储。
到目前为止你写过的所有程序都使用了静态存储。每当你想保存一样东西,都在代码中添加了一个变量。这些变量通常保存在栈中,别忘了,栈是存储器中专门用来保存局部变量的区域。
当你创建前四座岛时,写了:
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
结构都需要自己的变量。上面这段代码始终只会创建这四座岛。如果想要让代码保存更多的island
,需要使用更多的局部变量。如果在编译时知道需要保存多少数据,那没问题,但程序在运行前往往不知道自己需要多少存储空间。打个比方,假如你在编写网页浏览器,那么在读取网页之前就不知道保存网页需要多少存储空间。因此C程序需要以某种方式让操作系统在它们需要的时候分配存储空间。
程序需要动态存储。