数据结构编程docWord格式.docx
《数据结构编程docWord格式.docx》由会员分享,可在线阅读,更多相关《数据结构编程docWord格式.docx(30页珍藏版)》请在冰豆网上搜索。
structpnode*head;
structpnode*p1,*p2;
n=0;
p1=p2=(structpnode*)malloc(LEN);
scanf("
%d,%d"
&
p1->
exp,&
coef);
head=NULL;
while(p1->
coef!
=0)/*inputendflag*/
{
n=n+1;
if(n==1)head=p1;
elsep2->
link=p1;
p2=p1;
p1=(structpnode*)malloc(LEN);
}
p2->
link=NULL;
return(head);
}
voidprint(structpnode*head)/*输出一元多项式链表*/
structpnode*p;
printf("
\nNow,Thispnodeofyouinputis:
\n"
);
p=head;
if(head!
=NULL)
do
%dx^%d+"
p->
coef,p->
exp);
p=p->
link;
}while(p!
=NULL);
structpnode*padd(structpnode*heada,structpnode*headb)/*实现两个一元多项式链表加*/
structpnode*headc,*p,*q,*s,*r;
intx;
p=heada;
q=headb;
headc=(structpnode*)malloc(LEN);
r=headc;
while(p!
=NULL&
&
q!
if(p->
exp==q->
exp)/*,c*/
x=p->
coef+q->
coef;
if(x!
=0)
s=(structpnode*)malloc(LEN);
s->
coef=x;
exp=p->
exp;
r->
link=s;
r=s;
p=p->
q=q->
else/*,C*/
exp<
q->
exp)
coef=q->
/
exp=q->
else
coef=p->
=NULL)/*A*/
/*S*/
/*SC*/
while(q!
=NULL)/*B*/
/*link*/
s=headc;
/*C*/
headc=headc->
free(s);
return(headc);
main()
structpnode*heada,*headb,*headc;
Pleaseinputpnodeheada:
heada=creat();
print(heada);
Pleaseinputpnodeheadb:
headb=creat();
print(headb);
headc=padd(heada,headb);
print(headc);
(4)调试分析
以下下是输入、输出实例。
2,1
1,2
0,3
0,0
Now,Thispnodeofyouinputis:
1x^2+2x^1+3x^0
3,1
1x^3+2x^1+3x^0
1x^3+1x^2+4x^1+6x^0
3.背包问题
(1)需求分析
给定n种物品和背包。
物品i的重量是wi,其价值为vi,背包的容量为C。
应该如何选择装入背包的物品,使装入背包中物品的总价值最大?
(2)概要设计
改进的背包问题:
给定一个超递增序列和一个背包的容量,然后在超递增序列中选(只能选一次)或不选每一个数值,使得选中的数值的和正好等于背包的容量。
思路:
从最大的元素开始遍历超递增序列中的每个元素,若背包还有大于或等于当前元素值的空间,则放入,然后继续判断下一个元素;
若背包剩余空间小于当前元素值,则判断下一个元素。
程序流程图如下:
产生超递增序列
输出当前的超递增序列
遍历超递增序列中的每个元素
背包剩余空间还大于当前元素背包剩余空间小于当前元素值
放入,然后继续判断下一个元素判断下一个元素
得出所有已经选中的元素之和
超递增序列
(3)详细设计
#defineK10
#defineN10
stdlib.h>
conio.h>
voidcreate(longarray[],intn,intk)
{/*产生超递增序列*/
inti,j;
array[0]=1;
for(i=1;
i<
n;
i++)
longt=0;
for(j=0;
j<
i;
j++)
t=t+array[j];
array[i]=t+random(k)+1;
voidoutput(longarray[],intn)
{/*输出当前的超递增序列*/
inti;
for(i=0;
if(i%5==0)
%14ld"
array[i]);
voidbeibao(longarray[],intcankao[],longvalue,intcount)
{/*背包问题求解*/
longr=value;
for(i=count-1;
i>
=0;
i--)/*遍历超递增序列中的每个元素*/
if(r>
=array[i])/*如果当前元素还可以放入背包,即背包剩余空间还大于当前元素*/
r=r-array[i];
cankao[i]=1;
else/*背包剩余空间小于当前元素值*/
cankao[i]=0;
voidmain()
longarray[N];
intcankao[N]={0};
longvalue,value1=0;
clrscr();
create(array,N,K);
output(array,N);
\nInputthevalueofbeibao:
%ld"
value);
beibao(array,cankao,value,N);
N;
i++)/*所有已经选中的元素之和*/
if(cankao[i]==1)
value1+=array[i];
if(value==value1)
\nWehavegotasolution,thatis:
%13ld"
else
\nSorry.Wehavenotgotasolution.\n"
运行时显示:
18102242
901813607201443
Inputthevalueofbeibao:
输入1时:
1
Wehavegotasolution,thatis:
1
Pressanykeytocontinue...
输入5时:
5
Sorry.Wehavenotgotasolution.
输入50时:
50
842
输入500时:
500
90360
输入1000时:
1000
18
90181720
输入5000时:
5000
这时按任意键则返回编辑窗口
4.猴子选大王
一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:
输入数据:
输入m,nm,n为整数,n<
m
输出形式:
中文提示按照m个猴子,数n个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能
基本思路是以链表顺序储存猴子的信息,利用计数器完成操作,最后打印出是第几个猴子
循环链表