大家好,我是教授.F
目录
本文以创建图书目录为例子进行展开。
首先是结构体的声明:
struct book{
char title[maxtitle];
char author[maxautl];
float value;
};
该声明描述了一个float类型的变量和两个char类型(字符数组)的变量组成的结构。该声明并没有创建实际的数据对象,只是描述了对象由什么组成,我们通常把该声明叫为模板。
struct是一个关键字,book是一个标记。正有了这个标记,我们我们在写程序时就可以通过“book”来引用该结构。例如我们可以这样:struct book library;。这样会把library声明为一个使用book结构布局的结构变量。
花括号括起来的是结构体的成员。
对于结构体我们可以在后面添加一点细节:
struct book{
char title[maxtitle];
char author[maxautl];
float value;
};
struct book library;
结构体布局声明完成,我们可以再声明一个使用book布局的结构变量,如:struct book library;
这样一来,结构体声明在外部,所有的函数就可以调用他了。
与此相反的是:
struct book{
char title[maxtitle];
char author[maxautl];
float value;
struct book library;
};
这样就表示结构声明置于一个函数的内部,只限与该函数内部使用。(形成一种递归)
从您提供的两段代码来看,第一段代码在定义结构体内部包含了一个名为"library"的结构体成员,而第二段代码则在结构体定义外部独立地定义了"library"结构体变量。下面是对这两段代码的结合使用的示例,以及相应的C语言书写:
#include <stdio.h>
#include <string.h>
#define maxtitle 100
#define maxautl 50
// 使用第一段代码定义的结构体
struct book1{
char title[maxtitle];
char author[maxautl];
float value;
struct book1 library; // 内部包含同类型的结构体成员
};
// 使用第二段代码定义的结构体
struct book2{
char title[maxtitle];
char author[maxautl];
float value;
};
// 定义结构体变量
struct book2 library2; // 在结构体外部定义的结构体变量
int main() {
// 使用第一段代码定义的结构体
struct book1 novel1;
strcpy(novel1.title, "The Great Gatsby");
strcpy(novel1.author, "F. Scott Fitzgerald");
novel1.value = 15.99;
// 设置内部的library成员的值
strcpy(novel1.library.title, "To Kill a Mockingbird");
strcpy(novel1.library.author, "Harper Lee");
novel1.library.value = 12.50;
// 使用第二段代码定义的结构体
struct book2 novel2;
strcpy(novel2.title, "1984");
strcpy(novel2.author, "George Orwell");
novel2.value = 10.25;
// 设置外部的library2结构体变量的值
strcpy(library2.title, "The Catcher in the Rye");
strcpy(library2.author, "J.D. Salinger");
library2.value = 9.99;
return 0;
}
在上述示例中,我们使用了分别使用了第一段和第二段代码定义的结构体来创建不同的书籍数据结构,并进行了一些简单的赋值操作。
对于结构体变量的声明,也可以紧贴着结构体来声明:
struct book{
char title[maxtitle];
char author[maxauthor];
float value;
}library;
这样一来,library对应着`struct book1`类型的结构体对象,并且包含了`struct book1`类型的成员变量。这个结构体成员包含着同类型的结构体,因此可以用来创建一个自包含的数据结构,以表示图书馆中的书籍信息。
初始化结构:
在结构体中变量之间的初始化有逗号隔开即可。
struct book library{
"jiegouti","FZYjiaoshou",1000
};
访问成员结构:
访问成员是由.来访问的。例如:library.value就可以访问结构体中value的值。虽然library是一个结构体,但是library.value是一个float的变量。所以我们可以想像float类型变量来使用一样。例如:scanf_s("%f",&library.value);在这里有一个小知识点:&的优先级比.高, 所以&(library.value)与&library.value一样。
结构数组:
声明结构数组与声明数组相似:
struct book library[maxbooks];
如果maxbooks=3,那效果图如下:
title author value
library[0].title | library[0].authot | library[0].value |
library[1].title | library[1].authot | library[1].value |
library[2].title | library[2].authot | library[2].value |
访问结构数组就用这样的通式:library[0].title;
也有这样的情况:library[0].title[3];这样就表示title的第四个元素了。
访问结构体成员也可以用指针:
#include<stdio.h>
struct book{
char title[maxtitle];
char author[maxautl];
float value;
};
int main()
{
struct book fellow[2]=
{
{"jiaoshuo1","FZY",1000},
{"jiaoshuo2","FZY",2000}
}
struct book *hit;
hit=&fellow[0];
printf("%p,%p",hit,hit+1);
return 0;
}
结构体与数组:
在这里我给出一道例题:
关于这道题,就可以用到结构体与数组的结合
下面的代码与下方的有点区别,目的是告诉读者,数组与结构体有多种声明方式
#include<stdio.h>
int main()
{
struct student
{
int sex;
char name[100];
};
int main()
{
int n=10;
struct student detail[n];
for(int i=0;i<n;i++)
{
scanf("%d %s",&detail[i].sex,detail[i].name);
//通过.来访问结构体的成员->sex和name
}
return 0;
}
以下就是题解了:
#include<stdio.h>
typedef struct student
{
int sex;
char name[9];
} detail;
int main(void)
{
int n,m;
scanf("%d",&n);
m = n - 1;
int i,j = 0,k = 0,sex = 0;
detail devide[50];
for(i = 0;i < n;i++)
{
scanf("%d %s",&devide[i].sex,devide[i].name);
}
for(i = 0;i < n / 2;i++)
{
sex = 1 - devide[i].sex;
for(j = m;j >= 0;j--) //与第一个for循环成相反 让成绩好的跟差的组成一队
if(devide[j].sex == sex)
{
printf("%s %s\n",devide[i].name,devide[j].name);
//找到后删除该元素
for(k = j;k < m ;k++) //注意这里k=j并不能执行删除,因为要满足k<m;
{
devide[k] = devide[k + 1];
//这里类似与链表,将该位置让给下一个元素。
//大家可以去看看我之前的文章,下方就是文章的链接
}
m -= 1;
break;
}
}
return 0;
}
嵌套结构:
所谓的嵌套,就是一个结构体包含另一个结构体
那嵌套有什么好处呢?其实最主要的就是构建一个数据结构。
例如,一个公司有名称,有公司年龄,有员工信息。那一名员工有名字,有年龄,有工资。
像这种情况,就可以用嵌套结构,请看下方代码:
#include<stdio.h>
struct Employee
{
char name[50];
int age;
double salary;
}
struct Company
{
char name[50];
int numEmployee;
struct Employee number[100];//这里就进行嵌套
}
int main()
{
struct newCompany={ {jiaoshou.F,"3",
{jiaoshou.F001,15,10000},
{jiaoshou.F002,21,20000},
{jiaoshou.F003,30,40000},}
//这里的结构体,输入数据的时候,其实就用到两个结构体了。
//打印公司信息
printf("%s",newCompany.Comployeename);
printf("%d",newCompany.ComployeenumEmployee);
//打印员工信息
for(int i=0;i<newComployee.numEmployee)
{
printf("%s",newCompany.Employee.name[i]);
printf("%d",newCompany.Employee.age[i]);
printf("%lf",newCompany.Employee.salary[i]);
}
return 0;
}
传递结构体
对这部分的讲解,我就直接用代码讲了,因为直接写代码比大白话理解更深。
传递结构体成员:
#include<stdio.h>
#define FUNDIED 50
struct funds
{
char bankfund[FUNDIED];
double bankfund;
char savefund[FUNDLED];
double savefund;
};
double sum(double,double);
int main(void)
{
struct funds stan
{
"FZY->bank",
8888,
"jiaoshou.F",
9999
};
printf("%.2f",sun(stan.bankfund,stan.savefund));
return 0;
}
double sum(double x,double y)
{
return (x+y);
}
//这段代码的灵感来源于财务系统;
//这段代码的主要功能是将该人的银行卡账户分别添加到bankfund和savefund中
//实现了传递结构体成员
传递结构的地址:
#include<stdio.h>
#define FUNDIED 50
struct funds
{
char bankfund[FUNDIED];
double bankfund;
char savefund[FUNDLED];
double savefund;
};
double sum(const struct funds *);
int main(void)
{
struct funds stan
{
"FZY->bank",
8888,
"jiaoshou.F",
9999
};
printf("%.2f",sum(&stan));//将地址进行传输
return 0;
}
double sum(const struct funds *money)
{
return (money->bankfund+money->savefund);
}
传递结构:
#include<stdio.h>
#define FUNDIED 50
struct funds
{
char bankfund[FUNDIED];
double bankfund;
char savefund[FUNDLED];
double savefund;
};
double sum(struct funds moolah);
int main(void)
{
struct funds stan
{
"FZY->bank",
8888,
"jiaoshou.F",
9999
};
printf("%.2f",sum(stan));
return 0;
}
double sum(struct funds moolah)
{
return (moolah.bankfund+moolah.savefund);
}