结构体回顾
结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量
例如:
#include<stdio.h>
struct Book
{char book_name[20];char author[20];float price;char id[9];
}b4,b5,b6;//结构体变量
int main()
{ //成员变量初始化struct Book b1 = {"平凡的世界","路遥",50.8,"236ttgh "};printf("%s %s %f %s\n",b1.book_name,b1.author,b1.price,b1.id);return 0;}
运行结果:
可见浮点数在内存中不能精确测到0.8
因为对于有的数,一直加只会一直接近,而不会完全相等
所以在比较是否相等时:直接进行比较是不对的
float f = 3.45;
if(f==3.45)
{
}
所以采用无限接近的方式,是他们的差越小就越接近,可以限制他们的差的大小
float f = 3.54;
if(fabs(f-3.54)<0.0000001)
{
}
结构的声明:
#include<stdio.h>
struct Stu
{char name[20];int age;char sex[5];char id[20];
};
int main()
{//按照结构体成员的顺序初始化 struct Stu s = {"王一博",18,"男" ,"546864465"};printf("name:%s\n",s.name);printf("age:%d\n",s.age);printf("sex:%s\n",s.sex);printf("id:%s\n",s.id);//按照指定的顺序初始化struct Stu s2 = {.age = 18,.name = "wangyiting",.id="98433143",.sex = "女"}; printf("name:%s\n",s2.name);printf("age:%d\n",s2.age);printf("sex:%s\n",s2.sex);printf("id:%s\n",s2.id);return 0;}
结构体的特殊声明:
在声明结构的时候,可以不完全的声明
比如:匿名结构体类型
struct
{int a;char b;float c;}x;struct {int a;char b;float c;}a[20],*p;
p=&x; 看似合理,实则不可以
匿名结构体类型,只能用一次,应为会认为不是同一种,所以只能用一次
结构体的自引用
在数据结构中,数据结构其实是数据在内存中的组织结构
线性存储:---有顺序表和链表
链表是用结构体进行的自引用,里面还套用自己
struct Node
{int data;//一个数据域struct Node next;
};
上述代码是不正确的,因为一个结构体中在包含一个童类型的结构体变量,这样结构体变量的大小就会 无穷的大,是不合理的
以下才是正确的引用方式:
struct Node
{int data;//一个数据域struct Node *next;//存放指针域 struct Node同一结构体,指向下一节点的指针
};
重命名:以下的方式是不对的,因为Node是对前面的匿名结构体类型的重命名产生出的,也容易引出问题, 可以在Node*前面加一个struct
typedef struct Node//对结构体进行重命名 {int data;Node* next;//不可以,只有先产生才可以使用 } Node;
所以定义结构体就不要使用匿名结构体了