第三章 链表 基本题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如果采用链接存储表示,一个表的存储空间可以连续,可以不连续。表的增长通过动态存储分配解决,只要存储器未满,就不会有表溢出的问题;表的收缩可以通过动态存储释放实现,释放的空间还可以在以后动态分配给其他的存储申请要求,非常灵活方便。对于n个表(包括表的总数可能变化)共存的情形,处理十分简便和快捷。所以选用链接存储表示较好。时间复杂
A.O(1) B.O(n) C.O(n2) D.O(n㏒2n)
11.在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是
A.O(1) B.O(n) C.O(n2) D.O(n㏒2n)
12.向一个栈顶指针为HS的链栈中插入一个s所指结点时,则执行
13.(1)O(1) (2)O(n)
3.3习题解析
1. 线性表可用顺序表或链表存储。试问:
(1) 两种存储表示各有哪些主要优缺点?
(2) 如果有n个表同时并存,并且在处理过程中各表的长度会动态发生变化,表的总数也可能自动改变、在此情况下,应选用哪种存储表示?为什么?
(3) 若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时,应采用哪种存储表示?为什么?
7.在一个单链表中,若删除p所指结点的后续结点,则执行
A.p->next=p->next->next;
B.p=p->next; p->next=p->next->next;
C.p->next=p->next
D.p=p->next->next
8.假设双链表结点的类型如下:
typedef struct linknode
(3) 应采用顺序存储表示。因为顺序存储表示的存取速度快,但修改效率低。若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时采用顺序存储表示较好。
2.在一个单链表(不同结点的数据域值可能相同),其头指针为head,编写一个函数计算数据域为x的结点个数。
解:本题是遍历通过该链表的每个结点,每遇到一个结点,结点个数加1,结点个数存储在变量n中。实现本题功能的函数如下:
a1 a2 a3 an Head1
解:本题的算法思想是一次查找该单链表(其头指针为head)中的每个结点,对每个结点复制一个新结点并连接到新的单链表(其头指针为head2)中。实现本题功能的函数如下:
Void copy(head1,head2)
Node *head1,*head2;
{int data; /*数据域*/
Struct linknode *llink; /*llink是指向前驱结点的指针域*/
Struct linknode *rlink; /*rlink是指向后续结点的指针域*/
}bnode
5.在一个单链表中删除p所指结点时,应执行如下操作:
q=p->next; p->data=p->next->data; p->next=( ); free(q);
6.带有一个头结点的单链表head为空的条件是( ).
7.在一个单链表中p所指结点之后插入一个s所指结点时,应执行s->next=(1)和p->next=(2)的操作。
13.对于一个具有n个节点的单链表 ,在已知所指结点后插入一个新结点的时间复杂度是(1);在给定值为的结点后插入一个新结点的时间复杂度是(2)。
3.2基本题答案
3.2.1单项选择题答案
1.A 2.B 3.C 4.D 5.C 6.B 7.A 8.C 9.D 10.B 11.C 12.C 13.D 14.B 15.C
A.HS->next=s;
B.s->next=HS->next; HS->next=s;
C.s->next=HS; HS=s;
D.s->next=HS; HS=HS->next
13.从一个栈顶指针为HS的链栈中删除一个结点时,用x保存被删除结点的值,则执行A.x=HS; HS=HS->next;
5.在一个单链表中,已知q所指结点是所指结点p的前驱结点,若在q和p之间插入结点S,则执行
A.s->next=p->next; p->next=s;
B.p->next=s->next; s->next=p;
C.q->next=s; s->next=p;
D.p->next=s; s->next=q;
下面给出的算法段是要把一个所指新结点作为非空双向链表中的所指结点的前驱结点插入到该双链表中,能正确完成要求的算法段是
A.q->rling=p; q->llink=p->llink; p->llink=q; p->llink->rlink=q;
B.p->llink=q; q->rlink=p; p->llink->rlink=q; q->llink=p->llink;
8.非空的循环单链表head的尾结点(由p所指向),满足条件( )。
9 在栈顶指针为HS的链栈中,判定栈空的条件是( )。
10.在栈顶指针为HS的链栈中,计算该链栈中结点个数的函数是( )。
11.在HQ的链队中,判定只有一个结点的条件是( )。
12.在HQ的链队中,计算该链队中结点个数的函数是( )。
B.p->right=s; p->right->left=s; s->lefe=p; s->right=p->right;
C.s->lefe=p; s->right=p->right; p->right=s; p->right->left=s;
D.s->left=p; s->right=p->right; p->right->left=s; p->right=s;
第三章 链表
基本题
3.2.1单项选择题
1.不带头结点的单链表head为空的判定条件是
A.head=NULL B.head->next=NULL C.head->next=head D.head!=NULL
2.带头接待点的单链表head为空的判定条件是
A.head=NULL B.head->next=NULL C.head->next=head D.head!=NULL
int count(head)
node *head
{node *p;
Int n=0;
P=head;
while(p!=NULL)
{if(p-->data==x) n++;
P=p->next;
}
Return(n);
}
3.已知一个单链表如图3.7所示,编写一个函数将该单链表复制一个拷贝。
1.单链表是( )的连接存储表示。
2.可以使用( )表示树型结构。
3.在双链表中,每个结点有两个指针域,一个指向(1),另一个指向(2)。
4.在一个单链表中的所指结点之前插入一个所指结点时,可执行如下操作:
s->next=(1); p->next=s; t=p->data; p->data=(2); s->data=(3);
【解答】
(1) 顺序存储表示是将数据元素存放于一个连续的存储空间中,实现顺序存取或(按下标)直接存取。它的存储效率高,存取速度快。但它的空间大小一经定义,在程序整个运行期间不会发生改变,因此,不易扩充。同时,由于在插入或删除时,为保持原有次序,平均需要移动一半(或近一半)元素,修改效率不高。
链接存储表示的存储空间一般在程序的运行过程中动态分配和释放,且只要存储器中还有空间,就不会产生存储溢出的问题。同时在插入和删除时不需要保持数据元素原来的物理顺序,只需要保持原来的逻辑顺序,因此不必移动数据,只需修改它们的链接指针,修改效率较高。但存取表中的数据元素时,只能循链顺序访问,因此存取效率不高。
3.2.2填空题答案
1.线性表 2.双链表 3.(1)前驱结点(2)后续结点 4.(1)p->next (2)s->data (3)t 5.p->next->next 6.head->nxet=NULL 7.(1)p->next (2)s 8.head->next=p 9.HS==NULL 10.int count(HS)
C.s->next=r;r=s; D.s->next=f; f=s;
15.在一个链队中,假设f和r分队为队首和队尾指针,则删除一个结点的运算是
A.r=f->next; B.r=r->next; C.f=f->next; D.f=r->next;
3.2.2填空题
B.x=HS->data;
C.HS=HS->next; x=HS->data;
D.x=HS->data; HS=HS->next;
14.在一个链队中,假设f和r分别为队首和队尾指针,则插入s所指结点的运算是
A.f->next=s; f=s; B.r->next=s; r=s;
Node *HS;
{node *p;
Int n=0;
P=HS;
While(p!=NULL)
{n++;
P=p->next;
}
Return(n);
}
11.HQ->front==HQ->rear
12.int count(HQ)
Struct linkqueue *HQ;
6.在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行
A.s->next=p; p->next=s; B.s->next=p->next; p->next=s;
C.s->next=p->next; p=s; D.p->next=s; s->next=p;
{struct linkqueue *p;
Int n;
P=HQ->first;
If(p==NULL) return(0);
n=1;
while(p!=HQ->rear)
{n++;
P=p->next;
}
return(n);
}
{node *p,*q;
Head2=(node*)malloc(sizeof(node)); /*建立一个头结点*/
q=head2;p=head;
while(p!=NULL)
{s=(node*)malloc(sizeof(node)); /*复制一个新结点*/
(2) 如果有n个表同时并存,并且在处理过程中各表的长度会动态发生变化,表的总数也可能自动改变、在此情况下,应选用链接存储表示。
如果采用顺序存储表示,必须在一个连续的可用空间中为这n个表分配空间。初始时因不知道哪个表增长得快,必须平均分配空间。在程序运行过程中,有的表占用的空间增长得快,有的表占用的空间增长得慢;有的表很快就用完了分配给它的空间,有的表才用了少量的空间,在进行元素的插入时就必须成片地移动其他的表的空间,以空出位置进行插入;在元素删除时,为填补空白,也可能移动许多元素。这个处理过程极其繁琐和低效。
3.非空的循环单链表head的尾结点(由p所指向)满足
A.p->head=NULL B.p=NULL C.p->next=head D.p=head
4.在循环双链表p的所指结点之后插入s所指结点的操作是
A.p->right=s; s->left=p; p->right->lefe=s; s->right=p->right;
C.q->llink=p->llink; q->rlink=p; p->llink->rlink=q; p->llink=q;
D.以上都不对
9.从一个具有n个结点的有序单链表中查找其值等于x结点时,在查找成功的情况下,需平均比较( )个结点。
A.n B.n/2 C.(n-1)/2 D.O(n㏒2n)
相关文档
最新文档