这样p指针就可以指向各个不同的结构数组了。
3.结构体的操作,一般操作我就不一一介绍了,在前八个经典算法中都有。
最难的链表操作放最后讲。
【思想推广】
结构体其实没什么难的,但和别的联系起来就难了,在做结构体的题目时尽量写画张图,理清顺序再做。
11.文件使用
【思想汇总】
文件使用很简单,在每次上机考试中都会出现,但操作都一样,无非是打开、使用、关闭。
这里就把这三种介绍一下就好了。
【算法语句】
1.文件的打开
FILE*fp;首先要定义一个文件指针。
if((fp=fopen(“d:
\\myf2.out”,”w”))==NULL)
{printf(“Thefilecannotopen!
”);exit(0);}先判断,再输入,这句话必写!
!
!
2.文件使用
一般文件使用仅限于文件输出,输出格式如下
fprintf(fp,”max=%d\n”,max);和printf()类似
3文件关闭
fclose(fp);即可
【思想推广】
没啥可推广的。
。
。
12.函数
【思想汇总】
函数是组成一个完整程序的基础,它变化多端,我也不好一一介绍,就说几点较难的东西,大家都知道函数中定义的变量都是auto型,也就是说出函数后定义的空间就自动释放了。
作为函数只能返回一个变量,要想让其“返回”多个值就需要使用到指针。
我是这样理解函数的,所谓函数就是你给其值,进行一系列规定运算,再给你一个答案。
和数学中映射的概念相似。
这里我就介绍一下指针与函数的关系。
【算法语句】
1.指向函数的指针(函数指针)
main()
{intmax(),(*p)();
inta,b,c;
p=max;/*先定义一个指针指向某个函数*/
scanf(“%d,%d”,&a,&b);
c=(*p)(a,b);/*在使用函数指针是无需再写函名*/
printf(“a=%d,b=%d,max=%d”,a,b,c);}
max(intx,inty)
{intz
if(x>y)z=x;
elsez=y;
return(z);}
2.返回指针的函数(指针函数)
一个函数的返回值为某种数据类型的地址值,即指针类型数据,称该函数为指针型函数。
定义指针型函数的格式:
类型说明符*函数名(参数表);
例:
int*a(x,y);
main()
{staticfloatscore[][4]={…………};
float*search();/*search()返回指向实型数据的指针*/
float*p;inti,m;/*p为指向实型数据的指针*/
scanf(“%d”,&m);
printf(“ThescoresofNo.%dare:
\n”,m);
p=search(score,m);/*score为行指针*/
for(i=0;i<4;i++)printf(“%5.2f\t”,*(p+i));
}
float*search(float(*pointer)[4],intn)
{float*pt;
pt=*(pointer+n);
return(pt);}
3.递归函数
调用一个函数的过程中又出现直接或间接地调用该函数本身叫递归。
书上的图要牢记,要画图解决!
!
【思想推广】
函数是最基础的东西,如果一个程序过于复杂,不如将其分解为一个个简单的函数,再通过嵌套将其串起来。
13.链表
【思想汇总】
链表是C语言中集大成者,不仅涉及到数组,字符串,还有指针,结构公用体,可谓是C语言的究极产物(仅限我们现在所学),掌握链表其实并没有想象中的难,再说上机也不靠,做链表题要像做递归一样图解。
下面我写一个比较常见的链表算法供大家参照。
【算法语句】
#include
#include
#defineN8
structslist
{
doubles;
structslist*next;
};
typedefstructslistSTREC/*这里是为structslist取个别名STREC*/
doublefun(STREC*h)
{
doublemax=h->s;
while(h!
=NULL)
{
if(maxs;/*结构指针指向第一个结构每一个元素,取出最大
h=h->next;值后,进入下一个结构体*/
}
returnmax;
}
STREC*creat(double*s)
{
STREC*h,*p,*q;
inti=0;
h=p=(STREC*)malloc(sizeof(STREC));/*开辟一个动态的结构指针*/
p->s=0;
while(i{
q=(STREC*)malloc(sizeof(STREC));/*产生8个节点的链表,各分数存入
p->s=s[i];i++;p->next=q;p=q;链表中*/
}
p->next=NULL:
returnh;/*返回首节点*/
}
outlist(STREC*h)
{
STREC*p;
p=h;
printf(“head”);
do
{
printf(“->%2.0f”.p->s);/*输出各分数*/
p=p->next;
}
while(p->next!
=NULL);
printf(“\n\n”);
}
voidmain()
{
doubles[N]={85,76,56,79,32,78,99,86},max;
STREC*h;
h=creat(s);
outlist(h);
max=fun(h);
printf(“max=%6.1f\n”,max);
}
【思想推广】在做链表题时要分清出哪个是首节点,哪个是尾节点,哪个是是新节点。
在生成链表是要返回首节点,在输出链表是要那首节点做实参。
在我写的上机程序中也有类似的,可自行参照。