max=temp;
s++;
}
returnmax;
}
2、structnode*reverse(structnode*PHead);
其中,structnode定义如下:
structnode
{
intkey;
structnode*PNext;
}
此函数传入的pHead指向要处理的单向链表头,该链表以NULL指针结束。
函数实现链表链接方向(包括pHead指向的原头节点)的反转,如图1所示。
并将新链表头指针作为函数值返回。
在完成此函数时,你只能利用原有链表节点,不能申请新节点空间。
(2003年)
图1
解:
structnode*reverse(structnode*pHead)
{
structnode*p,*q,*t;
if(pHead==NULL)
returnNULL;
p=pHead;
q=p->pNext;
while(q!
=NULL)
{
t=q->pNext;
q->pNext=p;
p=q;
q=t;
}
pHead->pNext=NULL;
pHead=p;
returnpHead;
};
3、intsameCharsAtSamePos(char*s1,char*s2);
两个字符串的字符进行同位置比较,返回相同的字符数(串结束符’\0’不比较)。
例如,若s1=“abc”,s2=“Abc”,则返回值为2。
(2004年)
解:
intsameCharsAtSamePos(char*s1,char*s2)
{
intcounter=0;
while(*s1&&*s2)
{
if(*s1==*s2)
counter++;
s1++;
s2++;
}
returncounter;
}
4、一种最简单的字符串加密方法是将字符串的每一字符加上一个偏移量offset(不考虑溢出)。
请编写相应得编解码函数,其原型分别为:
char*encode(char*s,intoffset);
char*decode(char*s,intoffset);(2005年)
解:
char*encode(char*s,intoffset)
{
char*p=s;
while(*p)
{
*p+=offset;
}
returns;
}
char*decode(char*s,intoffset)
{
char*p=s;
while(*p)
{
*p-=offset;
}
returns;
}
5、编写函数将两个节点值递增的单向链表归并为一个。
要求利用原节点空间。
链表节点定义为:
Structnode
{
intvalue;
structnode*pNext;
};
函数原型为:
Structnode*merge(structnode*a,structnode*b);
其中a,b为要归并的两个单向链表头结点指针,函数返回值为归并后的单向链表头结点指针。
(2005年)
解:
structnode
{
intvalue;
structnode*pNext;
};
structnode*merge(structnode*a,structnode*b)
{
structnode*p;
structnode*q;
structnode*t;
if(a->value<=b->value)
{
p=a;
q=b;
}
else
{
p=b;
q=a;
}
t=p;
while(q)
{
if(p->pNext==NULL)
{
p->pNext=q;
break;
}
if(q->valuepNext->value)
{
structnode*k=q->pNext;
q->pNext=p->pNext;
p->pNext=q;
q=k;
continue;
}
p=p->pNext;
}
returnt;
};
6、加密字符串的最简单方法是采用异或运算法,设原文为A,密钥为B,则密文为A^B,如果解密,则再异或一次,即A^B^B,请设计出加密函数,其原型如下:
Voidencfile(char*s,intpwd);(2006年)
解:
charencfile(char*s,intpwd)
{
char*p=s;
while(*p)
{
*p^=pwd;
p++;
}
returns;
}
7、(n阶Hanoi塔问题)假设有三个命名为x,y,z的塔座,在塔座x上插有n个直径大小各不相同、依小到大编号为1、2、…..n的圆盘,要求将x塔座上的n个圆盘移至z上,并仍按同样的顺序叠排,圆盘移动时应遵守下列规则:
(1)、每次只能移动一个圆盘;
(2)、圆盘可插在x、y和z中任一塔座上;
(3)、任何时刻都不能将一个较大的原盘压在较小的圆盘的上面。
如下图所示为3阶Hanoi塔问题的初始状态。
试编写实现Hanoi塔问题的函数,函数原型如下:
VoidHanoi(intn,charx,chary,charz);(2006年)
解:
voidHanoi(intn,charx,chary,charz)
//将x塔座上的n个盘子移到塔座z上,塔座y可用作辅助塔座
{
if(n>0)
{
//将x上编号为1至n-1的原盘移到y,z作辅助塔
Hanoi(n-1,x,z,y);
//将编号为n的圆盘从x移到z
cout<"<//将y上编号为1至n-1的圆盘移到z,x作辅助塔
Hanoi(n-1,y,x,Z);
}
}
8、编写将字符串转换位整数的函数,函数原型如下:
intAtoI(char*strNum);
要求在转换时遇到非法字符转换结束,例如,当strNum=“12a”,返回12。
(2007年)
解:
intAtoI(char*strNum)
/*将字符串strNum转换成整数*/
{
intsign;/*表示符号,0表示整数,1表示负数*/
intabsValue=0;/*转换的整数的绝对值*/
unsignedinti;/*循环控制变量*/
if(strNum==NULL||strlen(strNum)==0)
{/*空串*/
return0;
}
elseif(strNum[0]=='+')
{/*正数*/
sign=0;
}
elseif(strNum[0]=='-')
{/*负数*/
sign=1;
}
elseif(strNum[0]>='0'&&strNum[0]<='9')
{/*整数开始*/
sign=0;
absValue=strNum[0]-'0';
}
else
{/*非法字符*/
return0;
}
for(i=1;i{
if(strNum[i]>='0'&&strNum[i]<='9')
{/*s数字字符*/
absValue=10*absValue+strNum[i]-'0';
}
else
{/*非法字符*/
break;
}
}
if(sign==0)
{/*正数*/
returnabsValue;
}
else
{/*负数*/
return-absValue;
}
}
9、设有整数序列a0,a1,….an-1,给出球平均值的递归函数,函数原型如下:
floatAverage(inta[],intn);(2007年)
解:
floatAverage(inta[],intn)
/*求a[0]..a[n-1]的平均值*/
{
if(n==1)
{/*数组a只有一个元素,a[0]的值为平均值*/
return(float)a[0];
}
else
{/*注意a[0]..a[n-1]的平均值与a[0]..a[n-2]的平均值的关系*/
return(Average(a,n-1)*(n-1)+a[n-1])/n;
}
}
五、运用编程题
1、按要求完成简单的客车车次查询程序。
(2003年)
某车站需要一个简单的客车车次查询程序。
说明如下:
1、客车车次数据文件checi.txt放在c:
\data目录下,格式为:
T8成都北京西09:
30
1364成都北京西14:
20
K118攀枝花北京西22:
00
………
其中每行为一次车的信息,分为4个数据项:
车次,始发站,终点站和离开本站时间。
前三个数据项留的宽度为8字符,最后一项结束后即换行。
数据项间一定有空格隔开,每一数据项内无空格。
2.你的程序对用户通过命令行参数指一的车次,在客车车次数据文件中查找相应车次信息并输出该次车的始发站,终点站和离开本站时间,如果未找到,则输出“找不到该次车信息!
”。
3.你的程序可以使用标准的C库函数,可以不引用文件。
程序中应给出必要的注释。
解:
intmain(intargc,char*argv[])
{charinfo[4][20];
FILE*fp;
intI,found=0;
if(argc!
=2)
{printf("参数个数不正确!
\n");
return1;
}
fp=fopen("c:
\\checi.txt","r");
if(fp==NULL)
{printf("无法打开数据文件!
\n");
return1;
}
while(!
feof(fp))
{for(I=0;i<4;i++)
fscanf(fp,"%s",info[i]);
if(!
stricmp(info[0],argv[1]))
{found=1;
printf("始发站:
%s\n",info[1]);
printf("始发站:
%s\n",info[2]);
printf("离本站时间:
%s\n",info[3]);
break;
}
}
if(!
found)
printf("找不到该次车信息!
\n");
return0;
}
2、按要求编写程序对一种特殊字符串解码。
(2004年)
要处理的特殊字符串由A,C,G,U四个字符组成,如下所示:
ACUGCCCAUGAAAAACUUUUGACAC
其有效信息子串从第一次出现“AUG”后开始,遇到“UGA”结束(不包括“AUG”和“UGA”。
)如上面的编码串需解码的有效子串为:
AAAAACUUU
有效子串中每3个字符(如“AAA”,“CGA”)作为一个密码子(可以保证,有效子串的长度一定为3的整数倍。
)可能的密码子(62种)及相应码值以如下形式放在编码文件code.txt中(按密码子字典序排列);
AAAK
AACN
…………
UUUF
请编写C程序对存放在文件中的特殊字符串解码,在屏幕输出解码串。
如:
KNF
KNE
要求:
1、编码文件code.txt放在c盘根目录下;
2、要解码的特殊字符串以文件形式存放,其串长不超过1024字符;
3、你编写的程序应能处理命令参数,指定要解码的字符串文件;
4、程序中可以使用C语言的标准库函数,不需要写出头文件;
5、程序中应有必有的注释。
解:
#include〈stdio.h〉
#include〈string.h〉
struct
{
charname[4];
charcode;
}table[62];
intmain(intargc,char*argv[])
{
FILE*codefile=NULL,*stringfile=NULL;
charstring[1024+2],buffer[4],*p,*end;
intI;
/*检查命令行参数*/
if(argc<=1)
}
/*打开编码文件以及待解码文件*/
codefile=fopen("c:
\\code.txt","r");
stringfile=fopen(argv[1],"r");
if(code_file==NULL||string_file==NULL)
return1;
/*读编码文件,将结果记入表中*/
for(i=0;i<62;i++)
{
fscanf(code_file,"%s%c\n",tabie[i],name,&table[i].code);
}
/*读待解码文件内容到string中*/
fgets(string,sizeof(string),string_file);
/*扫描有效子串头*/
p=strstr(string,"AUG");
end=strstr(p+3,"UGA");
/*读有效子串,查表输出解码字符,直到子串尾*/
for(p+=3;p{
for(i=0;i<3;i++)
{
buffer[i]=p[i];
}
buffer[i]='\0';
for(i=0;i<62;i++)
{
if(strcmp(buffer,table[i].name))==0)
{
printf("%c",table[i].code);
break;
}
}
}
/*关闭编码文件以及待解码文件*/
fclose(code_file);
fclose(string_file);
return0;
}
3、编写程序模拟数字LED显示。
(2005年)
编写程序完成如下功能:
用户键盘输入最多四位的整数,在屏幕上以类似LED方式显示。
如用户输入为:
8234
则输出
其中每个数字字模均为7行×4列。
0-9+个数字的字模顺序地以文本形式存放在方件C:
\font.txt中。
要求:
1、输出的各数字间有1个空格;
2、你的程序可以使用C语言标准库函数,不需要写出头文件;
程序中应有必有的注释。
解:
charfont[10][7][5];
intn;
intdigit[4];
intlenth=0;
/*装载字体文件*/
voidload_fonts()
{
inti,j,k;
FILE*file;
file=fopen("c:
\\font.txt","r");
if(file==NULL)
{
printf("打开字体文件font.txt错误!
\n");
exit
(1);
}
for(k=0;k<10;k++)
{
for(i=0;i<7;i++)
{
charline[10];
fgets(line,10,file);
for(j=0;j<4;j++)
{
font[k][i][j]=line[j];
}
font[k][l][4]=0;
}
}
fclose(file);
}
/*将输入的整数解码为单个的数字*/
voiddecode()
{
inti;
intm=n;
for(i=0;i<4;i++)
{
digit[i]=m%10;
m=m/10;
if(m==0)
break;
}
lenth=i+1;
if(lenth>=4)
lenth=4;
}
/*显示LED*/
voiddisplay()
{
inti,j;
for(i=0;i<7;i++)
{
for(j=lenth-i;j>=0;j--)
{
printf("%s",font[j][i]);
printf("");
}
printf("\n");
}