ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:19.37KB ,
资源ID:8915538      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8915538.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第一章第二章算法题.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第一章第二章算法题.docx

1、第一章第二章算法题1.4、试编写算法,求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+anxn的值Pn(x0),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数。注意:本题中的输入ai(i=0,1,n),x和n,输出为Pn(x0)。通常算法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递。(2)通过全局变量隐式传递。试讨论这两种方法的优缺点,并在本题算法中以你认为较好的一种方式实现输入和输出【解答】(1)通过参数表中的参数显式传递 优点:当没有调用函数时,不占用内存,调用结束后形参被释放,实参维持,函数通用

2、性强,移置性强。 缺点:形参须与实参对应,且返回值数量有限。(2)通过全局变量隐式传递 优点:减少实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗 缺点:函数通用性降低,移植性差算法如下:通过全局变量隐式传递参数PolyValue() int i,n;float x,a,p; printf(“nn=”); scanf(“%f”,&n); printf(“nx=”); scanf(“%f”,&x);for(i=0;in;i+) scanf(“%f ”,&ai); /*执行次数:n次 */ p=a0; for(i=1;i=n;i+) p=p+ai*x; /*执行次数:n次*/ x=x*x

3、;printf(“%f”,p); 算法的时间复杂度:T(n)=O(n)通过参数表中的参数显式传递float PolyValue(float a , float x, int n) float p,s;int i;p=x; s=a0;for(i=1;i=n;i+)s=s+ai*p; /*执行次数:n次*/ p=p*x;return(p);算法的时间复杂度:T(n)=O(n)techers#include #define MAXSIZE 10float pnx(float a,float x,int n) int j; float sum=0.0; for(j=n;j0;j-) /*a0=a0,a

4、1=a1,.*/ sum=(sum+aj)*x; sum=sum+a0; return(sum);void main() int n,i; float aMAXSIZE,x,result; printf(Input the value of x:n); scanf(%f,&x); printf(n); printf(Input The n:n); scanf(%d,&n); printf(n); printf(Input a0,a1,.an:); for(i=0;iva.listsize) return ERROR;va.length+;for(i=va.length-1;va.elemix&

5、i=0;i-)va.elemi+1=va.elemi;va.elemi+1=x;return OK;/Insert_SqListteachersint InsList_Sort(SeqList *L,elemtype e) int i; if(L-last=MAXSIZE-1) printf(表已满无法插入!); return(0); i=L-last; while(i=0)&(eelemi)/*寻找插入位置并移动元素*/ L-elemi+1=L-elemi; i-; L-elemi+1=e;/*即使L为空,处理也相同*/ L-last+; return (1);2.5 写一算法,从顺序表中删

6、除自第i个元素开始的k个元素。提示:注意检查i和k的合法性。 (集体搬迁,“新房”、“旧房”) 以待移动元素下标m(“旧房号”)为中心,计算应移入位置(“新房号”): for ( m= i1+k; mlast; m+) Lelem mk = Lelem m ; 同时以待移动元素下标m和应移入位置j为中心: 以应移入位置j为中心,计算待移动元素下标:teachersint DelList_k(SeqList *L,int i,int k) /*假定从i往后的元素个数不足k个时,仅删除其后的所有元素*/ int count,j; if (iL-last+1)|(klast-i+1;/*计算i后的元

7、素个数*/ j=i+k-1; while(jlast)/*将i+k位置以后的元素向前移动*/ L-elemj-k=L-elemj; j+;/*原算法中的count-;去掉*/ if(count=k) L-last=L-last-k;/*改变指向尾元的位置值*/ else L-last=L-last-count;/*被删元素数少于k个时*/ return (1);2.6已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值

8、为任意的整数)。 Status Delete_Between(Linklist &L,int mink,int maxk)/删除元素递增排列的链表L中值大于mink且小于maxk的所有元素p=L;while(p-next-datanext; /p是最后一个不大于mink的元素if(p-next)/如果还有比mink更大的元素q=p-next;while(q-datanext; /q是第一个不小于maxk的元素p-next=q;/Delete_Between2.7试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1, a2., an)逆置为(an, an-1,., a

9、1)。(1) 以一维数组作存储结构,设线性表存于a(1:arrsize)的前elenum个分量中。(2) 以单链表作存储结构。方法1:在原头结点后重新头插一遍方法2:可设三个同步移动的指针p, q, r,将q的后继r改为pteachers#include /2.7.1#define MAXSIZE 10void createdata(int x,int n) int i; if(n=MAXSIZE) printf(ERROR!); exit(); for(i=0;i=MAXSIZE) printf(OverFlow!); exit(); k=0; for(i=n-1;i=n/2;i-) tmp

10、=xi; xi=xk; xk=tmp; k+; void disparray(int x,int n) int i; if(n=MAXSIZE) printf(ERROR!); exit(); for(i=0;in;i+) printf(%d ,xi);void main()int aMAXSIZE; createdata(a,8); reverse1(a,8); disparray(a,8);#include /2.7.2typedef struct node int x; struct node *next; snode,*Linklist;Linklist create() snode

11、*head,*rear,*s; int y; head=(Linklist)malloc(sizeof(snode); rear=head; scanf(%d,&y); while(y!=-1) s=(Linklist)malloc(sizeof(snode); s-x=y; rear-next=s; rear=s; scanf(%d,&y); rear-next=NULL; return(head);Linklist reverse2(snode *head) Linklist p,q; p=head-next; head-next=NULL; while(p) q=p;/*采用头插法,q指

12、向待插节点,p指向下一个*/ p=p-next; q-next=head-next; head-next=q; return(head);main() Linklist h,p; h=create(); p=h-next; while(p) printf(%5d,p-x); p=p-next; h=reverse(h); printf(n); p=h-next; while(p) printf(%5d,p-x); p=p-next; 2.8 假设两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,请编写算法,将A表和B表归并成一个按元素值递减有序的排列的线性表C,并要求利用原表(即

13、A表和B表的)结点空间存放表C.teachers/*ch2_8合并并逆置链表*/#include typedef struct node int x; struct node *next; snode,*Linklist;Linklist create() snode *head,*rear,*s; int y; head=(Linklist)malloc(sizeof(snode); rear=head; scanf(%d,&y); while(y!=-1) s=(Linklist)malloc(sizeof(snode); s-x=y; rear-next=s; rear=s; scanf

14、(%d,&y); rear-next=NULL; return(head);Linklist merge(snode *head1,snode *head2) Linklist head,p,q,s; p=head1-next;/*指向A的首元节点*/ q=head2-next;/*指向B的首元节点*/ head=head1; /*以链表A的头节点做C的头节点*/ head-next=NULL; free(head2); /*释放B的头节点*/ while(p!=NULL&q!=NULL)/*用头插法挑选元素插入*/ if(p-xx) s=p;p=p-next; else s=q;q=q-ne

15、xt; s-next=head-next;head-next=s; if(p=NULL) p=q; while(p) s=p;p=p-next;s-next=head-next;head-next=s; return(head);main() Linklist h,h1,h2,p,q; h1=create(); h2=create(); printf(n*n); p=h1-next; while(p) /*显示链表A的数据*/ printf(%5d,p-x); p=p-next; printf(n*n); q=h2-next; while(q) /*显示链表B的数据*/ printf(%5d,

16、q-x); q=q-next; h=merge(h1,h2); p=h-next; printf(n*n); while(p) /*显示链表C的数据*/ printf(%5d,p-x); p=p-next; 2.9假设有一个循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表某个结点的指针,试编写算法在链表中删除指针s所指结点的前趋结点。提示:设指针p指向s结点的前趋的前趋,则p与s有何关系?Status Delete_Pre(CiLNode *s)/删除单循环链表中结点s的直接前驱p=s;while(p-next-next!=s) p=p-next; /找到s的前驱的前驱pp-

17、next=s;return OK;/Delete_Pre2.10 已知有单链表表示的线性表中含有三类字符的数据元素(如字母字符、数字字符和其它字符),试编写算法来构造三个以循环链表表示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。teachers/*CH2_10拆分链表并重构循环链表*/#include typedef struct node char x; struct node *next; snode,*Linklist;Linklist create() snode *head,*rear,*s; char y; head=(Li

18、nklist)malloc(sizeof(snode); rear=head; clrscr(); printf(nPlease build the linklist(From the end):(!=$)n); scanf(%c,&y); getchar();/*将键盘缓冲区中的回车符取出以腾空*/ while(y!=$) s=(Linklist)malloc(sizeof(snode); s-x=y; rear-next=s; rear=s; scanf(%c,&y); getchar(); rear-next=NULL; return(head);Linklist Linklist_di

19、vide(snode *head,snode *A,snode *B,snode *C) Linklist s,p,q,r;/*拆分链表并重构循环链表*/ s=head-next; p=A; /*alphabet*/ q=B; /* digit */ r=C; /* other */ while(s) if(s-x=a&s-xx=A&s-xnext=s;p=s; else if(s-x=0&s-xnext=s;q=s; else r-next=s;r=s; s=s-next; p-next=A;q-next=B;r-next=C;/*将尾元节点的next指向头节点*/main() Linkli

20、st h,A,B,C,p,q,r; h=create();/*准备三个空链表*/ A=(Linklist)malloc(sizeof(snode); /*alphabet*/ B=(Linklist)malloc(sizeof(snode); /* digit */ C=(Linklist)malloc(sizeof(snode); /* other */ Linklist_divide(h,A,B,C); p=A-next; printf(n*n); while(p!=A) printf(%5c,p-x); p=p-next; printf(n*n); q=B-next; while(q!=

21、B) printf(%5c,q-x); q=q-next; printf(n*n); r=C-next; while(r!=C) printf(%5c,r-x); r=r-next; printf(n*n);2.13 建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算 。提示:可将低位放在前面。teachers/*ch2_13*/#define NULL 0typedef struct node int x; struct node *next; snode,*Linklist;Linklist create()

22、 snode *head,*rear,*s; int y; head=(Linklist)malloc(sizeof(snode); rear=head; clrscr(); printf(nPlease build the linklist:(!=-1)n); scanf(%d,&y); while(y!=-1) s=(Linklist)malloc(sizeof(snode); s-x=y; rear-next=s; rear=s; scanf(%d,&y); rear-next=NULL; return(head);Linklist reverse(snode *head) Linkli

23、st p,q; p=head-next; head-next=NULL; while(p) q=p; p=p-next; q-next=head-next; head-next=q; return(head);Linklist addition(snode *head) int flag=1; snode *s,*p,*q; p=head-next; while(p&flag) q=p;p=p-next; if(q-x=0) q-x=1; flag=0; else q-x=0; if(!p) s=(Linklist)malloc(sizeof(snode); s-x=1; q-next=s; s-next=NULL; return(head);main() Linklist h,h1,h2,h3,p; h=create(); p=h-next; printf(n*n); while(p) printf(%5d,p-x); p=p-next; printf(n*n); h1=addition(h); printf(n); p=h1-next; while(p) printf(%5d,p-x); p=p-next; printf(n*n);

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

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