结构指针
为了方便描述结构体的成员变量,以及更加方便的应用结构体,引入结构指针,定义
struct point *pp;
pp为结构指针,*pp为该结构体,(*pp).x为结构成员,
为了方便引用结构成员,使用如下书写形式
p->x.
下面给出单词统计程序,算法为;
while还有未处理的单词。
用binsearch查找,并统计
先结构数组。
struct key
{
char *word;
int count;
}keytab[]={
“auto”,0,
“break”,0,
“case”,0,
“char”,0,
“default”,0
}
所以首先写单词获取程序。
#include <stdio.h>
int getword(char *s,int maxsize)
{
int i,c;
i=0;
while(isspace(c=getchar()))
;
if(c!=EOF)
{
s[i++]=c
}
if(!isalpha(c))
{
s[i]='\0';
return c;
}
while(i<lim-1&&isalnum((c=getchar())))
{
s[i++]=c;
}
s[i]='\0';
if(c!=EOF)
{
ungetc(c);
}
return s[0];
}
二分查找
int binsearch(struct key keytab[],char *s,int n,int (*comp)(void *,void *))
{
int left,right,mid;
left=0;
right=n-1;
while(left<=right)
{
mid=(left+right)/2;
if((*comp)(keytab[mid].word,s)<0)
{
left=mid+1;
}
else if((*comp)(keytab[mid].word,s)>0)
{
right=mid-1;
}
else
{
return mid;
}
}
return -1;
}
int strcmp(char *s,char *t)
{
char *sp,*tp;
sp=s;
tp=t;
while(*sp!=*tp)
{
if(*sp=='\0')
{
return 0;
}
sp++;
tp++;
}
return *sp-*tp;
}
#include <stdlib.h>
int numcmp(char *s1,char *s2)
{
double v1,v2;
v1=atof(s1);
v2=atof(s2);
if(v1<v2)
{
return -1;
}
else if
{
return 1;
}
else
{
return 0;
}
}
主程序
#include <stdio.h>
int main(void)
{
char word[MAXSIZE];
int i;
while(getword(word,MAXSIZE))
{
if(isalpha(word[0]))
{
if((i=binsearch(keytab,word,NKEYS,int strcmp(void *,void *)))>0);
{
keytab[i].count++;
}
}
}
for(i=0;i<NKEYS;i++)
{
if(keytab[i].count>0)
{
printf("%4d %s\n",keytab[i].count,keytab[n].word);
}
}
return 0;
}