教材课后题答案_第1页
教材课后题答案_第2页
教材课后题答案_第3页
教材课后题答案_第4页
教材课后题答案_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

习题7一单选题设有如下定义,则表达式sizeof(y)的值是【】。structdata(long*ln;charc;structdata*last,*next;}y;A.7 B.9 C.13 D.17【答案】C【解析】指针变量在内存中占用4个字节,所以sizeof(y)的值是4+1+4+4=13设有以下程序段,则表达式的值不为100的是【】。structst(inta;int*b;};voidmain()(intm1[]=(10,100},m2[]=(100,200};structst*p,x[]=(99,m1,100,m2};p=x;}A.*(++p->b) B.(++p)->a C.++p->a D.(++p)->b【答案】D【解析】根据题意,p指向x数组,x[0]的b成员指向m1数组,x[1]的b成员指向m2数组,如图7-1所示。选项A中p->b指向m1[0],通过“++”运算p->b指向m1[1],所以选项A的表达式的值为100。选项B中++p使p指向x[1],x[1]的a成员的值是100。选项C中p指向x[0],x[0]的a成员做“++”运算,结果为100。选项D中++p使p指向x[1],x[1]的b成员的值是指针,所以选择选项D。设有以下定义,且如图7-2所示,指针head和p指向链表的第一个结点,指针q指向新的结点,则不能把新结点插入在第一个结点之前的语句是【】。图7-2图7-2structnode(inta;structnode*next;B.head=q,q->next=head;D.head=q,head->next=p;B.head=q,q->next=head;D.head=q,head->next=p;A.head=q,q->next=p;C.q->next=head,head=q;【答案】B设有如下结构体说明和变量定义,且如图7-3所示,指针p指向变量。ne,指针q指向变量two,则不能将结点two接到结点one之后的语句是【】。图7-3图7-3structnode(intn;structnode*next;}one,two,*p=&one,*q=&two;A.p.next=&two; B.(*p).next=q;C.one.next=q; D.p->next=&two;【答案】A【解析】p是指向结构体的指针,因此选项D是规范的引用方式。5.设有以下定义,且如图7-4所示建立了链表,指针p、q分别指向相邻的两个结点,下列语句中【】不能将p所指向的结点删除。head•♦•图7-4head•♦•图7-4structnode(inta;structnode*link;}*head,*p,*q;B.p=p->link,q->link=p;D.p=(*p).link,(*q).link=p;B.p=p->link,q->link=p;D.p=(*p).link,(*q).link=p;C.(*p).link=(*q).link;【答案】C6.以下选项中,能正确地将x定义为结构体变量的是【】。A.structB.typedefstructst(inti;(inti;floatj;floatj;}x;}x;C.structstD.typedefst(inti;(inti;floatj;floatj;}}stx;【答案】Astx;【解析】选项C语法错误。7.若有如下定义,则sizeof(structno)的值是【】。structno(intn1;floatn2;unionnu(charu1[6];doubleu2;}n3;};A,12 B.14 C.16 D.10【答案】C【解析】4+4+max(6,8}=16。设有如下定义,则下列叙述中正确的是【】。typedefstruct(ints1;floats2;chars3[80];}STU;A.STU是结构体变量名 B,typedefstruct是结构体类型名C.STU是结构体类型名 D.struct是结构体类型名【答案】C设有如下定义,则引用共用体中h成员的正确形式为【】。unionun(inth;charc[10];};structst(inta[2];unionunh;}s=({1,2},3},*p=&s;A.p.un.hB.(*p).h.hC.p->st.un.hD.s.un.h【答案】B以下各选项欲为float定义一个新的类型名,其中正确的是【】。A.typedeffloatw1; B.typedefw2float;C.typedeffloat=w3; D.typedefw4=float;【答案】A二填空题设有以下定义,则变量s在内存中占字节。structst(charnum[5];intage;floatscore;}s;【答案】13【解析】1X5+4+4=13。以下程序用以输出结构体变量bt所占内存单元的字节数,请填上适当内容。structps(doublei;chararr[20];};voidmain()(structpsbt;printf("btsize:%d\n",);}【答案】sizeof(structps)若定义了struct(intd,m,n;}a,*b=&a;,可用a.d引用结构体成员,请写出引用结构体成员a.d的其他两种形式【1】 , 【2】 。【答案】【1】(*b).d【2】b->d设有以下结构体类型的定义,请将结构体数组xy的定义补充完整。structST(charnum[10];intm;structST*last,*next;}; xy[10];【答案】structST以下是定义链表中结点的数据类型,请将定义补充完整。structnode(charname[20];intscore; next;};【答案】structnode*设有以下定义,且建立了链表,如图7-5所示,指针p指向链表尾结点,指针q指向新结点,用语句可实现将新结点连接到链表尾部。structnode(inta;structnode*link;}*head,*p,*q;【答案】(*p).link=q;(或p->link=q;)head——1|卜...-5NULL| 6NULL图7-5下列程序是将从键盘输入的一组字符作为结点的内容建立一个单向链表。要求输出链表内容时与输入时的顺序相反。填空将程序补充完整。#include"stdio.h"#include"stdlib.h"structnode(chard;structnode*link;};voidmain()(structnode*head,*p;charc;head=NULL;while((c=getchar())!='\n')(p=(structnode*)malloc(sizeof(structnode));p->d=c;p->link=【1】 ;head= 【2】 ;}p=head;while(p->link!=NULL)(printf("%c->",p->d);p=—【1】—;}printf("%c\n",p->d);}【答案】【1】head【2】p 【3】p->link【解析】第一个空应该填入新结点插入链表后它的下一个结点的地址。由于题目要求输出链表内容时与输入时的顺序相反,而且单向链表只能从头到尾输出,所以每次新结点必须作为第一个结点插入到链表,并使从前的第一个结点作为它的后续结点,这样做的结果恰好使生成的链表的顺序与输入顺序相反,因此第一个空填head。第二个空的内容应实现头指针指向新结点,所以填p。第三个空是在输出结点内容的循环中,输出一个结点后,指针需要后移,所以应填p->link。下列函数的功能是在单向链表中查找最大值所在结点的地址。填空将函数补充完整。structnode(intdata;structnode*next;};structnode*found(structnode*head)(structnode*p,*q;intmax;p=head;max=p->data;q=p;while(p->next!=NULL){―【1】—;if(p->data>max){max=p->data;【2】 ;}}returnq;}【答案】【1】p=p->next【2】q=p【解析】在循环查找之前p和q都指向了第一个结点,并将第一个结点的数据假设为最大值。在循环查找的过程中,p指针需要顺着链表不断后移,所以第一个空应填p=p->next。q指针的作用是指向当前的最大值,这一点也可以从returnq;看出,所以第二个空应填q=p。设有以下定义和语句,请在printf语句中填上能够正确输出的变量及相应的格式说明。union{intn;doublex;}num;num.n=10;num.x=10.5;printf("【1】 ", 【2】 );【答案】【1】%lf 【2】num.x下面欲为结构体类型structst定义一个新的类型名STUDENT,请将定义补充完整。structst{charnum[10],name[20],sex;floatscore;};typedefSTUDENT;【答案】structst三阅读程序,写出结果#include"stdio.h"structst{inta,b;structst*next;}x[3];voidmain(){inti;structst*p;for(i=0;i<3;i++){x[i].a=i+1,x[i].b=i+2;x[i].next=&x[i+1];}x[2].next=x;for(p=x,i=0;i<3;i++){printf("%d”,p->a);p=p->next;printf("%d”,p->b);p=p->next;【答案】133224【解析】x数组是一个结构体数组,通过第一个for循环以及其后的一个语句建立了一个环状链表°x[0]的next成员指向x[1],x[1]的next成员指向x[2],x[2]的next成员又指向了x[0]。所以在随后的循环输出中,通过p不断改变指向得到结果133224#include"stdio.h"structstu(intn;charname[20];intage;};voidpri(structstu*p)(printf("%s\n",p->name);}voidmain()(structstus[4]=((200201,”zhao”,19},(200202,”Qian”,18},(200203,”sum”,19},(200204,”Li”,18}};pri(s+3);}【答案】Li【解析】调用pri函数时,实参应该是结构体类型指针,s数组是一个结构体数组,s+3是s[3]的地址,所以通过函数调用语句pri(s+3);得到结果Li。#include"stdio.h"#include"stdlib.h"structnode(charni;structnode*next;};voidmain()(structnode*head,*p;intn=48;head=NULL;do(p=(structnode*)malloc(sizeof(structnode));p->ni=n%8+48;p->next=head;head=p;n=n/8;}while(n!=0);p=head;while(p!=NULL)(printf("%c",p->ni);p=p->next;}【答案】60【解析】在此程序中head为链表的头指针,p指向新结点。在do-while循环中通过p->next=head;和head=p;语句,总是将新结点链接在链表的第一个结点的位置。这样在while循环中输出链表各结点内容时,就形成了一种与新结点产生顺序相反的结果。至于结点数据域的内容(n%8+48)是整数n除以8的余数的ASCII值,然后n再整除8,通过循环重复计算,直到n为0结束。程序的结果是逆序输出这些余数,这个算法实现了十进制数转换为八进制数。#include"stdio.h”#include"stdlib.h"voidfun(int**p,intx[2][3]){**p=x[1][1];}voidmain(){inty[2][3]={1,2,3,4,5,6},*t;t=(int*)malloc(4);fun(&t,y);printf("%d\n”,*t);}【答案】5【解析】其中y[0][0]=1,y[0][1]=2,y[0][2]=3,y[1][0]=4,y[1][1]=5,y[1][2]=6,#include"stdio.h"unionun{intx;struct{inta,b,c;}y;}z;voidmain(){z.x=5;z.y.a=1;z.y.b=2;z.y.c=3;printf("%d\n”,z.x);}【答案】1四编程题定义一个结构体数组,存放10个学生的信息,每位学生的信息是一个结构体类型数据,其成员分别为:学号、姓名、五门成绩及总分。要求编写3个函数,它们的功能分别为:①输入函数,用于从键盘读入学号、姓名和五门成绩;②计算总分函数,用于计算每位学生的总分;③输出函数,显示每位学生的学号、姓名和总分。这3个函数的形式参数均为结构体指针和整型变量,函数的类型均为void。【程序】#include"stdio.h"#include"stdlib.h"structst{charnum[8],name[20];intscore[5],total;};voidinsub(structst*p,intn)/*输入学生信息函数*/{inti,j;for(i=0;i<n;i++,p++){printf("Inputnumber:\n");scanf("%s”,p->num);printf("Inputname:\n");scanf("%s”,p->name);printf("Input5scores:\n");for(j=0;j<5;j++)scanf("%d”,&p->score[j]);}}voidsumsub(structst*p,intn)/*计算总分函数*/{inti,j;for(i=0;i<n;i++,p++){p->total=0;for(j=0;j<5;j++)p->total+=p->score[j];}}voidoutsub(structst*p,intn)/*输出学生总分函数*/{inti;printf("numbername total\n");for(i=0;i<n;i++,p++)printf("%-8s%-20s%4d\n",p->num,p->name,p->total);}voidmain(){structstx[10];insub(x,3); /*调试程序时将10改为3*/sumsub(x,3);outsub(x,3);}【运行情况】Inputnumber:0311010/Inputname:zhuming/Input5scores:7884907382/Inputnumber:0311011/Inputname:yanweifeng/Input5scores:8588797692/Inputnumber:0311012/Inputname:mifangzhou/Input5scores:8077898780/numbername totalTOC\o"1-5"\h\z0311010zhuming 4070311011yanweifeng 4200311012mifangzhou 413编写一个creat函数,其功能是用键盘输入的字符序列建立一个具有头结点的单向链表,新结点总是追加在链表的尾部,字符序列以’#’为结束标志,函数的返回值是链表的头指针。【思路】首先定义链表结点的数据类型,数据域部分应是一个字符型成员。然后定义三个指针,h作为链表的头指针,p指针用于创建新结点,q指针用于指向链表的尾结点。由于头结点的数据域部分不需要存放数据,所以用p指针创建新结点后,可以直接让h和q指针指向它,使其成为头结点和尾结点。将变量C用于存放键盘输入的字符,如果输入的不是“#”,则将其存入新结点的数据域,然后继续输入字符;否则完成链表的创建。【程序】#include"stdio.h"#include"stdlib.h"structnode(chardata;structnode*next;};structnode*create()(structnode*h,*p,*q;charc;p=(structnode*)malloc(sizeof(structnode));h=q=p; /*将新结点作为头结点和尾结点*/c=getchar();while(c!='#')(p=(structnode*)malloc(sizeof(structnode));p->data=c; /*将字符存入新结点的数据域*/q->next=p; /*新结点链接到链表的尾部*/q=p; /*q指针指向新的尾结点*/c=getchar();}p->next=NULL;/*存入链表结束标志*/returnh;}用一个链表表示一个一元n次多项式,每个结点的数据部分包括指数和系数。例如,多项式2x5-3x4+6x-7,可用下面的链表表示:

4-3-7NULL4-3-7NULL图7-6编写一个程序,要求包括两个函数,①建立一元n次多项式链表函数;②输出一元n次多项式链表函数(将多项式中指数形式以XAn形式输出),并从主函数调用这两个函数完成一元n次多项式链表的建立和输出。【思路】首先在定义链表中结点的数据结构时,其数据域部分应定义为三个成员,分别用于存放指数、系数和下一个结点的地址。其次在编制建立链表函数时,根据一元n次多项式特点,将X0项作为结束标志,所以此项系数为0是也要输入。最后在编制输出链表函数时,应考虑的几点问题,第一,系数的符号输出;第二,系数为)时不输出此项,系数为1时省略系数;第三,指数为0时仅输出系数,指数为1时省略指数。【程序】#include"stdio.h"#include"stdlib.h"structnode(intexp,co;structnode*next;};structnode*creat()/*建立链表函数*/(staticstructnode*h;structnode*p,*q;h=NULL;do(p=(structnode*)malloc(sizeof(structnode));printf("Inputtheexponent:\n");scanf("%d",&p->exp);printf("Inputthecoefficient:\n");scanf("%d",&p->co);p->next=NULL;if(h==NULL)h=p;elseq->next=p;q=p;}while(p->exp!=0);returnh;}q->next=p;q=p;}while(p->exp!=0);returnh;}voidprint(structnode*head)(structnode*p;p=head;if(p->co!=1)printf("%d",p->co);if(p->exp==1)printf("X");/*当最新输入的一项的指数为0时结束输入*//*输出链表函数*//*如果系数不是1,则打印系数*//*如果指数是1,则不打印指数*/elseprintf("XA%d",p->exp);p=p->next;while(p!=NULL)/*如果系数不为0/*如果系数不为0,则打印此项*//*打印各项的系数符号*//*判断各项指数是否为0*/{if(p->co>=0)printf("+");elseprintf("-");if(p->exp!=0){if(abs(p->co)!=1)printf("%d”,abs(p->co));/*系数绝对值不为1时打印*/if(p->exp==1) /*指数为1时省略*/printf("X");elseprintf("XA%d",p->exp);}else /*指数为0,仅打印系数*/printf("%d”,abs(p->co));}p=p->next;}}voidmain(){structnode*head;head=creat();print(head);}【运行情况】Inputtheexponent:5/Inputthecoefficient:WInputtheexponent:4/Inputthecoefficient:-3/Inputtheexponent:1/Inputthecoefficient:6/Inputtheexponent:0/Inputthecoefficient:-7/2XA5-3XA4+6X-7编写一个程序,运用插入结点方法,将键盘输入的n个整数插入到链表中,建立一个从小到大的有序链表。【思路】运用插入法建立有序链表时,每插入一个结点都需要三个步骤:第一,开辟新结点;第二,查找插入位置;第三,将新结点链接到链表。第二、第三步是关键,可编制一个插入链表结点函数。设head为头指针,指向链表的第一个结点。p0为指向新结点的指针。p和q为工作指针,利用p指针查找插入位置,q指针为p指针的前导指针。新结点插入到链表时共有四种情况:空表时插入(当head==NULL);在表头插入(当p0->d<=head->d);在表中间插入(p0->d<=p->d);在表尾追加(p0->d>p->d&&p->next==NULL)。算法如图7-7所示。—-——fhead=p0p=headwhile(p0->d>p->d&&p->next!=NULL)q=p;p=p->next; ^_^p0->d<=p->d^^^^^^p==hea^^«-^*^""""""^p->next=p0head=p0 q->next=p0p0->next=p图7-7【程序】#include"stdio.h"#include"stdlib.h"#define

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论