游洪跃的C语言程序设计第9章 习题解答.docx
- 文档编号:12276635
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:16
- 大小:22.73KB
游洪跃的C语言程序设计第9章 习题解答.docx
《游洪跃的C语言程序设计第9章 习题解答.docx》由会员分享,可在线阅读,更多相关《游洪跃的C语言程序设计第9章 习题解答.docx(16页珍藏版)》请在冰豆网上搜索。
游洪跃的C语言程序设计第9章习题解答
第9章习题解答
一、选择题
1.以下程序:
/*文件路径名:
ex9_1_1\main.c*/
#include
#include
intmain(intargc,char*argv[])/*主函数main()*/
{
intn=0,i;/*定义变量*/
for(i=1;i n=n+strlen(argv[i]);/*对argv[i]的长度累加求和*/ printf("%d\n",n);/*输出n*/ return0;/*返回值0,返回操作系统*/ } 该程序生成的可执行文件名为proc.exe。 若运行时输入命令行: proc1234567 则程序的输出结果是。 A)3B)5C)7D)11 解析: main()函数中参数argc包含命令行选项的个数,argv包括argc个字符串。 并对首字符串外的其它字符串长度累加求和。 答案: C 2.有以下程序: intadd(inta,intb){returna+b;}/*函数定义*/ intmain(void)/*主函数main()*/ { intk,(*f)(int,int),a=5b=10; f=add; …… } 则以下函数调用语句错误的是_。 (2006.09) A)k=(*f)(a,b);B)k=add(a,b);C)k=*f(a,b);D)k=f(a,b); 解析: 选项C把f(a,b)整体作为指针了,注意只有f是函数指针,应该为(*f)(a,b)。 答案: C 3.程序中若有如下说明和定义语句: charfun(char*);/*函数声明*/ intmain(void)/*主函数main(void)*/ { char*s="one",a[5]={0},(*f)(char*)=fun,ch; …… } 以下选项中对函数fun的正确调用语句是_。 A)(*f)(a);B)*f(*s);C)fun(&a);D)ch=*f(s); 解析: 函数指针f指向了函数fun,fun的形参类型是字符指针。 调用语句“fun(s);fun(a);”或“(*f)(s);(*f)(a);”是正确的。 因此选项A正确,其余选项错误。 答案: A 4.有以下结构体说明和变量定义,如下图所示,指针p,q,r分别指向此链表中的三个连续结点。 structNode { intdata;/*数据成员*/ structNode*next;/*指针成员,指向后继*/ }*p,*q,*r; 现将q所指结点从链表中删除,同时要保持链表的连续,以下不能完成指定操作的语句是。 A)p->next=q->next;B)p->next=p->next->next; C)p->next=r;D)p=q->next; 解析: 要将q所指结点从链表中删除,同时要保持链表的连续,应该p->next=r,由于q->next,p->next->next都指向r,因此p->next=q->next,p->next=p->next->next都完成同样的的操作。 也就是选项A,B,C都能完成指定操作。 选项D的p=q->next,只是将指针p指向了r,不能完成指定的操作。 因此正确选项是Do 答案: D 二、填空题 1.以下程序的输出结果是。 /*文件路径名: ex9_2_1\main.c*/ #include #include char*fun(char*p){returnp+strlen(p)/2;} intmain(void)/*主函数main()*/ { char*str="abcdefgh";/*定义字符串*/ str=fun(str);/*调用函数fun()*/ puts(str);/*输出str*/ return0;/*返回值0,返回操作系统*/ } 解析: 函数fun()返回指向参数字符串的后半部分的指针,也就是程序功能是输出字符串的后半部分,所以输出为efgh。 答案: efgh 2.已有定义“double*p;”,请写出完整的语句,利用malloc函数使p指向一个双精度型的动态存储单元。 解析: malloc函数的调用形式为malloc(size),函数用来分配size个字节的存储区,返回一个指向存储区首地址的基类型为void的地址。 题目要求双精度类型指针p指向一个双精度类型的动态存储单元,需利用sizeof运算符来求得数据类型所占字节数,空白处应填“p=(double*)malloc(sizeof(double))”。 答案: p=(double*)malloc(sizeof(double)) 三、编程题 *1.编写一个求带头结点的线性链表的长度的函数。 参考程序: /*文件路径名: ex9_3_1\main.c*/ #include #include #include typedefintElemType; typedefstructNode {/*线性链表结点的结构描述*/ ElemTypedata;/*数据成员*/ structNode*next;/*指针成员*/ }LNode; intLength(LNode*head);/*求线性表长度*/ voidCreateLinkList(LNode*head);/*建立线性链表*/ voidDisplayLinkList(LNode*head);/*显示线性链表*/ intmain(void)/*主函数main()*/ { LNode*head;/*定义链表头指针*/ /*生成空线性链表*/ head=(LNode*)malloc(sizeof(LNode));/*分配存储空间*/ head->next=NULL;/*空链表头结点后继为空*/ CreateLinkList(head);/*建立线性链表*/ DisplayLinkList(head);/*显示线性链表*/ printf("长度为%d\n",Length(head));/*输出长度*/ system("PAUSE");/*调用库函数system(),输出系统提示信息*/ return0;/*返回值0,返回操作系统*/ } intLength(LNode*head)/*求线性表长度*/ { LNode*p=head->next;/*p第向第一个元素结点*/ intlen=0;/*线性链表长度*/ while(p! =NULL) {/*p指向非空结点*/ p=p->next;/*p向向下一结点*/ len++;/*元素个数自加1*/ } returnlen;/*返回len*/ } voidCreateLinkList(LNode*head)/*建立线性链表*/ { LNode*p,*rear=head;/*空线性链表的表头与表尾都指向头结点*/ ElemTypex;/*定义变量x*/ printf("输入数据元素值x,当x=0时退出: ");/*提示信息*/ scanf("%d",&x);/*输入数据元素值x*/ while(x! =0) {/*循环建立线生链表*/ p=(LNode*)malloc(sizeof(LNode));/*分配存储空间*/ p->data=x;/*数据元素值为x*/ p->next=NULL;/*新追加结点为尾结点,后继为空*/ rear->next=p;/*新追加的结点在最后,也就是rear的后继*/ rear=p;/*新追加的结点为新的表尾,rear指向新表尾*/ scanf("%d",&x);/*输入数据元素值x*/ } } voidDisplayLinkList(LNode*head)/*显示线性链表*/ { LNode*p=head->next;/*p指向线性表的第一个结点*/ printf("线性链表: ");/*提示信息*/ while(p! =NULL) {/*p分别指向各元素*/ printf("%d",p->data);/*显示元素值*/ p=p->next;/*p指向下一元素*/ } printf("\n");/*换行*/ } **2.通过变长参数实现求n个数的积。 参考程序: /*文件路径名: ex9_3_2\main.c*/ #include #include #include intMulti(intn,...)/*参数n表示要求各的元素个数*/ { intm=1,i;/*定义变量*/ va_listal;/*变长参数变量*/ va_start(al,n);/*初始化va_list声明的变量al*/ for(i=1;i<=n;i++) m*=va_arg(al,int);/*取出变长参数*/ va_end(al);/*结束变长参数的引用*/ returnm;/*返回乘积*/ } intmain(void)/*主函数main()*/ { intx=12,y=12,z=18,u=8,v=9,w=16;/*定义变量*/ printf("x=%d\ny=%d\nz=%d\nu=%d\nv=%d\nw=%d\n",x,y,z,u,v,w); /*输出变量的值*/ printf("x,y与z的积是%d.\n",Multi(3,x,y,z));/*输出Multi(3,x,y,z)的值*/ printf("u,v与w的积是%d.\n",Multi(3,u,v,w));/*输出Multi(3,u,v,w)的值*/ printf("x,y,z,u,v与w的积是%d.\n",Multi(6,x,y,z,u,v,w));/*输出Multi(6,x,y,z,u,v,w)的值*/ system("PAUSE");/*调用库函数system(),输出系统提示信息*/ return0;/*返回值0,返回操作系统*/ } **3.用命令行参数编程实现显示文本文件内容。 参考程序: /*文件路径名: ex9_3_3\main.c*/ #include #include intmain(intargc,char*argv[])/*主函数main()*/ { FILE*fp;/*定义文件指针变量*/ charc;/*定义字符变量c*/ if(argc! =2)/*命令行参数不为3*/ printf("用法: ShowFile文件名\n"); else {/*命令行参数为3*/ if((fp=fopen(argv[1],"r"))==NULL) { printf("文件%s打不开! \n",argv[1]);/*错误信息*/ system("PAUSE");/*调用库函数system(),输出系统提示信息*/ exit (1);/*退出程序*/ } c=fgetc(fp);/*从源文件中读一字符*/ while(! feof(fp)) { putchar(c);/*显示c*/ c=fgetc(fp);/*从源文件中读一字符*/ } fclose(fp);/*关闭文件*/ } system("PAUSE");/*调用库函数system(),输出系统提示信息*/ return0;/*返回值0,返回操作系统*/ } **4.创建一个不带头结点的链表,并按输入顺序相反的次序各数据的值。 参考程序: /*文件路径名: ex9_3_4\main.c*/ #include #include #include typedefintElemType; typedefstructNode {/*线性链表结点的结构描述*/ ElemTypedata;/*数据成员*/ structNode*next;/*指针成员*/ }LNode; voidCreateLinkList(LNode**ppHead);/*建立线性链表*/ voidDisplayLinkList(LNode*head);/*显示线性链表*/ intmain(void)/*主函数main()*/ { LNode*head=NULL;/*定义链表头指针*/ CreateLinkList(&head);/*建立线性链表*/ DisplayLinkList(head);/*显示线性链表*/ system("PAUSE");/*调用库函数system(),输出系统提示信息*/ return0;/*返回值0,返回操作系统*/ } voidCreateLinkList(LNode**ppHead)/*建立线性链表*/ { LNode*p;/*定义指针*/ ElemTypex;/*定义变量x*/ printf("输入数据元素值x,当x=0时退出: ");/*提示信息*/ scanf("%d",&x);/*输入数据元素值x*/ while(x! =0) {/*循环建立线性链表*/ p=(LNode*)malloc(sizeof(LNode));/*分配存储空间*/ p->data=x;/*数据元素值为x*/ p->next=*ppHead;/*新结点插在链表的最前面*/ *ppHead=p;/*新结点为新的头结点*/ scanf("%d",&x);/*输入数据元素值x*/ } } voidDisplayLinkList(LNode*head)/*显示线性链表*/ { LNode*p=head;/*p指向线性表的第一个结点*/ printf("线性链表: ");/*提示信息*/ while(p! =NULL) {/*p分别指向各元素*/ printf("%d",p->data);/*显示元素值*/ p=p->next;/*p指向下一元素*/ } printf("\n");/*换行*/ } **5.创建一个不带头结点的链表,采用递函数显示一个链表的各数据成员的值。 参考程序: /*文件路径名: ex9_3_5\main.c*/ #include #include #include typedefintElemType; typedefstructNode {/*线性链表结点的结构描述*/ ElemTypedata;/*数据成员*/ structNode*next;/*指针成员*/ }LNode; voidCreateLinkList(LNode**ppHead);/*建立线性链表*/ voidDisplayLinkList(LNode*head);/*显示线性链表*/ intmain(void)/*主函数main()*/ { LNode*head=NULL;/*定义链表头指针*/ CreateLinkList(&head);/*建立线性链表*/ DisplayLinkList(head);/*显示线性链表*/ system("PAUSE");/*调用库函数system(),输出系统提示信息*/ return0;/*返回值0,返回操作系统*/ } voidCreateLinkList(LNode**ppHead)/*建立线性链表*/ { LNode*p,*rear=*ppHead;/*空线性链表的表头与表尾都指向头结点*/ ElemTypex;/*定义变量x*/ printf("输入数据元素值x,当x=0时退出: ");/*提示信息*/ scanf("%d",&x);/*输入数据元素值x*/ while(x! =0) {/*循环建立线性链表*/ p=(LNode*)malloc(sizeof(LNode));/*分配存储空间*/ p->data=x;/*数据元素值为x*/ p->next=NULL;/*新追加结点为尾结点,后继为空*/ if(rear==NULL) {/*空线性链表*/ *ppHead=rear=p;/*头尾指针都指向同一个结点*/ } else { rear->next=p;/*新追加的结点在最后,也就是rear的后继*/ rear=p;/*新追加的结点为新的表尾,rear指向新表尾*/ } scanf("%d",&x);/*输入数据元素值x*/ } } voidDisplayLinkList(LNode*head)/*显示线性链表*/ { if(head! =NULL) {/*线性链表非空*/ printf("%d",head->data);/*显示元素值*/ DisplayLinkList(head->next);/*递归调用*/ } else {/*空线性链表*/ printf("\n");/*换行*/ } } **6.用不带头结点的链表存储栈,分别采用递归函数建立栈及显示一个栈的各数据成员的值。 参考程序: /*文件路径名: ex9_3_6\main.c*/ #include #include #include typedefintElemType; typedefstructNode {/*链栈结点的结构描述*/ ElemTypedata;/*数据成员*/ structNode*next;/*指针成员*/ }LNode; voidCreateLinkStack(LNode**ppTop);/*建立链栈*/ voidDisplayLinkStack(LNode*top);/*显示链栈*/ intmain(void)/*主函数main()*/ { LNode*top=NULL;/*定义栈顶指针*/ printf("输入数据元素值x,当x=0时退出: ");/*提示信息*/ CreateLinkStack(&top);/*建立链栈*/ DisplayLinkStack(top);/*显示链栈*/ system("PAUSE");/*调用库函数system(),输出系统提示信息*/ return0;/*返回值0,返回操作系统*/ }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 游洪跃的C语言程序设计第9章 习题解答 游洪跃 语言程序设计 习题 解答
![提示](https://static.bdocx.com/images/bang_tan.gif)