第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 ;
}