线性表 - 习题
在下列叙述中,( ) 是正确的。
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; // 后移指针,再将后面结点插入适当位置

浙公网安备 33010602011771号