问答题
已知head指向一个带头结点的单向链表,链表中每个结点包含数据域(data)和指针域(next),数据域为整型。请分别编写函数,在链表中查找数据域值最大的结点:
问答题
由函数值返回找到的最大值。
【正确答案】为了对链表进行操作,必须先建立链表。
【答案解析】
问答题
由函数值返回最大值所在结点的地址值。
【正确答案】本题要求编写的两个函数都是找结点数据域的最大值,区别在于函数的返回值不同:一个是结点的数值,一个是结点的地址值。因此,两个函数的首部不同,例如:
int maxaval(struet node*head)/*返回结点的数值*/
struct node$maxadd(struet node*head)/*返回结点的地址值*/
函数的核心程序段如下:
p=head->next; /*p指向第1个结点*/
m=p->data; pmax=p; /*假设的最大值放入m,结点的地址放入pmax*/
for(p=p->next; p; p=p->next)/*依次访问链表的各个结点*/
if(m<p->data){m=p->data; pmax=p; }/*记下当前的最大值及最大值所在结点的地址值*/
对于第一个函数,需要返回的是m;而第二个函数,需要返回的是pmax。
【答案解析】
问答题
请调用fputs函数,把10个字符串输出到文件中;再从此文件中读入这10个字符串放在一个字符串数组中;最后把字符串数组中的字符串输出到终端屏幕,以检验所有操作是否正确。
【正确答案】以下程序段从终端输入一个字符串后,就立即把它输出到文件中,因为有N个字符串,因此需要放在循环中来完成:
for(i=1; i<=N; i++)
{printf("Enter a string:"); gets(s); fputs(s, fp); fputc('/n', fp); }
函数fputs(s, fp)把刚从终端读入的字符串s输出到fp所指的文件中。请注意函数fputs(s, fp)的输出特点:在输出时它将只输出字符串中的字符而不输出字符串的结束标志到文件中,因此在文件中,连续输出的字符串之间将头尾相接,在文件中存储了一个接一个的字符,分不清到底是哪个字符串,其结果就使得不再可能从其中读入各个字符串了。为了分清各个字符串,因此在每输出一个字符串时,就接着输出一个'/n'符,以区分各字符串,在此由fputc('/n', fp);来完成。
在关闭和重新打开文件后,用以下程序段从文件中输入字符串,并把刚读入的字符串输出到终端屏幕:
fgets(s, M-1, fp);
while(!feof(fp))
{c=s[strlen(s)-1];
if(c=='/n') s[strlen(s)-1]=0;
puts(s); fgets(s, M-1, fp);
}
fgets(s, M-1, tp)从fp所指文件中输入M-1个字符放入s的地址中。如果在未读满M-1个字符之前读到了一个换行符,则结束本次操作,系统在字符串最后自动加入'/0'。注意,如果未渎满M-1个字符,这时已把换行符读入,并作为字符串最后一个字符(在'/0'之前)。因此需要用'/0'来替换'/n',可用语句:s[strlen(s)-1]=0;来实现,然后用puts(s);进行输出。fgets(s, M-1, fp);作为循环体内最后的语句,当读到文件的结束标志时,函数feof(fp)的值为1,循环立即结束。
【答案解析】
问答题
从键盘输入10个浮点数,以二进制形式存入文件中。再从文件中读出数据显示在屏幕上。
【正确答案】若数据放在a数组中,以下程序段输出N个双精度数据到已打开的二进制文件中:
for(i=0; i<N; i++) fwrite(a+i, sizeof(double), 1, fp);
在把文件位置指针移到文件开头之后,可参考以上程序段从fp所指文件中逐个读入数据依次存放在a数组中,或用以下语句一次性输入N个sizeof(double)字节的数据,放入a所指地址开始的存储区中。
fread(a, sizeof(double), N, fp);
【答案解析】