}}
)随机值0(D)100(B)110(C(A)).设有结构体数组及指针的定义如下,其下列引用非法的是(D20structstudent
intnum;{
floatscore;
3,75}},*p=stu;
A)(p++)->num;B)(p+1)->score;C)(*p).num
D)p=&stu.score
二、程序填空题
1.函数DecTo2816(intd,intr)的功能是将十进制整数d转换为r进制数的形式,实现方法是辗转除取余,将每次取得的余数转换为字符存入字符数组trans[]后反向输出。
voidDecTo2816(intd,intr)
{intres,i=0;chartrans[33]={'\0'};
while(d)
{res=d%r;//取余数
if(res<=9)trans[i++]=‘0'+res【1】;//余数<=9,如何存入字符?
else‘0'+res_x0010_【2】;//若r=16,10~15的余数如何转换?
d=d/r;
}
反向输出;//【3】while(i>=0)putchar(trans[i--])
中的字符trans[]}
归并到LB=(2,6,8,9,11,15,20).本程序功能是将两个递增整数表LA=(3,5,8,11)和2。
整数表均采用单向链表存储。
新的整数表LC=(2,3,5,6,8,8,9,11,11,15,20)#include
的定义//链表结点类型intNodetypedefstructelem
数据域,存储整数//{intv;
指针域structelem*next;//
}intNode;
intNode*CreateList(intNode*Head,intn)个整数的链表:
创建能存储n//函数为辅助指针intNode*pnew,*pend;inti;//pnew用于创建新结点,pend{
for(i=1;i<=n;i++)
pnew=newintNode;{
cin>>pnew->v;
;【4】if(Head==NULL)Head==pnew若当前头指针为空,//
应赋什么值新结点接入当前尾部结点之后elsepend->next=pnew;//更新,当前尾结点指针域赋空pend=pnew;pend->next=NULL;//pend}
返回链表头指针return(Head);//
}
LC
到、LB//以下MergeList()函数,归并LAintNode*MergeList(intNode*LA,intNode*LB,intNode*LC)
intNode*pa=LA,*pb=LB,*pnew,*pend;{
pb不为空时)//当pa与【5】while(pa&&pb
{pnew=(intNode*)malloc(sizeof(intNode));//为LC创建新结点
if(pa->v<=pb->v)//若结点pa的v值小于或等于pb结点的v值
{pnew->v=pa->v;值vpa结点的的新结点的//LCv赋值为pa=pa->next;//当前结点处理完毕,pa指针下移
}
else
{pnew->v=pb->v【6】;pb=pb->next
【7】;}
if(LC==NULL)LC=pnew;//当前LC链表还为空
elsepend->next=pnew;
pend=pnew;
pend->next=NULL;
}
while(pa!
=NULL)//如果LA比LB长,将剩余部分接入LC
{pnew=newintNode;
pnew->v=pa->v;pa=pa->next;
pend->next=pnew;pend=pnew;pend->next=NULL;
}
while(pb!
=NULL)//如果LB比LA长,将剩余部分接入LC
{pnew=newintNode;
Pnew->v=pb->v【8】;pb=pb->next【9】;
pend->next=pnew;pend=pnew;pend->next=NULL;
}
ReturnLC【10】;//此函数应返回什么值
}
voidmain(void)
{//以LA=(3,5,8,11)和LB=(2,6,8,9,11,15,20)为实例数据
intNode*LA=NULL,*LB=NULL,*LC=NULL;
LA=CreateList(la4)【11】;//创建链表LA
LB=CreateList(LB7)【12】;//创建链表LB
LC=MergeL
ist(LA,LB,LC);//归并LA和LB到LC
}
3.以下函数功能是使用对分法在递增排序的整型数组a[]中查找指定元素SearchNum,算法思想是:
取数组的中点下标c,若a[c]==SearchNum则找到,若SearchNum>a[c],则查找范围缩小为右半,否则缩小为左半,依此循环直到查找范围不能再缩小为止。
voidBisectSearch(inta[],intn)//n为数组长度,即元素个数
{ints=0,e=n-1,c;/为中点c和e分别为查找范围的起点和终点下标,/sintflag=0,SearchNum;//flag作为是否找到的标志,SearchNum待查找
cin>>SearchNum;
if(a[0]==SearchNum)//判断数组首元素
{cout<a[0]=<if(a[n-1]==SearchNum)//判断数组尾元素
{cout<a[<while(el=(s+1)【13】)//e==s+1时,查找范围不能再缩小
{c=(s+e)/2;//取数组的中点下标
if(a[c]==SearchNum){flag=1【14】;break
}
;】15【.
elseif(a[c]elsee=c【17】;//更新s还是e
}
if(flag==1)cout<a[<elsecout<<}
4.下列函数LocateSubString(char*s,char*t)的功能是在字符串s中定位字符串t并返回首次出现的位置(又称模式匹配,s称目标串,t称模式串)。
char*LocateSubString(char*s,char*t)
{ints_len=strlen(s),t_len=strlen(t);//求串s和t的长度
char*ps=s,*pt=t,*pa;为辅助指针的首字符,pas和t//ps和pt分别指向intflag=0;//标志变量,找到t为1,否则为0
while(ps<=s+s【18】)//ps指针最多只能移动到什么地方?
{pa=ps;pt=t;//为本轮匹配运算做准备工作
while(*pt!
='\0')//pt指针往下移动直到串尾
{if(*pa==*pt)//如果对应字符相等,如何处理?
{flag=1;pa++【19】;pt++【20】;}
else//对应字符不相等,也就是不匹配
{flag=0;break;}//不匹配,提前结束内层循环
}//while内层循环
if(flag==1)break;t说明找到了子串//上面的内层循环结束,flag=1elseps++;//本轮结束后,没找到子串t,ps下移一个字符
}//while外层循环
if(flag==1)returnps;//当前ps即子串t首次出现的位置
elsereturn\//返回空串
}
三、编制程序题
1.编写一个函数sort(inta[],intn),实现任意长度一维整型数组的元素排序,在main()中完成一维数组的定义和初始化,调用sort()函数后输出排序的结果。
2.编程实现:
求11~9999之间的m,使满足m、m2、m3均为回文数。
例如121、1221、43634等即为回文数。
要求将求得的m存储到一个动态数组之中并输出。
四、参考例程
1.简单的学生成绩管理演示程序
文件包含及命名空间的使用语句,此处省略//
//结点类型定义
typedefstructstudent
{intID;
charname[16];
floatscore;
structstudent*next;
}StuNode;
//存储文件的函数
voidSaveFile(StuNode*Head)
{intk=0;
if(Head==NULL)
{
潣瑵?
链表为空,无法存储文件!
<system(pause);
return;
}
fstreamoutfile;
outfile.open(..\\Stu.dat,ios:
:
out);
StuNode*pt=Head;
while(pt)
{k++;
outfile.write((char*)pt,sizeof(StuNode));
pt=pt->next;
}
outfile.close();
潣瑵?
创建结点数=<}
//读取文件的函数
StuNode*ReadFile()
{intk=0;
StuNode*Head=NULL,*pnew=NULL,*paid=NULL;
ifstreaminfile;
infile.open(..\\Stu.dat,ios:
:
in);
if(infile.fail())
{潣瑵?
文件不存在,打开失败!
<system(pause);
returnHead;
}
while(!
infile.eof())
{pnew=newStuNode;
pnew->next=NULL;
infile.read((char*)pnew,sizeof(StuNode));
if(infile.tellg()<0)
{deletepnew;
break;
}
k++;
if(Head==NULL)
{Head=pnew;
paid=pnew;
paid->next=NULL;
}
else
{paid->next=pnew;
paid=pnew;
paid->next=NULL;
}
}//while,读文件结束
infile.close();
潣瑵?
读取结点数=<returnHead;
}
//创建学生信息链表的函数
StuNode*CreateList(StuNode*Head)
{
StuNode*pnew,*paid,*ps,*pe;
潣瑵?
开始创建学生链表,输入学号为0或负则停止:
<for(;;)
{pnew=newStuNode;
pnew->next=NULL;
潣瑵?
学号:
;
cin>>pnew->ID;
if(pnew->ID<=0)
{deletepnew;
break;
}
潣瑵?
姓名:
;
fflush(stdin);
cin.getline(pnew->name,15);
潣瑵?
成绩:
;
cin>>pnew->score;
if(Head==NULL)
{Head=pnew;
pnew->next=NULL;
paid=pnew;
}
else
{if(pnew->ID<=Head->ID)
{pnew->next=Head;
Head=pnew;
}
elseif(pnew->ID>=paid->ID)
{paid->next=pnew;
pnew->next=NULL;
paid=pnew;
}
else
{ps=Head;
pe=ps->next;
while(pnew->ID>=pe->ID)
{ps=ps->next;
pe=pe->next;
}
ps->next=pnew;
pnew->next=pe;
}
}
}
returnHead;
}
//输出链表的函数voidPrintList(StuNode*Head)(省略)
//主函数
voidmain()
StuNode*Head=NULL;
{
Head=CreateList(Head);
SaveFile(Head);
Head=ReadFile();
PrintList(Head);
system(pause);
}
一、选择题参考答案
1~5:
BCDDC
6~10:
AABBC
AABAD
11~15:
:
BDADC16~20二、程序填空题参考答案
【1】'0'+res【2】'A'+res_x0010_
【4】Head==pnew3【】putchar(trans[i--])
【6】pnew->v=pb->v】【5pa&&pb
【】pb=pb->next8】pnew->v=pb->v7【【9【】pb=pb->next10】returnLC
【12】LB=CreateList(LB,7)【11】CreateList(LA,4)
flag=1e!
=(s+1)】14】【13【s=c
【】break15】【16【17】e=c
【18】s+s_len-t_len
pt++】20【pa++】19【.