数据结构-王道2017-第2章 线性表-2.3 综合题
单项选择题
1.链式存储用指针表示逻辑结构,而指针的设置是任意的,故可以很方便地表示各种逻辑结构。顺序存储只能用物理上的邻接关系来表示逻辑结构。
2.静态链表需要分配较大的连续空间,插入和删除不需要移动元素。若用单链表来表示队列,则应该选用带尾指针的循环链表,因为队列总是在队尾插入,队首删除,所以尾指针对头节点和尾节点的时间复杂度都为O(1);
3.在一个长度为n的带头节点的单链表h上,设有尾指针r,则执行删除单链表中最后一个元素操作与链表的表长有关,因为要置被删除结点的前驱结点的next指针为空。
4.在带头节点的链表中,head指向头节点,不带头节点时,head指向第一个元素。
5.带头节点的双循环链表L为空的条件是 "L->prior==L&&L->next==L",即判空的条件是头结点(头指针)的prior和next域都指向它自身。
综合应用题
1.设计一个递归算法,删除不带头节点的单链表L中所有值为x的结点。
void delx(LinkList& L, ElemType x) { if (L == NULL) return; if (L->data == x) { LNode *p = L; L = L->next; free(p); delx(L, x); } else { delx(L->next, x); } }
2.在带头结点的单链表中,删除所有值为x的节点,并释放其空间,假设值为x的结点不唯一
void delx2(LinkList &L, ElemType x) { LNode *p = L->next; LNode *pre = L; while (p) { if (p->data == x) { pre->next = p->next; free(p); p = pre->next; } else { pre = p; p = p->next; } } }
3.设L为带头节点的单链表,编写算法实现从尾到头反向输出每个节点的值(王道书上的答案只适用于不带头节点的单链表,因此是错误的)
void printReverse(LinkList &L) { if (L->next == NULL) return; printReverse(L->next); printf("%d ", L->next->data); }
4.在带头结点的单链表L中删除一个最小值的高效算法(假设最小值是唯一的)
//4.在带头结点的单链表L中删除一个最小值的高效算法(假设最小值是唯一的) void delMin( LinkList & L) { LNode *p = L->next,*pre = L; ElemType mi; if(p) mi = p->data; while (p) { if (p->next) { if (mi > p->next->data) { pre = p; mi = p->next->data; } p = p->next; } else { break; } } LNode *temp = pre->next; //最小值 if (temp != NULL) { pre->next = temp->next; free(temp); } }