搜档网
当前位置:搜档网 › 结构体变量

结构体变量

struct Student //STRUCT不能省略
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}; //注意最后有一个分号
系统为结构体分配的内存为各成员类型所占内存之和
struct Student的内存=4+20+1+4+4+30=63


结构体类型的一般形式

struct 结构体名(域表)(形如Student)
{
成员表列 //成员必须进行类型声明
};



成员可以属于另外一个结构体类型,例

struct Date
{
int month;
int day;
int year;
};
struct Student
{
int num;
char sex;
char addr[30];
int age;
struct Date birthday; //结构体类型也可以像普通结构类型一样使用
char name[20];
};


声明类型的同时定义变量

struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}student1,student2;

结构体变量的初始化
#include
int main()
{
struct Student
{
int num;
char name[20];
char sex;
char addr[30];
}a={10010,"lilin",'M',"123 Biejing Road"};
printf("No.:%d\nname:%s\nsex:%c\naddr:%s\n",a.num,https://www.sodocs.net/doc/ad19031125.html,,a.sex,a.addr);
return 0;
}

结构体变量中成员的值的引用

结构体变量.成员名

#include
int main()
{
struct Student
{
int num;
char name[20];
float score;
}student1,student2;
scanf("%d%s%f",&student1.num,https://www.sodocs.net/doc/ad19031125.html,,&student1.score); //数组本身就代表地址,所以输入时不用加地址符
scanf("%d%s%f",&student2.num,https://www.sodocs.net/doc/ad19031125.html,,&student2.score);
printf("the higher score is:\n");
if(student1.score>student2.score)
printf("%d %s %6.2f\n",student1.num,https://www.sodocs.net/doc/ad19031125.html,,student1.score);
else if(student1.scoreprintf("%d %s %6.2\nf",student2.num,https://www.sodocs.net/doc/ad19031125.html,,student2.score);
else
{
printf("%d %s %6.2f\n",student1.num,https://www.sodocs.net/doc/ad19031125.html,,student1.score);
printf("%d %s %6.2f\n",student2.num,https://www.sodocs.net/doc/ad19031125.html,,student2.score);
}
return 0;
}


使用结构体数组

1)定义结构体数组
投票程序
#include
#include
struct Person
{char name[20];
int count;
}leader[3]={"li",0,"zhang",0,"wang",0};
int main()
{int i,j;
char leader_name[20];
for(i=1;i<=10;i++)
{scanf("%s",leader_name);
for(j=0;j<3;j++)
if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;
}
printf("\nresult:\n");
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
return 0;
}

如何定义一个结构体数组
[1]struct 结构体名
{成员列表}数组名[数组长度];
[2]先声明一个结构体类型(如),然后再用此类型定义结构体数组:
结构体类型 数组名[数组长度];
like :struct Person leader[3];
struct 结构体名
{成员列表}数组名[数组长度]={初值表列};
like :struct Person leader[3]={"li",0,"zhang",0,"wang",0};

对学生成绩进行排序
#include
(#define N 5)
struct Student
{
int num;
char name[20];
float score;
};
int main()
{

struct Student stu[5]={{10101,"zhang",78},{10103,"wang",98},
{10106,"li",86},{10108,"ling",73},{10110,"sun",100}};
struct Student t;
(const int n=5)(N换成n)
int i,j,k;
printf("the order is:\n");
for(i=0;i{k=i;
for(j=i+1;jif(stu[j].score>stu[k].score)
k=j;
t=stu[k];stu[k]=stu[i];stu[i]=t;
}
for(i=0;iprintf("%6d %8s %6.2f\n",stu[i].num,stu[i].name,stu[i].score);
printf("\n");
return 0;
}


三种常见的排序方法

一、冒泡法(起泡法)
算法要求:用起泡法对10个整数按升序排序。
算法分析:如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次相邻元素的两两比较,在第j趟比较中要进行n-j次两两比较。比较的顺序从前往后,经过一趟比较后,将最值沉底(换到最后一个元素位置),最大值沉底为升序,最小值沉底为降序。
算法源代码:
# include
main()
{
int a[10],i,j,t;
printf("Please input 10 numbers: ");
/*输入源数据*/
for(i=0;i<10;i++)
scanf("%d",&a[i]);
/*排序*/
for(j=0;j<9;j++) /*外循环控制排序趟数,n个数排n-1趟*/
for(i=0;i<9-j;i++) /*内循环每趟比较的次数,第j趟比较n-j次*/
if(a[i]>a[i+1]) /*相邻元素比较,逆序则交换*/
{ t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
/*输出排序结果*/
printf("The sorted numbers: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
算法特点:相邻元素两两比较,每趟将最值沉底即可确定一个数在结果的位置,确定元素位置的顺序是从后往前,其余元素可能作相对位置的调整。可以进行升序或降序排序。
二、选择法
算法要求:用选择法对10个整数按降序排序。
算法分析:每趟选出一个最值和无序序列的第一个数交换,n个数共选n-1趟。第i趟假设i为最值下标,然后将最值和i+1至最后一个数比较,找出最值的下标,若最值下标不为初设值,则将最值元素和下标为i的元素交换。
算法源代码:
# include
main()
{
int a[10],i,j,k,t,n=10;
printf("Please input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i{
k=i; /*假设当前趟的第一个数为最值,记在k中 */
for(j=i+1;jif(a[k]k=j; /*则将其下标记在k中*/
if(k!=i) /*若k不为最初的i值,说明在其后找到比其更大的数*/
{ t=a[k]; a[k]=a[i]; a[i]=t; } /*则交换最值和当前序列的第一个数*/
}
printf("The sorted numbers: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
算法特点:每趟是选出一个最值

确定其在结果序列中的位置,确定元素的位置是从前往后,而每趟最多进行一次交换,其余元素的相对位置不变。可进行降序排序或升序排序。
三、插入法
算法要求:用插入排序法对10个整数进行降序排序。
算法分析:将序列分为有序序列和无序列,依次从无序序列中取出元素值插入到有序序列的合适位置。初始是有序序列中只有第一个数,其余n-1个数组成无序序列,则n个数需进n-1次插入。寻找在有序序列中插入位置可以从有序序列的最后一个数往前找,在未找到插入点之前可以同时向后移动元素,为插入元素准备空间。
算法源代码:
# include
main()
{
int a[10],i,j,t;
printf("Please input 10 numbers: ");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=1;i<10;i++) /*外循环控制趟数,n个数从第2个数开始到最后共进行n-1次插入*/
{
t=a[i]; /*将待插入数暂存于变量t中*/
for( j=i-1 ; j>=0 && t>a[j] ; j-- ) /*在有序序列(下标0 ~ i-1)中寻找插入位置*/
a[j+1]=a[j]; /*若未找到插入位置,则当前元素后移一个位置*/
a[j+1]=t; /*找到插入位置,完成插入*/
}
printf("The sorted numbers: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
算法特点:每趟从无序序列中取出第一个数插入到有序序列的合适位置,元素的最终位置在最后一趟插入后才能确定位置。也可是先用循环查找插入位置(可从前往后或从后往前),再将插入位置之后的元素(有序列中)逐个后移一个位置,最后完成插入。该算法的特点是在寻找插入位置的同时完成元素的移动。因为元素的移动必须从后往前,则可将两个操作结合在一起完成,提高算法效率。仍可进行升序或降序排序。

结构体指针
定义:指向结构体变量的指针。
指针变量的基类型必须与结构体变量的类型相同。例如
struct Student *pt //pt可以指向struct Student类型的变量或数组元素。

例:通过指向结构体变量的指针变量访问结构体变量中的成员
#include
#include
int main()
{struct Student
{long num;
char name[20];
char sex;
float score;
};
struct Student stu_1;
struct Student *p;
p=&stu_1;
stu_1.num=10101;
strcpy(stu_https://www.sodocs.net/doc/ad19031125.html,,"Li Lin");
stu_1.sex='M';
stu_1.score=89;
printf("No:.%ld\nname:%s\nsex:%s\nscore:%5.1f\n",
stu_1.num,stu_https://www.sodocs.net/doc/ad19031125.html,,stu_1.sex,stu_1.score);
printf("No:.%ld\nname:%s\nsex:%s\nscore:%5.1f\n",
(*p).num,(*p).name,(*p).sex,(*p).score);
return 0;
}
(运行结果相同)
C语言中允许把(*p).num用p->num代替。"->"代表一个箭头,
p->num表示p所指向结构体变量中的num成员

#include
struct Student
{long num;
char name[20];
char sex;
int age;
};
struct Student stu[

3]={{10101,"li lin",'M',18},{10102,"zhang fang",'F',19}
,{10103,"wang min",'M',20}};
int main()
{
struct Student *p;
printf("No. Name sex age \n");
for(p=stu;pprintf("%5d %-20s%2c %4d\n",p->num,p->name,p->sex,p->age);
return 0;
}

结构体指针变量只能指向结构体变量的首地址,而不能指向某一成员的首地址。
p=stu right p=stu[1].name wrong
但如果要指向某一成员的地址,可用强制类型转换
p=(struct Student *)stu[0].name


#include
#define N 3
struct Student
{int num;
char name[20];
float score;
float aver;
};

int main()
{void input(struct Student stu[]);
struct Student max(struct Student stu[]);
void print(struct Student stu[]);
struct Student stu[N],*p=stu;
input(p);
print(max(p));
return 0;
}

void input(struct Student stu[])
{int i;
for(i=0;i{scanf("%d %s %f %f %f",&stu[i].num,stu[i].name,
&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
stu[i].aver=(float(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0);
}
}

struct Student max(struct Student stu[])
{int i,m=0;
for(i=0;iif(stu[i].aver>stu[m].aver)
m=i;
return stu[m];
}

void print(struct Student stud)
{
printf("\n成绩最高的学生是:\n");
printf("学号:%d\n姓名:%s\n三门课成绩:%5.1f,%5.1f,%5.1f\n平均成绩:%6.2f\n",
stud.num,https://www.sodocs.net/doc/ad19031125.html,,stud.score[0],stud.score[1],
stud.score[2],stud.aver);
}

调用input函数时,实参是指针变量p,形参是结构体数组,传递的是结构体元素的地址,函数无返回值。
调用max函数时,实参是指针变量p,形参是结构体数组,传递的是结构体元素的地址,函数的返回值是结构体类型数据。
调用print函数时,实参是结构体变量(结构体数组元素),形参是结构体变量,传递的是结构体变量中成员的值,函数无返回值。

相关主题