首先对选民指针初始化,之后用malloc开辟n个空间。len在主函数里面没法用sizeof的方式来计算长度,这是因为当计算指针时固定为8个字节,在初始化后要将指针地址指向一开始的地方。关于getmax函数,首先先将max指针指向p,通过if函数来判断两个是否相等,由于p一直在偏移,所以当他们两个值有比较的时候交换地址。
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
struct XuanMin
{
char name[32];
int tickets;
};
struct XuanMin* initXms(struct XuanMin* p,int *pn) //返回选民的指针
{
int i;
if(p==NULL){
printf("请输入有几个人参选:\n");
scanf("%d",pn);
p=(struct XuanMin*)malloc(*pn*sizeof(struct XuanMin));
}
for(i=0;i<*pn;i++){
p->tickets=0;
printf("请输入第%d选民的名字:\n",i+1);
scanf("%s",p->name);
p++;
}
return p-*pn;
}
void printXms(struct XuanMin* p,int len)
{
int i;
for(i=0;i<len;i++){
printf("名字:%s,票数:%d\n",p->name,p->tickets);
p++;
}
}
int doVote(struct XuanMin* p,int len)
{
int i;
int j;
int mark;
char tmp_name[32];
int feipiao=0;
struct XuanMin *xm=p;
for(i=0;i<5;i++){
mark=0;
printf("请输入你要投的选民:\n");
memset(tmp_name,'\0',sizeof(tmp_name));
scanf("%s",tmp_name);
p=xm;
for(j=0;j<len;j++){
if(strcmp(tmp_name,p->name)==0){
p->tickets++;
mark=1;
}
p++;
}
if(mark==0){
printf("没有此人放弃\n");
feipiao++;
}
}
return feipiao;
}
void getMax(struct XuanMin* p,int len)
{
struct XuanMin* Max;
Max=p;
int i;
for(i=0;i<len;i++){
if(Max->tickets < p->tickets){
Max=p;
}
p++;
}
printf("票数最多的人:%s,票数为:%d\n",Max->name,Max->tickets);
}
int main()
{
struct XuanMin *xm=NULL;
int total=0;
int feipiao;
xm = initXms(xm,&total);
printf("sizeof xms = %d\n",total);
feipiao=doVote(xm,total);
printf("废票为:%d\n",feipiao);
printXms(xm,total);
getMax(xm,total);
return 0;
}