[说明]
已知包含头节点(不存储元素)的单链表的元素已经按照非递减方式排序,函数compress(NODE *head)的功能是去掉其中重复的元素,使得链表中的元素互不相同。
处理过程中,当元素重复出现时,保留元素第一次出现所在的节点。
图8-29(a)、(b)是经函数compress( )处理前后的链表结构示例图。
链表的节点类型定义如下:
typedef struct Node {
int data;
struct Node *next;
}NODE;
[C语言函数]
void compress(NODE *head)
{
NODE *ptr, *q;
ptr= (1) ; /*取得第一个元素节点的指针*/
while( (2) && ptr->next) {
q=ptr ->next;
while(q && (3) ){/*处理重复元素*/
(4) =q ->next;
free(q);
q=ptr->next;
}
(5) =ptr->next;
} /*end of while*/
} /*end of compress*/
第1题:
试题四(共 15 分)
阅读以下说明和 C 语言函数,将应填入 (n) 处的字句写在答题纸的对应栏内。
[说明]
已知包含头结点(不存储元素)的单链表的元素已经按照非递减方式排序,函数compress(NODE *head)的功能是去掉其中重复的元素,使得链表中的元素互不相同。
处理过程中,当元素重复出现时,保留元素第一次出现所在的结点。
图4-1(a)、(b)是经函数 compress()处理前后的链表结构示例图。
链表的结点类型定义如下:
typedef struct Node {
int data;
struct Node *next;
}NODE;
[C 语言函数]
void compress(NODE *head)
{ NODE *ptr,*q;
ptr = (1) ; /* 取得第一个元素结点的指针 */
while ( (2) && ptr -> next) {
q = ptr -> next;
while(q && (3) ) { /* 处理重复元素 */
(4) = q -> next;
free(q);
q = ptr -> next;
}
(5) = ptr -> next;
}/* end of while */
}/* end of compress */
第2题:
已知一个带头结点单链表,试完成以下操作: (1)写出带头单链表存储结构 (2)完成函数int GetElem(LinkList L,ElemType e),实现在链表中查找某个元素(元素值为e)是否存在,若存在则返回其在链表中的元素次序位置,若不存在则返回0。 (3)完成函数int ListInsert_L(LinkList L,int i,ElemType e),实现在第i个元素后面插入一个元素值为e的操作函数。
第3题:
如果对含有n(n>1)个元素的线性表的运算只有4种,即删除第一个元素、删除尾元素、在第一个元素前面插入新元素、在尾元素的后面插入新元素,则最好使用()。
A.只有尾节点指针没有头节点的循环单链表
B.只有尾节点指针没有头节点的非循环双链表
C.只有首节点指针没有尾节点指针的循环双链表
D.既有头指针也有尾指针的循环单链表
第4题:
第5题:
假设某个含有n个元素的线性表有如下运算: Ⅰ.查找序号为i(1≤i≤n)的元素 Ⅱ.查找第一个值为x的元素 Ⅲ.插入第一个元素 Ⅳ.插入最后一个元素 Ⅴ.插入第i(1≤i≤n)个元素 Ⅵ.删除第一个元素 Ⅶ.删除最后一个元素 Ⅷ.删除第i(1≤i≤n)个元素 现设计该线性表的如下存储结构: ① 顺序表 ② 带头节点的单链表 ③ 带头节点的循环单链表 ④ 不带头节点仅有尾节点的循环单链表 ⑤ 带头节点的双链表 ⑥ 带头节点的循环双链表. 指出各种存储结构中对应运算算法的时间复杂度。