计算机软件基础二习题解解答Word下载.docx
《计算机软件基础二习题解解答Word下载.docx》由会员分享,可在线阅读,更多相关《计算机软件基础二习题解解答Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
2.对一个已建立好的单链表(表头指针为head),编写一算法计算该链表中的结点个数。
(要求给出结点的结构描述)
统计结点个数
intListLength(LinkListhead)
{
inti=0;
LinkListp=head->
next;
While(p)
{
i++;
p=p->
}
returni;
3.给定一个n项元素的线性表V,写一个过程将元素排列的次序颠倒过来,
#definen100
IntV[n];
Intk=0,front=1,rear=n;
Scanf(“%d”,&
V[n]);
While(front!
=rear);
V[0]=V[front];
V[front]=V[rear];
V[rear]=V[0];
frout++;
rear--;
4.试设计实现在单链表中删去值相同的多余结点的算法
del(LinkList*head)
{//删除单链表中值相同的多余结点
LinkList*p,*s,*q;
p=head->
while(p!
=NULL&
&
p->
next!
=NULL)
{s=p;
//s指向要删除结点的前趋
q=p->
while(q!
{if(q->
data==p->
data)}//查找值相同的结点并删除
{s->
next=q->
free(q);
q=s->
else
{s=q;
q=q->
p=p->
}
5.P20
6.设计计算线性链表长度的算法
intListlength(LinklistL)//求链表长度
{
Linklistp;
intj=0;
p=L;
while(p->
++j;
returnj;
7.设一线性链表,其结点值为正整数序列,且按值从小到大链接,设计算法,将此线性链表分成两个纯属链表,其中一个结点值均为奇数,而另一个均为偶数,且也是从小到大链接。
把原链表中头节点和第二个节点地址传入函数
void*f(structstu*head,structstu*head1)
{
structstu*p1,*p2;
p1=head;
p2=head1;
for(inti=1;
p1->
=NULL&
p2->
=NULL;
i++)
if(i%2!
=0)//是奇数节点
p1=p2->
//指向下个奇数节点
else//是偶数节点
p2=p1->
//指向下个偶数节点
next=NULL;
8.设有一个循环单链表长度大于1,且表中既无头结点也无头指针。
已知S为指向链表中某一结点的指针,写出在链表中删除S指针所指结点的前趋结点的算法
link*p,*q;
p=s;
while(p->
next->
=s)
{p=p->
p->
next=s;
deleteq;
9.已知指针ha和hb分别指两个单链表的头结点,且头结点的数据域中存放链表的长度,试写一算法将两个链表连拉在一起,即令其中一个表的首元结点连在另一表最后一个结点之后,hc指向连接后的链表的头结点,并要求算法以尽可能短的时间内完成运算。
LinkListLink(LinkListL1,LinkListL2)
//将两个单链表连接在一起
ListNode*p,*q;
p=L1;
q=L2;
while(p->
next)p=p->
//查找终端结点
next=q->
next;
//将L2的开始结点链接在L1之后
returnL1;
本算法的主要操作时间花费在查找L1的终端结点上,与L2的长度无关。
10.
11.可能的出站顺序是:
1432、1243、1234、2341、2431、3421、4321
12.P22
13.P27
14.用选择题3的结果按(n+r-f+1)%n计算
(1)9
(2)33
15.假设一数组squ[m]存放循环队列的元素。
若要使这个m分量都得到利用,则需另一个tag,以tag为0或1来区分尾指针和头指针值同时队列的状态是“空”还是“满”。
试编写与此结构相应的入队和出队的算法。
StatusEnCyQueue(CyQueue&
Q,intx)//带tag域的循环队列入队算法
if(Q.front==Q.rear&
Q.tag==1)//tag域的值为0表示"
空"
1表示"
满"
returnOVERFLOW;
Q.base[Q.rear]=x;
Q.rear=(Q.rear+1)%MAXSIZE;
if(Q.front==Q.rear)Q.tag=1;
//队列满
}//EnCyQueue
16.假设以带头结点的循环单链表表示陈列并且只设一个指针指向队尾元素结点,不设头指针,试编写相应的入队和出队算法
typedefintDatatype;
typedefstructqueuenode
Datatypedata;
structqueuenode*next;
}QueueNode;
//以上是结点类型的定义
typedefstruct
queuenoderear;
}LinkQueue;
//只设一个指向队尾元素的指针
voidInitQueue(LinkQueue&
Q)
//置空队:
就是使头结点成为队尾元素
Q.rear=(queuenode*)malloc(sizeof(queuenode))
QueueNode*s;
Q->
rear=Q->
rear->
//将队尾指针指向头结点
while(Q->
rear!
=Q->
next)//当队列非空,将队中元素逐个出队
{
s=Q->
next=s->
free(s);
}//回收结点空间
intEmptyQueue(LinkQueue&
{//判队空
//当头结点的next指针指向自己时为空队
returnQ->
next==Q->
voidEnQueue(LinkQueue&
Q,Datatypex)
{//入队
//也就是在尾结点处插入元素
QueueNode*p=(QueueNode*)malloc(sizeof(QueueNode));
//申请新结点
data=x;
next=Q->
//初始化新结点并链入
Q-rear->
next=p;
rear=p;
//将尾指针移至新结点
DatatypeDeQueue(LinkQueue&
Q,Datatype&
x)
//出队,把头结点之后的元素摘下
Datatypet;
QueueNode*p;
if(EmptyQueue(Q))
Error("
Queueunderflow"
);
p=Q->
//p指向将要摘下的结点
x=p->
data;
//保存结点中数据
if(p==Q->
rear)
{//当队列中只有一个结点时,p结点出队后,要将队尾指针指向头结点
Q->
next=p->
else
//摘下结点p
free(p);
//释放被删结点
returnx;
17.按行先序存放时:
Loc(aij)=Loc(a11)+((i-1)*m+(j-1))*k
按列先序存放时:
Loc(aij)=Loc(a11)+((j-1)*m+(i-1))*k
18
(1)
行下标
列下标
元素值
8
3
2
6
5
4
7
1
(2)
68
-2
9
19.
(1)
(2)略
020000
0120000
300000
000400
006000
1600000
20.答:
空二叉树(或0个结点煌二叉树)不是树。
一棵树的度为2,即这棵中最大的结点的度为2为,形态与二叉树相同,只是不同于二叉树,有确定的左右子树之分。
21.参照P35图2-35
22.
(1)叶结点500.∵210-1=1023,29-1=511∴N0+N2=999且N0=N2+1
(2)度为2的结点:
499
(3)有非空左子树的结点:
511-11=500
(4)有非空右子树的结点:
511-12=499
23.
(1)B
(2)B(3)B(4)B(5)B(6)B(7)B
24.
26.先序遍历:
ABDFJGKCEHILM
中序遍历:
BFJDGKACHELIM
后序遍历:
JFKGDBHLMIECA
28.
A
BF
CG
DEH
29.
30.12
717
2111621
4913
31.
(1)D
(2)E(3)C
35.
49
22
17
32
39
13