第93套:
给定程序中已建立一个带有头结点的单向链表,在main函数中将多次调用fun 函数,每调用一次fun函数,输出链表尾部结点中的数据,并释放该结点,使链表 缩短。
 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
 注意:源程序存放在考生文件夹下的BLANK1.C中。
 不得增行或删行,也不得更改程序的结构!
 给定源程序:
#include <stdio.h> 
#include <stdlib.h> 
#define N 8 
typedef struct list 
{ int data; 
struct list *next; 
} SLIST; 
void fun( SLIST *p) 
{ SLIST *t, *s; 
t=p->next; s=p; 
while(t->next != NULL) 
{ s=t; 
t=t->___1___; 
} 
printf(" %d ",___2___); 
s->next=NULL; 
free(___3___); 
} 
SLIST *creatlist(int *a) 
{ SLIST *h,*p,*q; int i; 
h=p=(SLIST *)malloc(sizeof(SLIST)); 
for(i=0; i<N; i++) 
{ q=(SLIST *)malloc(sizeof(SLIST)); 
q->data=a[i]; p->next=q; p=q; 
} 
p->next=0; 
return h; 
} 
void outlist(SLIST *h) 
{ SLIST *p; 
p=h->next; 
if (p==NULL) printf("\nThe list is NULL!\n"); 
else 
{ printf("\nHead"); 
do { printf("->%d",p->data); p=p->next; } while(p!=NULL); 
printf("->End\n"); 
} 
} 
main() 
{ SLIST *head; 
int a[N]={11,12,15,18,19,22,25,29}; 
head=creatlist(a); 
printf("\nOutput from head:\n"); outlist(head); 
printf("\nOutput from tail: \n"); 
while (head->next != NULL){ 
fun(head); 
printf("\n\n"); 
printf("\nOutput from head again :\n"); outlist(head); 
} 
} 
解题思路:
 本题是对已经建立的链表,通过调用一次函数就输出链表尾部的数据。程序中共有三处要填上适当的内容,使程序能运行出正确的结果。
 第一处:由于本题要求输出链表尾部的数据,函数是利用while循环语句找出链表尾部的指针并存入临时变量s中,那么每循环一次就要判断链表是否已结束位置,如果是,则退出循环,进行输出,由于是通过t指针变量进行操作的,因此,都要取t的next指针重新赋给t来实现,所以本处应填next。
 第二处:输出最后一个结点的数据,所以应填t->data或(*t).data。
 第三处:输出出最后一个结点数据后,并把此结点删除了,程序要求释放内存,所以应填t。
给定程序MODI1.C中函数fun的功能是:将字符串中的字符按逆序输出,但不改变字符串中的内容。
 例如,若字符串为abcd,则应输出:dcba。
 请改正程序中的错误,使它能计算出正确的结果。
 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
 给定源程序:
#include <stdio.h> 
fun (char a) 
{ if ( *a ) 
{ fun(a+1) ; 
printf("%c" *a) ; 
} 
} 
main( ) 
{ char s[10]="abcd"; 
printf("处理前字符串=%s\n处理后字符串=", s); 
fun(s); printf("\n") ; 
} 
解题思路:
 第一处:形参a应定义为字符串指针。
 第二处:语句中缺少逗号。
请编写一个函数fun,它的功能是:比较两个字符串的长度,(不得调用C语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,则返回第一个字符串。
 例如,输入beijing shanghai (为回车键), 函数将返回shanghai。
 注意: 部分源程序存在文件PROG1.C中。
 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
 你编写的若干语句。
 给定源程序:
#include <stdio.h> 
char *fun ( char *s, char *t) 
{ 
} 
main( ) 
{ char a[20],b[20]; 
printf("Input 1th string:") ; 
gets( a); 
printf("Input 2th string:") ; 
gets( b); 
printf("%s\n",fun (a, b )); 
NONO (); 
} 
解题思路:
 本题是比较两个字符串的长度并按要求返回字符串。
 我们给出的程序是使用for循环来判断两个字符串中哪一个比较长或相等,循环的终止值为两个字符串中是否字符串结束符,如果有,则退出循环体。接下来再判断两个字符串是否同时出现结束符,则返回第一个字符串s,如果不没有同时出现,则判断哪一个字符串先有结束符,则按要求返回指定的字符串。
 参考答案:
char *fun ( char *s, char *t) 
{ 
int i; 
char *p=s, *q=t; 
for(i=0;*p && *q; i++) { 
p++; q++; 
} 
if(*p == 0 && *q == 0) return s ; 
if(*p) return s ; 
else return t ; 
}