习题配套
第一章
2.C、A、B、B、A、A、D
3.
D={A,B,C,E,F,G,H,I,J};
R={,,,,,,,,,}
A
A
B
C
E
F
G
H
I
题1-3图
J
4.顺序、链式、索引、哈希.
*5.解:100n2>2nn至少要多大
6.O(n)、O(n)、O(n)、O()、
(5)当n>m,O(n),当m>n,O(m)
7.n!
2100>lgn>n1/2>n3/2>(3/2)n>2n>nlgn>nn
第二章
1.×、√、×、√、√
2.AAD
4.顺序表
void Delete_SeqListx(SeqList*L,ElemType x)
/*删除表中值为x元素*/
{inti,j;
for(i=1;i<=L->length;i++){
if(L->elem[i]==x){
for(j=i;j<=L->length-1;j++)
L->elem[j]=L->elem[j+1];
L->length--;
}/*向上移动*/
}
O(n2)
链表
voiddel_link(LinkListH,intx)/*删除数据域为x的结点*/
{
LNode*p,*q;
p=H;q=H->next;
while(q!=NULL)
{
if(q->data==x){
p->next=q->next;free(q);q=p->next;
}
else{p=q;q=q->next;}
}
}
O(n)
5.
int Delete_SeqListx(SeqList*L,int i,int k)
/*删除表中删除自第i个结点开始的k个结点*/
{intj;
if(i<1||k<0||i+k-1>L->length)
/*检查空表及删除位置的合法性*/
{printf("不存在第i个元素");
returnERROR;}
for(j=i;j<=L->length-k;j++)
L->elem[j]=L->elem[j+k];/*向上移动*/
L->length-=k;
ReturnOK;/*删除成功*/
}
O(n)
6.
void Delete_SeqListx(SeqList*L,ElemType x)
/*将表中值为x元素换成y*/
{inti,j;
for(i=1;i<=L->length;i++){
if(L->elem[]==x){
L->elem[i]=y;
}/**/
}
O(n)
7.写一算法在循环单链表上实现线性表的CList_length(L)运算.
int link_length(LinkListH)
{
LNode*p;int i=0;
p=H;
while(p->next!=H)
{i++;
p=p->next;
}
return i;
}
O(n)
8.
在用头指针表示的单循环链表中,查找开始结点a1的时间是O(1),然而要查找终端结点则需从头指针开始遍历整个链表,其时间是O(n).但在很多实际问题中,表的操作常常是在表的首、尾位置上进行,如果改用尾指针rear来表示单循环链表,则查找开始结点a1和终端结点an都很方便,它们的存储位置分别是rear->next->next和rear,显然,查找时间都是O(1).
9.
int Insert_LinkListab(LinkList H, ElemType a,ElemType b)
/*在单链表中值为a的结点前插入一个值为b的结点*/
{LNode*q=H,*s;*p=H->next;
while(p!=NULL&&p->data!=a)/*q->next&&q->next->data!=a*/
{q=p;p=p->next;
}/*查找a结点*/
s=(LinkList)malloc(sizeof(LNode));/*申请、填装结点*/
s->data=b;
s->next=q->next;/*新结点插入在第i-1个结点的后面*/
q->next=s;
return OK;
}/*Insert_LinkListab*/
10.顺序表
void Reverse_Sq(SqList *L)/*顺序表的就地逆置*/
{
for(i=1,j=L.len;i
{t=L.elem[i];L.elem[i]=L.elem[L.len-i+1];L.elem[L.len-i+1]=t;}
}/*Reverse_Sq*/
单链表
void Reverse_L(LinkList*H)/*为简化算法,假设表长大于2*/
{
p=H->next;q=p->next;s=q->next;p->next=NULL;
while(s->next)
{
q->ne