文章目录
- 0.抽象数据类型(ADT)的优点?
- 1.为什么需要链表?
- 2.链表的概念?
- 3.队列的概念?
- 4.为什么需要二叉查找树?
0.抽象数据类型(ADT)的优点?
- ADT版本可读性高,隐藏编程细节,对终端用户隐藏数据表示的细节。
- 可复用。用户接口是根据抽象操作定义的,不是根据某些特定的数据表示和算法来定义。
- 方便找bug,如果程序运行出现问题,可以把问题定位到具体函数上。如果有更好的方法,只需重写相应的函数。
- 可扩展性好,如果需要性能,可添加新函数,不用修改实现程序。
1.为什么需要链表?
- 使用数组时,数据表示不够灵活。如果只需20个元素,程序不必分配存放500个元素的空间。所以应使用动态内存分配来表示数据,使所需内存量在运行时确定。
- 使用malloc分配合适的内存空间,此时数据的查找不方便。添加数据时,如果输入300个数据,需要malloc300次,无法保证调用malloc()都能分配到连续的内存块,意味着数据不一定被连续存储。 此时需要存储300个指针,每个指针指向一个单独存储的结构。
- 使用malloc为新结构分配空间时,也为新指针分配空间。每个新结构中包含指向next结构的指针。创建新结构时,可以把该结构地址存储在上一个结构中。这样可以良好的表示和查找数据。
- 链表结构含有指向同类型结构的指针。
2.链表的概念?
定义一个结构体,里面包含了几个变量,还有指向同类型结构的指针。
#define TSIZE 45
struct film{char title[TSIZE];int rating;struct film * next;
}
struct film * head;
- 需要一个单独的指针存储第一个结构的地址,被称为头指针。
- 如果加入新的数据,首先分配内存空间,然后把新结构的地址存储在第一个结构的next成员中,并把新结构的next成员设置为NULL,表明该结构是链表中最后一个结构。
- 显示这个链表,根据该项存储的地址定位下一个项。
- 释放链表,调用free。
3.队列的概念?
- 队列是具有两个特殊属性的链表,新项只能添加到链表的末尾,只能从链表的开头移除项。先进先出的数据形式。
4.为什么需要二叉查找树?
- 访问元素有两种,随机访问:使用数组下标直接访问该数组中的任意元素;顺序访问:对于链表而言,必须从链表首节点开始,逐个节点移动到要访问的节点。
- 用数组可以实现二分查找,因为可以使用数组下标确定数组中任意部分的中点。但是链表只支持顺序访问,不提供跳至中间节点的方法,所以链表中不能使用二分查找。
- 有一种数据形式的需求,既支持频繁插入和删除项,又支持频繁查找。此时需要二叉查找树。