习题二和上机答案Word文档下载推荐.doc

上传人:b****2 文档编号:14564525 上传时间:2022-10-23 格式:DOC 页数:30 大小:137.50KB
下载 相关 举报
习题二和上机答案Word文档下载推荐.doc_第1页
第1页 / 共30页
习题二和上机答案Word文档下载推荐.doc_第2页
第2页 / 共30页
习题二和上机答案Word文档下载推荐.doc_第3页
第3页 / 共30页
习题二和上机答案Word文档下载推荐.doc_第4页
第4页 / 共30页
习题二和上机答案Word文档下载推荐.doc_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

习题二和上机答案Word文档下载推荐.doc

《习题二和上机答案Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《习题二和上机答案Word文档下载推荐.doc(30页珍藏版)》请在冰豆网上搜索。

习题二和上机答案Word文档下载推荐.doc

p->

next!

=NULL)

{q=p;

p=p->

}

if(p->

data==a)

{q->

next=s;

s->

next=p;

}

else

{p->

next=NULL;

}

2.4设计一个算法将一个带头结点的单链表A分解成两个带头结点的单链表A和B,使A中含有原链表中序号为奇数的元素,而B中含有原链表中序号为偶数的元素,并且保持元素原有的相对顺序。

Lnode*cf(Lnode*ha)

{Lnode*p,*q,*s,*hb;

intt;

p=ha->

q=ha;

t=0;

hb=(Lnode*)malloc(sizeof(Lnode));

s=hb;

{if(t==0)

{q=p;

p=p->

t=1;

else

{q->

next=p->

p->

next=s->

s->

s=p;

p=p->

t=0;

}

}

return(hb);

}

2.5设线性表中的数据元素是按值非递减有序排列的,试以不同的存储结构,编写一算法,将x插入到线性表的适当位置上,以保持线性表的有序性。

⑴顺序表;

解:

本题的算法思想是:

先找到适当的位置,然后后移元素空出一个位置,再将x插入,并返回向量的新长度。

实现本题功能的函数如下:

intinsert(vectorA,intn,ElemTypex)/*向量A的长度为n*/

{inti,j;

if(x>

=A[n-1])A[n]=x/*若x大于最后的元素,则将其插入到最后*/else

{i=0;

while(x>

=A[i])i++;

/*查找插入位置i*/

for(j=n-1;

j>

=i;

j--)A[j+1]=A[j];

/*移出插入x的位置*/A[i]=x;

n++;

/*将x插入,向量长度增1*/

}

returnn;

}

⑵单链表。

本题算法的思想是先建立一个待插入的结点,然后依次与链表中的各结点的数据域比较大小,找到插入该结点的位置,最后插入该结点。

node*insertorder(head,x)

node*head;

ElemTypex;

{

node*s,*p,*q;

s=(node*)malloc(sizeof(node));

/*建立一个待插入的结点*/

data=x;

if(head==NULL||x<

head->

data)/*若单链表为空或x小于第一个结点的date域*/

{

next=head;

/*则把s结点插入到表头后面*/

head=s;

else

{q=head;

/*为s结点寻找插入位置,p指向待比较的结点,q指向p的前驱结点*/

p=q->

while(p!

=NULL&

x>

data)/*若x小于p所指结点的data域值*/

if(x>

data)/*则退出while循环*/

{

q=p;

/*将s结点插入到q和p之间*/

q->

}

return(head);

2.6假设有A和B分别表示两个递增有序排列的线性表集合(即同一表中元素值各不相同),求A和B的交集C,表C中也依值递增有序排列。

试以不同的存储结构编写求得C的算法。

⑴顺序表;

voidSqList_Intersect_True(SqList&

A,SqListB)//求元素递增排列的线性表A和B的元素的交集并存回A中

{

 

i=1;

j=1;

k=0;

while(A.elem[i]&

B.elem[j])

if(A.elem[i]<

B.elem[j])i++;

elseif(A.elem[i]>

B.elem[j])j++;

elseif(A.elem[i]!

=A.elem[k])

A.elem[++k]=A.elem[i];

//当发现了一个在A,B中都存在的元素

i++;

j++;

//且C中没有,就添加到C中

}//while

while(A.elem[k])A.elem[k++]=0;

}//SqList_Intersect_True

⑵单链表。

单链表

chnode*or(chnode*head1,chnode*head2)

{chnode*p1,*p2,*q2,*h,*p;

h=p=malloc(sizeof(chnode));

p->

p1=head1->

while(p1)

{p2=head2;

q2=p2->

while((q2->

=p1->

data)&

q2)

{p2=q2;

q2=q2->

}

if(p1->

data==q2->

data)

p2->

next=q2->

if(q2)

{while(p->

next)

p=p->

p->

next=q2;

p=q2;

q2->

p1=p1->

}

return(h);

}

2.7设计一个算法求两个递增有序排列的线性表A和B的差集。

(每个单链表中不存在重复的元素)

提示:

即在A中而不在B中的结点的集合。

typedefintelemtype;

typedefstructlinknode

elemtypedata;

structlinknode*next;

}nodetype;

nodetype*subs(nodetype*heada,nodetype*headb)

nodetype*p,*q,*r,*s;

s=(nodetype*)malloc(sizeof(nodetype));

next=heada;

heada=s;

p=heada->

next;

r=heada;

r->

next=NULL;

q=headb;

while(q!

q->

=p->

data)q=q->

if(q!

s=p->

free(p);

p=s;

else

next=p;

r=p;

s=heada;

heada=heada->

free(s);

returnheada;

2.8设有线性表A=(a1,a2,...,am),B=(b1,b2,...,bn)。

试写一合并A、B为线性表C的算法,使得

(a1,b1,...,am,bm,bm+1,...,bn)当m≤n时

C={

(a1,b1,...,an,bn,an+1,...,am)当m>n时

A、B和C均以单链表作存储结构,且C表利用A和B中结点空间。

假设A,B和C链表分别具有头结点的指针a,b和c。

node*link(a,b)

node*a,*b;

node*r,*s,*p,*q,*c;

c=(node*)malloc(sizeof(node));

/*建立一个头结点*/

r=c;

p=a;

q=b;

=NULL||q!

=NULL)

if(p!

=NULL)/*如果A链表还存在可取的结点,则复制一个同样的结点链接到C中*/

{

data=p->

data;

r=s;

=NULL)/*如果B链表还存在可取的结点,则复制一个同样的结点链接到C中*/

data=q->

q=q->

n

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1