结构体指针数组函数综合应用改写选票系统之再改写

之前写的感觉,在初始化选民信息中使用指针函数比较复杂,特别是 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;  
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很高兴能够回答你的问题。给结构体指针数组赋初值的话,可以定义一个指针变量指向结构体,然后用循环给数组中的每一个元素赋值。例如,定义一个指针变量struct_ptr指向结构体,结构体定义如下:struct Stu{int a;int b;};,然后用循环给数组赋值:for(int i=0; i<len; i++){struct_ptr[i] = (struct Stu*)malloc(sizeof(struct Stu));struct_ptr[i]->a = i;struct_ptr[i]->b = i*i;} ### 回答2: 要给结构体指针数组赋初值,可以按照以下步骤进行: 1. 首先,定义一个结构体类型`struct MyStruct`,包含所需的字段。例如,我们假设该结构体有两个字段,分别是`int`类型的`num`和`char`类型的`name`。 2. 接下来,声明该结构体指针数组。例如,我们声明一个长度为3的结构体指针数组`struct MyStruct *ptrArray[3]`。 3. 为每个结构体指针分配内存空间,使用`malloc`函数。例如,可以使用`ptrArray[0] = (struct MyStruct*)malloc(sizeof(struct MyStruct))`语句为第一个结构体指针分配内存。 4. 给每个结构体指针的字段赋值。例如,可以使用`ptrArray[0]->num = 1`和`strcpy(ptrArray[0]->name, "John")`语句为第一个结构体指针的字段赋值。 5. 重复上述步骤3和步骤4,为其他结构体指针分配内存并赋值。例如,可以使用`ptrArray[1] = (struct MyStruct*)malloc(sizeof(struct MyStruct))`为第二个结构体指针分配内存,并使用相应的赋值语句给字段赋值。 6. 最后,记得在使用完结构体指针数组后,释放每个结构体指针所占的内存空间。可以使用`free`函数释放内存,例如`free(ptrArray[0])`。 通过以上步骤,我们可以成功给结构体指针数组赋上初值。记得在编写代码时,注意检查内存分配是否成功以及是否正确释放内存,以避免内存泄漏或其他问题的发生。 ### 回答3: 给结构体指针数组赋初值的方法有几种。下面我将一一进行介绍。 方法一:逐个为结构体指针数组元素赋值。 这种方法比较繁琐,需要逐个为结构体指针数组的元素赋值。 例如,定义一个结构体类型为Student,包含姓名和年龄两个成员变量。 ``` typedef struct { char name[20]; int age; } Student; ``` 然后定义一个结构体指针数组,并逐个为其中的元素赋值。 ``` Student* students[3]; Student s1 = {"张三", 20}; Student s2 = {"李四", 22}; Student s3 = {"王五", 21}; students[0] = &s1; students[1] = &s2; students[2] = &s3; ``` 方法二:使用静态初始化语法。 这种方法可以在定义结构体指针数组的同时为其赋初值。 ``` Student* students[3] = { &(Student){"张三", 20}, &(Student){"李四", 22}, &(Student){"王五", 21} }; ``` 通过静态初始化语法,可以直接在大括号内赋初值给结构体指针数组的元素。 以上就是给结构体指针数组赋初值的两种常用方法。根据实际情况,可以选择合适的方法来赋初值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值