1-1 单向链表中的每个结点都需要动态分配内存空间。
对
1-2 通常使用结构的嵌套来定义单向链表结点的数据类型。
对
2-1链表不具有的特点是( )。3
- 不必事先估计存储空间
- 插入删除不需要移动元素
- 可随机访问任一元素
- 所需空间与线性表长度成正比
2-2设有如下定义的链表,则值为7的表达式是()。3
struct st{
int n;
struct st *next;
} a[3] = {5, &a[1], 7, &a[2], 9, NULL}, *p = &a;
- p->n
- (p->n)++
- (++p)->n
- p->next->n
不太明白为什么第四个选项不可以
2-3带表头附加结点的单链表head为空的判断条件是()。2
- head == NULL
- head->next == NULL
- head->next == head
- head != NULL
2-4一个函数功能不太复杂,但要求被频繁调用,选用( )。1
- 内联函数
- 重载函数
- 递归函数
- 嵌套函数
2-5重载函数在调用时选择的依据中,错误的是()。4
- 函数的参数
- 参数的类型
- 函数的名字
- 函数的类型
2-6以下有关函数的叙述中正确的是( )。3
- 函数必须返回一个值
- 函数体中必须有return语句
- 两个同名函数,参数表相同而返回值不同不算重载
- 函数执行中形参的改变会改变实参
2-7下列函数中,( )不能重载。3
- 成员函数
- 非成员函数
- 析构函数
- 构造函数
2-8下列关于函数重载的说法中,错误的是____。4
- 重载函数的参数个数不同
- 重载函数参数类型不同
- 重载函数的函数名必须相同
- 重载函数的返回值类型不同
2-9设单链表中结点的结构为
struct LinkNode{ //链表结点定义
E data; //数据
LinkNode * link; //结点后继指针
};
不带头结点的单链表first为空的判定条件是()。1
- first==NULL;
- first->link== NULL;
- first->link== first;
- first! = NULL;
2-10可以用带表头附加结点的链表表示线性表,也可以用不带头结点的链表表示线性表,前者最主要的好处是()。2
- 可以加快对表的遍历
- 使空表和非空表的处理统一
- 节省存储空间
- 可以提高存取表元素的速度
2-11已知指针ha和hb分别是两个单链表的头指针,下列算法将这两个链表首尾相连在一起,并形成一个循环链表(即ha的最后一个结点链接hb的第一个结点,hb的最后一个结点指向ha),返回该循环链表的头指针。请将该算法补充完整。2
typedef struct node{
ElemType data;
struct node *next;
}LNode;
LNode *merge(LNode *ha, LNode *hb) {
LNode *p=ha;
if (ha==NULL || hb==NULL) {
cout<<”one or two link lists are empty!”<<endl;
return NULL;
}
while ( p->next!=NULL )
p=p->next;
p->next=hb;
while ( p->next!=NULL )
p=p->next;
__________
}
- ha=p->next; return ha;
- p->next=ha; return ha;
- ha=p->next; return p;
- p->next=ha; return p;
2-12若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点,则采用()存储方式最节省运算时间。4
- 单链表
- 给出表头指针的单循环链表
- 双链表
- 带表头附加结点的双循环链表
2-13在单链表指针为p的结点之后插入指针为s的结点,正确的操作是()。2
- p->next=s;s->next=p->next;
- s->next=p->next;p->next=s;
- p->next=s;p->next=s->next;
- p->next=s->next;p->next=s;
2-14已知L是带头结点的单链表,则摘除首元结点的语句是( )。2
- L=L->link;
- L->link=L->link->link;
- L=L->link->link;
- L->link = L;
2-15单链表中,增加一个头结点的目的是( )。3
- 使单链表至少有一个结点。
- 标识表结点中首结点的位置。
- 方便运算的实现。
- 说明单链表是线性表的链式存储。
2-16需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是()。2
- 单链表
- 静态链表
- 线性链表
- 顺序存储结构
2-17下面叙述正确的是( )1
- 对单链表进行插入和删除运算时,不必移动元素,只要修改指针
- 对数组进行插入和删除运算时,不必移动元素
- 对单链表和数组进行插入和删除运算时,都必须移动大量元素
- 对单链表进行插入运算时,需要移动元素,而执行删除运算时不必移动元素
2-18在一个单链表head中,若要在指针p所指结点后插入一个q指针所指结点,则执行()。4
- p->next=q->next; q->next=p;
- q->next=p->next; p=q;
- p->next=q->next; p->next=q;
- q->next=p->next; p->next=q;
2-19以下程序的输出结果是( )。1
struct HAR
{int x, y; struct HAR *p;} h[2];
int main(void)
{ h[0].x=1; h[0].y=2;
h[1].x=3; h[1].y=4;
h[0].p=h[1].p=h;
printf(“%d%d\n”,(h[0].p)->x,(h[1].p)->y);
return 0; }
- 12
- 23
- 14
- 32
2-20以下程序的输出结果是( )。4
struct NODE{ int num; struct NODE *next; };
int main(void)
{ struct NODE *p,*q,*r;
p=(struct NODE*)malloc(sizeof(struct NODE));
q=(struct NODE*)malloc(sizeof(struct NODE));
r=(struct NODE*)malloc(sizeof(struct NODE));
p->num=10; q->num=20; r->num=30;
p->next=q;q->next=r;
printf(“%d\n”,p->num+q->next->num);
return 0; }
- 10
- 20
- 30
- 40
2-21下面程序段输入一行字符,按输入的逆序建立一个链表。2
struct node{
char info;
struct node *link;
} *top, *p;
char c;
top=NULL;
while((c=getchat())!='\n')
{ p=( struct node*)malloc(sizeof(struct node));
p->info=c;
;
top=p;
}
- top->link=p
- p->link=top
- top=p->link
- p=top->link
2-22在一个单链表head中,若要删除指针p所指结点的后继结点,则执行()。4
- p=p->next;free(p);
- p->next=p->next->next; free(p);
- q=p->next q->next=p->next; free(q);
- q=p->next; p->next=q->next; free(q);