计算机二级

有以下结构体说明和变量定义,相应的链表如图所示:struet node { int data; struet node * next; *p,*q,*r;现将q所指结点多链表中删除,同时要保持链表的连续,以下不能完成指定操作的语句是( )。A.p- >next=q->next;B.p->next=p->next->next;C.p->next=r;D.p=q->next

题目

有以下结构体说明和变量定义,相应的链表如图所示:

struet node { int data; struet node * next; *p,*q,*r;现将q所指结点多链表中删除,同时要保持链表的连续,以下不能完成指定操作的语句是( )。

A.p- >next=q->next;

B.p->next=p->next->next;

C.p->next=r;

D.p=q->next

如果没有搜索结果,请直接 联系老师 获取答案。
如果没有搜索结果,请直接 联系老师 获取答案。
相似问题和答案

第1题:

若有以下定义:

struct link

{ int data;

struct link *next;

} a,b,c,*p,*q;

且变量a和b之间已有如下图所示的链表结构:

指针p指向变量a,q指向变量c。则能够把c插入到a和b 之间并形成新的链表的语句组是:

A.a.next=c; c.next=b;

B.p.next=q; q.next=p.next;

C.p->next=&c; q->next=p->next;

D.(*p).next=q; (*q).next=&b;


正确答案:D
解析:本题考查链表的数据结构,必须利用指针变量才能实现,即一个结点中应包含一个指针变量,用它存放下一结点的地址。

第2题:

有以下程序: include include struct NODE {int num;struct NODE *next; }

有以下程序:

#include <stdio.h>

#include <stdlib.h>

struct NODE

{ int num;

struct NODE *next;

};

main()

{ struet NODE *p,*q,*r;

int sum=0;

p=(struct NODE *) malloc(sizeof(struct NODE));

q=(struct NODE *) malloc(sizeof(struet NODE));

r=(struct NODE *) malloc(sizeof(struct NODE));

P- >num=1;q- >num=2;r->num=3;

p- >next=q;q- >next=r;r- >next=NULL;

sum + =q- >next- >num;sum + =P- >num;

printf("%d\n",sum);

}

执行后的输出结果是( )

A.3

B.4

C.5

D.6


正确答案:B
解析:程序中q->next=r,所以q->next->num即为r->num,值为3,而p->num=1,所以sum=3+1=4。

第3题:

有以下结构体说明和变量定义,如图所示,指针p、q、r分别指向此链表中的三个连续节点。 struct node {int data;struct node*next;}*P,*q,*r; 现要将q所指节点从链表中删除,同时要保持链表的连续,

以下不能完成指定操作的语句是( )。

A.p->next=q->next;

B.p->next=P->next->next;

C.p->next=r;

D.p=q->next;


正确答案:D
解析:本题的考点是链表的指针操作。要想将q所指节点从链表中删除,同时要保持链表的连续,从图上看,应该将p->next=r,由于q->next、p->next->next都指向r,因此p->next=q->next、p->next=p->next->next同样可以实现指定的操作。因此选项A、B、C都能完成指定操作。而选项D“p=q->next”只是将指针p指向了r,不能完成指定的操作。因此正确选项是D。

第4题:

链表题:一个链表的结点结构

struct Node

{

int data ;

Node *next ;

};

typedef struct Node Node ;

(1)已知链表的头结点head,写一个函数把这个链表

逆序( Intel)


正确答案:

Node * ReverseList(Node *head) //链表逆序
{
if ( head == NULL || head->next == NULL )
return head;
Node *p1 = head ;
Node *p2 = p1->next ;
Node *p3 = p2->next ;
p1->next = NULL ;
while ( p3 != NULL )
{
p2->next = p1 ;
p1 = p2 ;
p2 = p3 ;
p3 = p3->next ;
}
p2->next = p1 ;
head = p2 ;
return head ;
}

第5题:

有以下结构体说明和变量定义,如图所示: struct node {int data;struct node *next;} *p,*q,*r,

现妥将q所指结点从链表中删除,同时要保持链表的连续,以下不能完成指定操作的语句是______。

A.P->next=q->next;

B.p->next=(p->next->next;

C.p->next=r

D.p=q->next;


正确答案:D
解析:要想将q所指结点从链表中删除,同时保持链表的连续,必需使p结点的next指向r,在四个选项中,只有选项 D不能做到。

第6题:

有以下结构体说明和变量定义,如图所示,指针p、q、r分别指向一个链表中的三个连续结点。

struct node

{ int data;

struct node *next;

} *p, *q, *r;

现要将q和r所指结点的先后位置交换,同时要保持链表的连续,以下错误的程序段是

A.r->next=q; q->next=r->next; p->next=r;

B.q->next=r->next; p->next=r; r->next=q;

C.p->next=r; q->next=r->next; r->next=q;

D.q->next=r->next; r->next=q; p->next=r;


正确答案:A
解析:“r->next=q;”表示r的下一个结点为qo“q->next=->next;”则表示q的下一个结点是r的下一个结点,即q结点本身,因此与后续结点便断开了联系。

第7题:

假定已建立以下链表结构,且指针p和q已指向如图所示的结点:

则以下选项中司将q所指结点从链表中删除并释放该结点的语句组是______。

A.(*p).next=(*q).next; free(p);

B.p=q->next; free(q);

C.p=q; free(q);

D.p->next=q->next; free(q);


正确答案:D
解析:本题题面要求删除q所指结点并释放该结点,而选项A中虽然是删除了q所指鲒点,但并未释放q这个结点,而释放的是p结点,所以选项A错误;选项B是将q的下一结点的地址赋值给指针变量p,这意味着p原来的成员变量内容被q的下一结点的成员变量内容所代替,即原p结点也被删除了,所以选项B错误;选项C相当于将q的所有成员变量内容代替了p的所有成员变量内容,即p结点被删除,所以错误;选项D是将q的下—结点的地址赋值给p的成员next (成员next用于存放一结点的地址),使得p的next成员不再指向q,而是指向q的下一结点,相当于删除了q这个结点,同叫用free函数正确释放了q这一结点,所以选项D正确。

第8题:

有以下结构体说明和变量的定义,且指针p指向变量a,指针q指向变量b。则不能把节点b连接到节点a 之后的语句是

struct node

{ char data;

struct node*next;

}a,b,*p= &a,*q=&b;

A.a. next=q;

B.p. next= &b;

C.p->next=&b;

D.(*p).next=q;


正确答案:B

第9题:

阅读以下说明和C语言函数,将应填入(n)。

【说明】

已知包含头结点(不存储元素)的单链表的元素已经按照非递减方式排序,函数 compress(NODE*head)的功能是去掉其中重复的元素,使得链表中的元素互不相同。

处理过程中,当元素重复出现时,保留元素第一次出现所在的结点。

图2-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*/


正确答案:(1)head->next (2)ptr (3)q->data == ptr->data 或ptr->next->data==ptr->data或其等价表示 (4)ptr->next (5)ptr
(1)head->next (2)ptr (3)q->data == ptr->data 或ptr->next->data==ptr->data,或其等价表示 (4)ptr->next (5)ptr 解析:本题考查基本程序设计能力。
链表上的查找、插入和删除运算是常见的考点。本题要求去掉链表中的重复元素,使得链表中的元素互不相同,显然是对链表进行查找和删除操作。
对于元素已经按照非递减方式排序的单链表,删除其中重复的元素,可以采用两种思路。
1.顺序地遍历链表,对于逻辑上相邻的两个元素,比较它们是否相同,若相同,则删除后一个元素的结点,直到表尾。代码如下:
ptr=head->next;/*取得第一个元素结点的指针*/
while(ptr && ptr->next){ /*指针ptr指示出重复序列的第一个元素结点*/
q=ptr->next;
while(q && ptr->data==q->data){/*处理重复元素*/
ptr->next=q->next;/*将结点从链表中删除*/
free(q);
q=ptr->next; /*继续扫描后继元素*/
}
ptr=ptr->next;
}
2.对于每一组重复元素,先找到其中的第一个结点,然后向后查找,直到出现一个相异元素时为止,此时保留重复元素的第一个结点,其余结点则从链表中删除。
ptr=head->next;/*取得第一个元素结点的指针*/
while(ptr && ptr->next){/*指针ptr指示出重复序列的第一个元素结点*/
q=ptr->next;
while(q && ptr->data==q->data) /*查找重复元素*/
q=q->next;
s=ptr->next; /*需要删除的第一个结点*/
ptr->next=q; /*保留重复序列的第一个结点,将其余结点从链表中删除*/
while(s && s!=q}{/*逐个释放被删除结点的空间*/
t = s->next;free(s);s = t;
}
ptr=ptr->next;
}
题目中采用的是第一种思路。

第10题:

有以下结构说明和变量定义,指针p、q、r分别指向链表中的3个连续结点。

A.

B.

C.

D.

现要将q所指结点从链表中删除,同时要保持链表的连续,以下不能按要求完成操作的语句是( )。

A.A

B.B

C.C

D.D


正确答案:D
本题考查链表结点的删除,q->next中存放的是r所指结点的首地址,将r所指结点的首地址存于p->next中,则实现删除q所指点的功能,并保持链表连续,p所指点与r所指结点相连。

更多相关问题