既然理解了链表的构成,对链表的访问也就不成问题了。不过要特别注意的是,对于数组,我们可以利用下标直接访问任何一个元素(这被称为“随机访问”),而对于单向链表,只能从头结点开始,依次进行“顺序访问”。
假设我们已经按照前文创建了一个链表,下面我们设计一个函数,查找是否存在某数据:
尤其要注意第3行,由于我们的链表有不存储数据的头结点,要先将指针指向下一个结点,再访问数据。读者不妨想一想,如果使用无头结点的链表,指针后移的操作应该在何处进行。
假如我们需要将一个新结点(记为M)插入结点N后面,只需先将M的指针域指向N后面的结点(也就是N指针域所指的结点),再将N结点的指针域指向M即可。假设有一个指针p指向N结点,又有一个指向新结点M的指针p_new,那么只需进行如下操作:
下面我们设计一个函数,查找某数据并将新数据插入其后:
相对插入而言,结点的删除就是小菜一碟了。不过细细想来,似乎有一些问题——我们在找到要删除的数据时,指针p已经指向了要删除的结点,但是要进行的操作是:改变它的前一个结点(称为“前驱结点”)指针域的指向,而我们的链表是单向的,无法将指针向前移动,这该怎么办呢?
因此,我们需要使用一个指向前驱结点的指针,辅助进行删除操作。
下面我们设计一个函数,查找某数据并将其结点删除:
特别注意,最后一定不要忘记使用free()函数释放所删除结点的内存!否则会导致内存泄漏。
读完上面的例子,对链表的基本操作便理解完成了,现在,不妨回过头来,看看能否理解全部代码: