2.1 简答题(不用抄题目)
1. 一个顺序表(即一批地址连续的存储单元)第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是多少?
顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5和1之间隔4个空(1 2 3 4 5)
故第5个元素的地址是108【100+4*2】(注意:不是110)
2. 线性表的顺序存储结构和链式存储结构的优缺点是什么?
//线性表:n个数据元素(结点)a[0],a[1],a[2],,,a[n-1]组成的有限序列。
//顺序存储时,相邻数据元素的存放地址也相邻(逻辑和物理统一);要求内存中存储单元的地址必须是连续的。
优点:可以随机存储,存储密度大,易于查找和修改。
缺点:插入或者删除元素不方便;存储空间利用率低,预先分配内存可能会造成浪费。
//链式存储时,相邻数据元素可以随意存放,但是所占存储空间分两部分,一部分存放结点值,另一部分存放指针。
优点:插入删除元素很方便;存储空间利用率高。
缺点:存储密度小,无法随机存储,查找和修改需要遍历整个链表。
3. 顺序存储的特点是什么?链式存储结构的特点是什么?
顺序存储的特点:
1.顺序表的特点是随机存取,即逻辑上相邻的数据元素,物理存储位置也相邻;
2.顺序表的存储空间要预先分配;
3.存储密度大,插入、删除操作效率较差;
4.数据元素顺序存放,每个结点只有一个元素;
5.存储位置反映数据元素间的逻辑关系。
链式存储的特点:
1.每个结点包含数据元素信息以及一组指针,指针反映数据元素间的逻辑关系;
2.链式存储不要求存储空间连续,便于进行插入和删除操作,存储空间利用率较低;
3.由于逻辑上相邻的数据元素在存储空间上不一定相邻,所以不能对其进行随机存取。
4.如果存储某高校的某班级的同学录(人员名单基本固定),采用什么存储结构好,为什么?如果记录每天参加长跑的人员名单(每天的人员都不一样),采用什么存储结构好,为什么?
存储某高校的某班级的同学录:顺序存储;因为名单基本固定,不需要进行删除数据操作,顺序存储的存储密度大,节省空间的同时还易于查找。
记录每天参加长跑的人员名单:链式存储;因为每天的人员不一样,即会频繁地进行插入、删除,而链式存储插入、删除元素很方便。
5. 不带头结点的单链表head(指针域是next),判断空表的条件是什么?如果带头结点,判断空表的条件是什么?如果head带头结点且改成循环单链表,判断p所指向的结点是否为尾结点的条件是什么?
2.带头点的单链表的判空条件为 :head->next==NULL
3.带头结点的循环单链表判断p所指向的结点是否为尾结点的条件:p!=NULL && p->next==head
6. 在双向循环链表中(向前的指针用left表示,向后的指针用right表示),在p结点之前插入s结点的操作语句是什么?在p结点之后插入s结点的操作语句是什么?删除p所指向结点的操作语句是什么?删除p所指向结点的后继结点的操作语句是什么?
在p结点之前插入s结点的操作语句:
s->right=p;
p->left->right=s;
s->left= p ->left;
p->left=s;
在p结点之后插入s结点的操作语句:
s->right=p->right;
p->right=s;
s->left=p;
s->right->left=p;
删除p所指向结点的操作语句:
①、p->left->right = p->right;
②、p->right->left = p->left;
删除p所指向结点的后继结点的操作语句是:
1.P->right = p->right->right;
2.p->right->right->left = p;
7. 在一个单链表中(结点指针域是next),已知q所指结点是p所指结点的前驱结点,在q和p之间插入s结点的操作语句是什么?在p之后插入s结点的操作语句是什么?若删除p所指结点的后继结点,则执行什么操作语句?
在q和p之间插入s结点的操作语句: q->next=s; s->next=p;
在p之后插入s结点的操作语句:s->next=p->next; p->next = s;
若删除p所指结点的后继结点:p->next = p->next->next;
8. 在一个具有n个结点的单链表中查找其值等于x结点时,在查找成功的情况下,需要平均比较多少次?
从一个具有n个结点的单链表中查找其值等于x的结点时,在查找成功的情况下,需平均比较(n+1)/2个元素结点。
9.在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是多少?
O(n);
单链表插入时间应该是O(1);但要维持有序状态,就应该从头结点开始逐个进行比较扫描,最好情况O(1),最坏O(n),平均情况O(n/2);
综上,时间复杂度为O(n)。
10. 给定n个元素的顺序表,建立一个有序单链表的时间复杂度是多少?(参考书上例2.8)
建立一个有n个元素的有序单链表的时间复杂度是O(n^2),因为对单链表而言,一些快速的排序算法不能用,只能用直接插入等o(n^2) 级的排序算法来实现排序。而有序单链表每次插入到链表尾结点,那么每次插入都要从头扫到尾,即1+2+3+… n = O(n^2)。
11. 对于一个具有n个结点的单链表,在已知p所指结点后插入一个新结点的时间复杂度是多少?在给定值为x的结点后插入一个结点,必须先找到哪个结点,然后再修改指针?查找的时间复杂度是多少?
在已知p所指结点后插入一个新结点的时间复杂度是:O(1);
给定值为x的结点后插入一个结点,必须先找到x的前驱结点;
查找的时间复杂度:O(n);在指定节点后插入节点需要遍历链表查找条件节点,再进行插入。所以复杂度为O(n)。
12 在一个长度为n的顺序表中第i个元素(1 ≤ i ≤ n+1)之前插入一个元素时,需向后移动多少个元素?删除第i个元素(1 ≤ i ≤ n)时,向前移动多少个元素?
在一个长度为n的顺序表中第i个元素之前插入一个元素时,需向后移动n-i+1个。
删除第i个元素(1 ≤ i ≤ n)时,向前移动n-i个元素。
13. 线性表的顺序存储是通过什么来反映元素之间的逻辑关系,而链式存储结构是通过什么来反映元素之间的逻辑关系。
在线性表的顺序存储结构中,元素之间的逻辑关系是通过(数据元素的存储地址)/(数据元素的前后顺序)决定的;
在线性表的链接存储中,元素之间的逻辑关系是通过(结点中的指针)决定的。
- 什么叫随机存取特性?
随机存取(直接存取,Random Access)指的是当存储器中的数据被读取或写入时,所需要的时间与该数据所在的物理地址(存储位置)无关。
随机存取可以通过下标直接访问到元素的位置,时间复杂度永远为O(1),例如数组:存取第N个数据时,不需要访问前(N-1)个数据,直接就可以对第N个数据操作。
- 只带尾针的循环单链表,其优点是什么?
可以在表尾操作;找头、找尾都方便;可以很好的解决插入或删除高于表长的问题(运用取模运算)
只带尾针的循环单链表指:最后节点的指针域指向表头节点,如果要删除第一个元素,只需要通过表尾指针找到第二个节点,然后将最后节点的指针指向第二个节点,就将第一个元素删除了;
在最后一个元素后面插入新元素时,先找到表头,然后将新元素的指针域指向表头,然后再将表尾指向新元素就可以实现,此高效算法的复杂度为O(1)。