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/*包含库函数printf()所需要的信息*/
#include/*包含库函数system()所需要的信息*/
#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/*包含库函数system()所需要的信息*/
#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/*包含库函数system()所需要的信息*/
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/*包含库函数system()所需要的信息*/
#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/*包含库函数system()所需要的信息*/
#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/*包含库函数system()所需要的信息*/
#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,返回操作系统*/
}