数据结构第二版课后答案陈雁著高等教育出版社Word下载.docx
《数据结构第二版课后答案陈雁著高等教育出版社Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构第二版课后答案陈雁著高等教育出版社Word下载.docx(64页珍藏版)》请在冰豆网上搜索。
![数据结构第二版课后答案陈雁著高等教育出版社Word下载.docx](https://file1.bdocx.com/fileroot1/2022-10/9/68afcbbc-2384-49c5-99cc-2d1ed8ca9d33/68afcbbc-2384-49c5-99cc-2d1ed8ca9d331.gif)
%d,%d,%d"
&
x,&
y,&
z);
if(x>
y)
if(y>
z)
printf("
x,y,z);
else
if(x>
printf("
x,z,y);
else
z,x,y);
else
if(x>
y,x,z);
if(z>
z,y,x);
y,z,x);
}
3、举出一个数据结构的例子,叙述其逻辑结构、存储结构、运算等三方面的内容
4、分析下列算法的时间复杂度:
(1)
intprime(intn)
for(i=2;
i<
sqrt(n);
i++)
if(n%i==0)
return0;
return1;
O(n1/2)
(2)
longsun(intn)
s=0;
for(i=1;
=n;
{
for(p=1,j=1;
j<
i;
j++)
p=p*j;
s+=p;
}
returns;
O(n2)
第二章
习题
1、描述以下三个概念的区别:
头指针、头结点、首元结点(第一个元素结点)。
头指针:
指针,指向头节点的指针
头结点:
结点,其指针域指向首元节点
首元结点:
结点,第一个元素的表示形式
2、试比较顺序存储结构和链式存储结构的优缺点。
优点
缺点
顺序存储
可随机存储
内存存储密度高
实现插入、删除时的效率低
要求连续存储空间
链式存储
实现插入、删除时的效率高
不要求连续存储空间
不能随机存储
存储数据时需实用额外内存空间(如地址域)
3、设计算法,删除顺序表中值为x的所有结点。
intDelete_Sq(SqList*L,ELEMTPx)
intn=0,i=1;
if(L->
len==0)return-1;
/*表已空*/
while(i<
=L->
len)
if(L->
elem[i]=x)
{
for(j=i;
len-1;
L->
elem[j]=L->
elem[j+1];
/*被删除元素之后的元素左移*/
--L->
len;
}
i++;
4、设线性表(a1,a2,…,an)存储在带表头结点的单链表中,试设计算法,求出该线性表中值为x的元素的序号。
如果x不存在,则序号为0。
intIndex_Linkst(LNode*H,ELEMTPx)
p=H->
next;
j=1;
f=0;
/*P指向第一个结点,j为计数器,f为标志*/
while(p)
if(p->
data!
=x)
j++;
p=p->
f=1;
if(f=1)
returnj;
return0;
5、在一个非递减有序线性表中,插入一个值为x的元素,使插入后的线性表仍为非递减有序。
分别写出用顺序表和单链表表示时的算法。
顺序表:
intInsert_Sq(SqList*L,ELEMTPx)
if(L->
len==MAXSIZE-1)return-1;
/*表已满*/
elem[L->
len])
L->
len+1]=x;
len+=1;
i=1;
while(x>
elem[i])
for(j=L->
j>
=i;
j--)
L->
elem[j+1]=L->
elem[j];
elem[i]=x;
单链表:
intInsert_Linkst(LNode*H,ELEMTPx)
p=H;
s=(LNode*)malloc(sizeof(LNode));
if(s)
s->
data=x;
next=NULL;
while(p->
next)
next->
data<
x)
s->
next=p->
p->
next=s;
/*插入*/
return1;
}/*Insert_Linkst*/
p->
6、设一个线性表L=(a1,a2,…,an),编写算法将其逆置,即成为(an,an-1,…a2,a1)。
要求逆置后的线性表仍占用原来的存储空间,并且用顺序和单链表两种方法表示,写出不同的处理过程。
voidinverse_Sq(SqList*L)
inti;
ELEMTPx;
len/2;
x=L->
elem[i];
elem[i]=L->
len-i+1];
len-i+1]=x;
voidinverse_Linkst(LNode*H)
d=h->
if(d!
=NULL)
p=d->
while(p)
t=p->
next=d;
d=p;
p=t;
h=d;
7、设两个单链表A和B,它们的数据元素分别为(x1,x2,…,xm)和(y1,y2,…,yn)。
设计一个算法将它们合并为一个单链表C,使得:
当m≥n时,C=(x1,y1,x2,y2,...,xn,yn,...,xm)
当n>m时,C=(y1,x1,y2,x2,...,ym,xm,...,yn)。
LNode*Link_Linkst(LNode*A,LNode*B)
p=A->
q=B->
m=0;
n=0;
while(p)
m++;
p=p->
while(q)
n++;
q=q->
if(m>
=n)
p=A->
q=B->
C=A;
p=B->
q=A->
C=B;
t=p->
p->
next=q;
next=t;
p=t;
returnC;
8、试写一算法,在无表头结点的单链表中值为a的结点前插入一个值为b的结点,如果a不存在,则把b插在表尾。
将该算法与第2.3.2节中的算法2.7进行比较。
voidInsertx_Linkst(LNode*H,Elemtpa,Elemtpb)
s=(LNode*)malloc(sizeof(LNode));
s->
data=b;
if(H==NULL)
H=s;
p=H;
q=p->
data==a)/*对首元节点处理*/
next=p;
H=s;
while(q&
&
q->
=a)
{
p=q;
q=q->
}
9、假设有一个单向循环链表,其结点包含三个域:
data,pre和next,其中data为数据域,next为指针域,其值为后继结点的地址,pre也为指针域,其初值为空(NULL),试设计算法将此单向循环链表改为双向循环链表。
voidChange_Linkst(LNode*H)
q=H;
pre=q;
q=p;
H->
q->
next=H;
10、已知二维数组A[5][7],其每个元素占四个存储单元,且A[0][0]的存储地址为1100,试求出元素A[3][5]的存储地址(分别讨论以行为序和以列为序方式存储时的结论)。
行为序
1100+4*(3*7+5)=1204
列为序
1100+4*(5*5+3)=1212
11、设有一个二维数组A[M][N],对以下三种情况分别编写算法:
(1)求数组A的最外围元素之和;
(2)求从A[0][0]开始的互不相邻的各元素之和;
(3)当M=N时,分别求两条对角线上的元素之和,否则输出M≠N的信息。
intA1(intA[M][N])/*求数组A的最外围元素之和*/
for(i=0;
M;
if(i==0||i==M-1)
for(j=0;
N;
s+=A[i][j];
s+=A[i][0]+A[i][N-1];
intA2(ELEMTPA[M][N])/*求从A[0][0]开始的互不相邻的各元素之和*/
if(i%2==0)
j=0;
j=1;
for(;
j+=2)
s+=A[i][j];
voidA3(intA[M][N],int*s1,int*s2)/*分别求