结构体数组
定义一个结构体数组和定义一个普通的数组差不多,表示有括号里面这么多个相同的结构体,只不过里面的成员各不相同。遍历结构体数组的方式也是使用变量i和for循环来遍历:下面是表达方法和遍历的方法:
#include<stdio.h>
struct Test
{
int data;
char cdata;
};
int main()
{
struct Test array[2] = {
{10,'A'}, //这是第一个元素的成员
{20,'B'}}; //第二个
int i,len;
len = sizeof(array)/sizeof(array[0]);
for(i=0;i<len;i++){
printf("%d,%c",array[i].data,array[i].cdata); //用下标来遍历
}
return 0;
}
结构体指针
指针就是地址,指针变量就是存放地址的变量,结构体也是变量,也能定义一个结构体类型的指针来保存结构体的首地址。当然访问变量也有两种方法:1.变量名;2.地址。
#include <stdio.h>
struct Test
{
int data;
char cdata;
};
int main()
{
struct Test t = {10,'A'};
struct Test *p = &t;
printf("%d,%c\n",t.data,t.cdata); //通过变量名来访问里面的数据
printf("%d,%c\n",p->data,p->cdata); //通过地址来访问里面的数据
return 0;
}
用结构体指针保存结构体数组
定义一个结构体指针来保存一个结构体数组的首地址,并通过for循环和i变量和指针偏移来遍历结构体数组:
#include <stdio.h>
struct Test
{
int data;
char cdata;
};
int main()
{
struct Test array[3] = {{10,'A'},{20,'B'},{30,'C'}}; //定义三个结构体的成员
struct Test *p = array;
int i;
int len;
len = sizeof(t)/sizeof(t[0]); //计算数组长度
for(i=0;i<len;i++){
printf("%d,%c\n",p->data,p->cdata);
p++; //指针的便偏移
}
return 0;
}
例子:用结构体指针写一个选票系统
前提:有3个人候选,分别写入3个候选人的名字,有5个人投票,输入候选人的名字就可以为其投一票,最后输出每个人有多少票,有多少人弃投。
#include<stdio.h>
#include<string.h>
struct XuanMin
{
char name[32];
int ticket;
};
int main()
{
struct XuanMin xm[3]; //定义一个结构体数组,三位候选人
struct XuanMin *p = xm; //定义一个指针指向结构体数组首地址
struct XuanMin max; //定义一个最多票数的结构体变量
int i,j;
int len=sizeof(xm)/sizeof(xm[0]);
int total=5; //5个人投票
char tmpName[32];
int mark;
int f=0;
//输入候选人的名字
for(i=0;i<len;i++){
p->ticket=0;
printf("请输入候选人的名字。\n");
scanf("%s",p->name);
p++;
}
p = xm; //把全部人名输入到各自的结构体中之后,把指针指回结构体数组的开头
//唱票环节
for(i=0;i<5;i++){ //5个人投票,一共有5票
mark=0; //每一次进行判断mark有没有为0,在这里输入很关键
printf("你要投的名字。\n");
memset(tmpName,'\0',sizeof(tmpName)); //每次要初始化为\0,才能清空上一个人的名字,输入下一个人的名字,避免潜在的逻辑错误
scanf("%s",tmpName);
p = xm; //回到数组头
for(j=0;j<len;j++){ //输入要投的候选人之后,开始在三位候选人里面招名字
if(strcmp(tmpName,p->name) == 0){
p->ticket++;
mark = 1;
}
p++;
}
if(mark == 0){
printf("没有该候选人,当作弃票。\n");
f++; //弃票加1
}
}
max = xm[0];
p = xm; //5人投完票得到每一位候选人的票数之后,回到数组头
for(i=0;i<len;i++){
if(max.ticket < p->ticket){
max = xm[i];
}
p++;
}
p = xm; //回到数组头,重头遍历
for(i=0;i<len;i++){
printf("%s有%d票\n",p->name,p->ticket);
p++;
}
printf("恭喜%s以%d票当选!!!\n",max.name,max.ticket);
printf("有%d人弃票\n",f);
return 0;
}
845

被折叠的 条评论
为什么被折叠?



