133从链表中删除结点 下面介绍如何从非空链表中删除q所指的结点。在讨论 这个问题时,必须考虑以下三种情形: (1)q所指向的是链表的第一个结点; (2)q所指向的结点的前驱结点的指针已知; (3)q所指向的结点的前驱结点的指针未知。 liste liste
1.3.3 从链表中删除结点 下面介绍如何从非空链表中删除q所指的结点。在讨论 这个问题时,必须考虑以下三种情形: (1)q所指向的是链表的第一个结点; (2)q所指向的结点的前驱结点的指针已知; (3)q所指向的结点的前驱结点的指针未知
134销毁一个链表 在链表使用完毕后建议销毁它,因为链表本身会占用内存空 间。如果一个系统中使用很多的链表,而使用完毕后又不及时地 销毁它,那么这些垃圾空间积累过多,最终可能导致内存的泄漏 甚至程序的崩溃。因此应当养成及时销毁不用的链表的习惯。 函数 destroy LinkList的作用是销毁一个链表list,它包括以 下步骤。 (1)首先将ist的内容赋值给p,这样p也指向链表的第 个结点,成为了链表的表头。 (2)然后判断只要p不为空(NULL),就将p指向的下 个结点的指针(地址)赋值给q,并应用函数free释放掉p所指向 的结点,p再指向下一个结点,如此循环,直到链表为空为止。 (3)最后将s的内容置为NULL,这样主函数中的链表 ist就为空了,防止了is变为野指针。而且链表在内存中也被完 全地释放掉了
1.3.4 销毁一个链表 在链表使用完毕后建议销毁它,因为链表本身会占用内存空 间。如果一个系统中使用很多的链表,而使用完毕后又不及时地 销毁它,那么这些垃圾空间积累过多,最终可能导致内存的泄漏 甚至程序的崩溃。因此应当养成及时销毁不用的链表的习惯。 函数destroyLinkList的作用是销毁一个链表list,它包括以 下步骤。 (1)首先将*list的内容赋值给p,这样p也指向链表的第一 个结点,成为了链表的表头。 (2)然后判断只要p不为空(NULL),就将p指向的下一 个结点的指针(地址)赋值给q,并应用函数free释放掉p所指向 的结点,p再指向下一个结点,如此循环,直到链表为空为止。 (3)最后将*list的内容置为NULL,这样主函数中的链表 list就为空了,防止了list变为野指针。而且链表在内存中也被完 全地释放掉了
135实例与分析 【实例1-3】编写一个程序,要求:从终端输入一组整 数(大于10个数),以0作为结束标志,将这一组整数存放 在一个链表中(结束标志0不包括在内),打印出该链表中 的值;然后删除该链表中的第5个元素,打印出删除后的结 果;最后在内存中释放掉该链表
1.3.5 实例与分析 【实例1-3】编写一个程序,要求:从终端输入一组整 数(大于10个数),以0作为结束标志,将这一组整数存放 在一个链表中(结束标志0不包括在内),打印出该链表中 的值;然后删除该链表中的第5个元素,打印出删除后的结 果;最后在内存中释放掉该链表
14栈 栈是一种重要的线性结构。可以这样讲,栈是前面讲过 的线性表的一种具体形式。也就是说,栈必须通过顺序表或 者链表来实现。顺序表或者链表既可以像前面介绍的那样独 立存在,组织和操作数据,同时它们也是一些特殊的数据结 构(栈,队列等)的实现的基础,它们的概念更宽泛一些
1.4 栈 栈是一种重要的线性结构。可以这样讲,栈是前面讲过 的线性表的一种具体形式。也就是说,栈必须通过顺序表或 者链表来实现。顺序表或者链表既可以像前面介绍的那样独 立存在,组织和操作数据,同时它们也是一些特殊的数据结 构(栈,队列等)的实现的基础,它们的概念更宽泛一些
141栈的定义 栈( stack)是一个后进先出(LFo: last in first ou的 线性表,它要求只在表尾进行删除和插入等操作。也就是说 ,所谓栈其实就是一个线性表(顺序表,链表),但是它在 操作上有一些特殊的要求和限制。首先,栈的元素必须先进 后出,这与一般的顺序表不同。其次,栈的操作只能限定在 这个顺序表的乳 出栊+入栈 表尾4 表头4 栈度 图19栈的示意+
1.4.1 栈的定义 栈(stack)是一个后进先出(LIFO: last in first out)的 线性表,它要求只在表尾进行删除和插入等操作。也就是说 ,所谓栈其实就是一个线性表(顺序表,链表),但是它在 操作上有一些特殊的要求和限制。首先,栈的元素必须先进 后出,这与一般的顺序表不同。其次,栈的操作只能限定在 这个顺序表的表尾进行