之前写的感觉,在初始化选民信息中使用指针函数比较复杂,特别是 return p - *pn
是因为 p++ 之后,p的地址改变,需要返回初始地址
那么我就使用p[ i ]来代替,就不需要放返回值了
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
// 定义结构体
struct XuanMin {
char name[32];
int tickets;
};
// void 函数,初始化选民信息
void initXms(struct XuanMin *p, int *pn) {
int i;
printf("请输入有几个人参选:");
scanf("%d", pn); // 获取选民总数
p = (struct XuanMin *)malloc(*pn * sizeof(struct XuanMin)); //分配内存
for (i = 0; i < *pn; i++) {
p[i].tickets = 0; // 初始化票数为0
printf("请输入第%d个选民的名字:\n", i + 1);
scanf("%s", p[i].name); // 读取选民名字
}
}
// 输出选票人初始数据
void printfXms(struct XuanMin *p, int len) {
for (int i = 0; i < len; i++) {
printf("名字:%s,票数:%d\n", p[i].name, p[i].tickets);
}
}
// 唱票环节
int doVot(struct XuanMin *p, int len) {
int feipiao = 0;
char tmpname[32];
for (int i = 0; i < 5; i++) { // 允许投5票
printf("本次你要投给谁:\n");
memset(tmpname, '\0', sizeof(tmpname)); // 每次清空一下
scanf("%s", tmpname); // 输入你选择的选民名字
int mark = 0;
for (int j = 0; j < len; j++) {
if (strcmp(tmpname, p[j].name) == 0) {
p[j].tickets++; // 增加票数
mark = 1;
}
}
if (mark == 0) {
printf("抱歉,没有此人,弃票\n");
feipiao++;
}
}
return feipiao;
}
// 输出选票人结果
void printfXmsf(struct XuanMin *p, int len, int feipiao) {
for (int i = 0; i < len; i++) {
printf("名字:%s,票数:%d\n", p[i].name, p[i].tickets);
}
printf("废票有%d\n", feipiao);
}
int main() {
int total;
struct XuanMin *xm = NULL;
initXms(xm, &total); // 初始化选民信息
printfXms(xm, total); // 输出选票人初始数据
int sum = doVot(xm, total); // 唱票环节
printfXmsf(xm, total, sum); // 输出选票人结果
free(xm); // 释放分配的内存
return 0;
}