1、李淑芬教材第3章答案级*p17/1.6/4打印所有的“水仙花数”,所谓水仙花数是指一个3位数,其各位数字三次方和等于该数字本身。编写该问题的算法。*/#includevoid main() int i; int is(int number); printf(所有的水仙花数:n); for(i=99;i1000;i+) if(is(i)=1)printf(%dn,i);int is(int number) int x=number%10; int y=number/10%10; int z=number/100; if(x*x*x+y*y*y+z*z*z=number) return 1; el
2、se return 0;*p17/1.6/5一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000以内的所有完数。*/#includeint main() int i,j,k; printf(1000以内的完数有:n); for(i=1;i1000;i+) k=0; for(j=1;jnext ) q = p-next; while (q-next) if (p-next-data = q-next-data) / 条件为真,删除重复元素 r = q-next; q-next=r-next; free(r); e
3、lse q=q-next; /while(q-next) p = p-next; 2、Void Delete_repnum(squlisttp *L, int i)/删除顺序表重复元素 int i,j,k; while(i=(*L).len) j=i+1; while(j=(*L).len) if( (*L).vecj= (*L).veci) for(k=j;k=(*L).len;k+) (*L).veck-1= (*L).veck; /*元素前移*/ (*L).len-;/*修改长度*/ else j+; i+; 作业1(ppt)Void Delete_repnum(SeqList *L,
4、int i) 删除有序顺序表中的重复元素 int i,j,k; while(i=(*L).len-1) if( (*L).veci+1= (*L).veci) for(k=i;klen-1; int t,i; if(L-len=0) return 0;/顺序表为空,直接返回 for(i=0;ilen/2;i+) t=L-datalow; L-datalow+=L-datahigh; L-datahigh-=t; 3、在线性表L中找出最大值和最小值的元素及其所在的位置。void List_Min&Max(SeqList *L) int i,pos_Min; int Max_data=L-data
5、0,Min_data=L-data0; for(i=0;iL-datai) /查找最小值及其位置 Min_data=L-datai; Pos_Min=i; if(Max_datadatai) Max_data=L-datai; Pos_Max=i; 四、应用题2、本算法的功能是将线性表的首元素移动到线性表的最后。如:(a1,a2,.,an),算法执行后,线性表变为(a2,a3,.,an,a1)。5、xsxxxsssxxsxxsxxssss3入x,3出s,*入x,-入x,y入x,y出s,- 出s,*出s,-入x,a入x,a出s,/入x,y入x,y出s,入,2入,2出,出,/ 出,- 出。6、可以
6、得到14种输出序列:abcd,abdc,acbd,acdb,adcb,bacd,bcad,bcda,bdca, badc.cbad,cbda,cdba,dcba7、9-2*4+(8+1)/3表达式前后输入#,表示开始和结束。序号运算符栈操作数栈输入字符1#92#9-3#-924#-92*5#-*9246#-*924+7#-988#19#+1(10#+(1811#+(18+12#+(+18113#+(+181)14#+19/15#+/19316#+/193#17#+1318#4五、算法设计题五(1).设单链表L是一个非递减有序表,试写一个算法将x插入其中后仍保持L的有效性I:带头结点 Int i
7、nsert(NODE *L,int x) NODE ,*s,*p;P=L;带头结点While(p-next)if(p-next-datax) s=malloc(sizeof(NODE);s-data=x; s-next=p;p-next=s;elsep=p-next;Return 0;II不带头结点Int insert(NODE *L,int x) NODE ,*s,*p;P=L;不带头结点While(p)if(p-datax) s=malloc(sizeof(NODE);s-data=x; s-next=p;p=s;elsep=p-next;Return 0;五(2)、有一个线性表存储在一个
8、不带头结点的单链表的第i个元素之前插入一个元素的算法分析:对不带头结点的链表操作时,要注意对第一个结点和其他结点操作的不同。 void LinkedListlnsert(LinkedList *L,int x,int i) /不带头结点的单链表的第i个元素之前插入一个元素 p=L:j=1; while(p!=NULL&jnext;j+; if(i=0|p=NULL) printf(”插入位置不正确n”);else while(p!=NULL&jnext;j+;q=(LinkedList*)malloc(sizeof(LinkedList);q-data=x; if(i=1) q-next=L;
9、L=q; /在第一个元素之前插入 elseq-next=p-next;p-next=q; /在其他位置插入 五、(3)设A、B是两个线性表,其表中元素递增有序,长度分别为m和n。试写一算法分别以顺序存储和链式存储将A和B归并成一个仍按元素值递增有序的线性表C。答:(1)分析:用三个变量i、j、k分别指示A、B、C三个顺序表的当前位置,将A、B表中较小的元素写入C中,直到有一个表先结束。最后将没结束的表的剩余元素写入C表中。SeqList *Seqmerge(SeqList A,SeqList B,SeqList *C)/有序顺序表A和B归并成有序顺序表C i=0;j=0;k=0; /i,i,k
10、分别为顺序表A,B,C的下标 while(im&jn) if(A.dataidatak=A.datai;i+; else C-datak=B.dataj; j+; /B中当前元素较小 k+; if (i=m) for(t=j;tdatak=B.datat;k+; /B表长度大于A表 else for(t=i;tdatak=A.datat;k+; /A表长度大于B表 C-length=m+n; return C;(2)VOid Linkmerge(LinkedList *A,LinkedList *B,LinkedList *C)有序链表A和B归并成有序链表C pa=A-next;pb=B-ne
11、xt;C=A;pc=C; while(pa&pb) A和B都不为空时 if(pa-datadata) A当前结点值较小 qa=pa-next; pC-next=pa; pc=pc-next; pa=qa; else qb=pb-next;pc-next=pb:pc=pc-next;pb=qb; /B当前结点值较小if(pa) pc-next=pa; /A没有结束,将A表剩余元素链接到C表if(pb) pc-next=pb; /B没有结束,将B表剩余元素链接到C表free(B); /释放B表的头结点本算法需要遍历两个线性表,因此时间复杂度为O(m+n)。五(4)编写一个算法将一个头结点指针为pa
12、的单链表A分解成两个单链表A和B,其头结点指针分别为pa和pb,使得A链表中含有原链表A中序号为奇数的元素,而B链表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。答:分析:根据题目要求,不能为表中的元素申请新的结点空间。用两个工作指针p和q分别指示序号为奇数和序号为偶数的结点,将q所指向的结点从A表删除,并链接到B表。void decompose(LinkedList *A,LinkedList *B)/单链表A分解成元素序号为奇数的单链表A和元素序号为偶数的单链表B LinkedList *r;p=A-next; B=(LinkedList*)malloc(sizeof(LinkedList); r=B; while(p!=NULL&p-next!=NULL) q=p-next; /q指向偶数序号的结点 p-next=q-next; /将q从A表中删除 r-next=q; /将q结点链接到B链表的末尾 r=q; /r总是指向B链表的最后个结点 p=p-next; /p指向原链表A中的奇数序号的结点 r-next=NULL; /将生成B链表中的最后一个结点的next域置为空
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1