线性表 - 习题

在下列叙述中,( ) 是正确的。

A. 线性表的逻辑顺序与物理顺序总是一致的
B. 二叉树的顺序存储结构比链式存储结构节省存储空间
C. 二叉树的度小于等于 2
D. 每种数据结构都有两种基本运算(操作):插入、删除元素(结点)
解:

  • 选 C。对于 B 选项,顺序存储可能会浪费空间(在非完全二叉树的时候)

 
顺序存储方式只能用于存储线性结构 ( )

解:错。顺序存储还可用于存储非线性结构,完全二叉树是属于非线性结构,但其最佳存储方式是顺序存储

 
集合与线性表的区别在于是否按关键字排序 ( )

解:错。线性表不一定按关键字排序;集合内的元素无逻辑关系;线性表允许存在相同的元素,集合不允许

 
指针 p 指向单链表某个结点,在指针 p 所指节点之前插入 s 所指结点。操作序列为:

解:在后方插入结点后互换。s->next = p->next; p->next = s; p->data <--> s->data;

 
下面是用 C 语言编写的不带头结点的单链表进行就地逆置的算法,该算法用 L 返回逆置后的链表的头指针,试在空缺处填入适当的语句

void reverse (linklist &L)
{
    p = null;
    q = L;
    while (q != null)
    {
        _____;
        q->next = p;
        p = q;
        _____;
    }
    _____;
}

解:

  • L = L->next;
  • q = L;
  • L = p;

 
对单链表的元素按插入方法排序的 C 语言描述算法如下,其中 L 为链表头结点指针。请填充算法中标出空白处,完成其功能。

typedef struct node
{
    int data;
    struct node *next;
} linknode, *link;

void Insertsort(link L)
{
    link p, q, r, u;
    p = L->next;
    _____;
    while (_____)
    {
        r = L;
        q = L->next;
        while (_____ && q->data <= p->data)
        {
            r = q;
            q = q->next;
        }
        u = p->next;
        _____;
        _____;
        p = u;
    }
}

解:

  • L->next = null        // 置空链表
  • p != null             // 或 p,判断当前链表尚未到尾
  • q != p                // 查 p 结点在链表中插入位置,这时 q 是工作指针
  • p->next = r->next    // 或 p -> next = q,将 p 结点链入链表中
  • r->next = p           // r 是 q 的前驱,u 是下个待插入结点的指针

 
一线性表存储在带头结点的双线循环链表中,L 为头指针。对如下算法:

(1)说明该算法的功能            (2)在空缺处填写相应的语句

void unknown (BNODETP *L)
{
    p = L->next;
    q = p->next;
    r = q->next;
    while (q != L)
    {
        while (p != L) && (p->data > q->data)
            p = p->prior;
        q->proir->next = r;
        _____;
        q->next = p->next;
        q->proir = p;
        _____;
        _____;
        q = r;
        p = q->proir;
        _____;
    }
}

解:

  • 本算法功能是将双循环链表结点的数据域按值自小到大排序,成为非递减有序双向链表
  • r->proir = q->prior;            // 将 q 结点摘下,以便插入适当位置
  • p->next->prior = q;             // 将 q 结点插入
  • p->next = q;
  • r = r->next; 或 r = q->next;    // 后移指针,再将后面结点插入适当位置
posted @ 2021-11-02 18:37  絵守辛玥  阅读(540)  评论(0)    收藏  举报