初始化选民系统运用结构体指针函数返回指针
提示有多少人参选,并输入各自的名字,有5次投票机会,输出每一位的票数和当选人一多少票当选,多少人弃票。
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
struct XuanMin
{
char name[32]; //1个字节,一共32字节
int ticket;
};
struct XuanMin *initXuanMin(struct XuanMin *pxm,int *pn)
{
int i,j;
if(pxm == NULL){
printf("请输入有多少人参选\n");
scanf("%d",pn);
pxm = (struct XuanMin *)malloc( *pn * sizeof(struct XuanMin)); //为pn个候选人申请存储名字的空间
}
for(i=0;i<*pn;i++){
pxm->ticket = 0;
printf("请输入第%d个人的名字\n",i+1);
scanf("%s",pxm->name);
pxm++; //偏移一个结构体大小
}
return pxm-*pn; //*pn的*是取值运算符,把指针pxm往后偏移*pn个结构体,回到pxm地址的开头
}
int dovot(struct XuanMin *p,int total)
{
char tmpName[32];
int i,j;
struct XuanMin *pbak=p; //保存结构体的地址的头
int mark;
int f=0;
for(i=0;i<5;i++){
mark = 0;
printf("你希望投票给:\n");
memset(tmpName,'\0',sizeof(tmpName));
scanf("%s",tmpName);
p = pbak; //指向结构体的地址的头,接着就可以使用它了
for(j=0;j<total;j++){
if(strcmp(tmpName,p->name) == 0){
p->ticket++;
mark = 1;
}
p++;
}
if(mark == 0){
printf("无此人,弃票\n");
f++;
}
}
return f;
}
struct XuanMin *getMax(struct XuanMin *p,int total)
{
struct XuanMin *max;
max = p;
for(int i=0;i<total;i++){
if(max->ticket < p->ticket){
max = p; //要更新候选人信息,不然会一直是第0个人的名字,因为第45行
}
p++;
}
return max;
}
void printXuanMin(struct XuanMin *x,int len)
{
int i,j;
for(i=0;i<len;i++){
printf("%s有%d票\n",x->name,x->ticket);
x++;
}
}
int main()
{
struct XuanMin *xm = NULL; //让定义的结构体指针赋值一个空值
struct XuanMin *max;
int total = 0;
int data2;
xm = initXuanMin(xm,&total);
data2 = dovot(xm,total);
max = getMax(xm,total);
printf("%s以%d票当选,有%d人弃票\n",max->name,max->ticket,data2);
printXuanMin(xm,total);
return 0;
}
初始化选民系统运用无返回类型函数
想要在上面初始化选民系统中,修改主函数的*xm
里面的值,就要把这个一级指针的地址给传上去,接着在初始化函数里使用二级指针来承接一级指针的地址。
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
struct XuanMin
{
char name[32]; //1个字节,一共32字节
int ticket;
};
void initXuanMin(struct XuanMin **pxm,int *pn)
{
int i,j;
if(*pxm == NULL){
printf("请输入有多少人参选\n");
scanf("%d",pn);
*pxm = (struct XuanMin *)malloc( *pn * sizeof(struct XuanMin)); //为pn个候选人申请存储名字的空间
}
for(i=0;i<*pn;i++){
(*pxm)->ticket = 0;
printf("请输入第%d个人的名字\n",i+1);
scanf("%s",(*pxm)->name);
(*pxm)++; //偏移一个结构体大小
}
*pxm = *pxm-*pn; //*pn的*是取值运算符,把指针pxm往后偏移*pn个结构体,回到pxm地址的开头
}
int dovot(struct XuanMin *p,int total)
{
char tmpName[32];
int i,j;
struct XuanMin *pbak=p; //保存结构体的地址的头
int mark;
int f=0;
for(i=0;i<5;i++){
mark = 0;
printf("你希望投票给:\n");
memset(tmpName,'\0',sizeof(tmpName));
scanf("%s",tmpName);
p = pbak; //指向结构体的地址的头,接着就可以使用它了
for(j=0;j<total;j++){
if(strcmp(tmpName,p->name) == 0){
p->ticket++;
mark = 1;
}
p++;
}
if(mark == 0){
printf("无此人,弃票\n");
f++;
}
}
return f;
}
struct XuanMin *getMax(struct XuanMin *p,int total)
{
struct XuanMin *max;
max = p;
for(int i=0;i<total;i++){
if(max->ticket < p->ticket){
max = p; //要更新候选人信息,不然会一直是第0个人的名字,因为第45行
}
p++;
}
return max;
}
void printXuanMin(struct XuanMin *x,int len)
{
int i,j;
for(i=0;i<len;i++){
printf("%s有%d票\n",x->name,x->ticket);
x++;
}
}
int main()
{
struct XuanMin *xm = NULL; //让定义的结构体指针赋值一个空值
struct XuanMin *max;
int total = 0;
int data2;
initXuanMin(&xm,&total);
data2 = dovot(xm,total);
max = getMax(xm,total);
printf("%s以%d票当选,有%d人弃票\n",max->name,max->ticket,data2);
printXuanMin(xm,total);
return 0;
}