数据结构-王道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);
    }
}
原文地址:https://www.cnblogs.com/--CYH--/p/6544556.html