结构体的大小计算方式
结构体的对齐方式:首先遵循自然对齐。即结构体存放在能被最大成员变量整除的地址。
内部成员按照各自的自然边界对齐。
结构体定义可以分为三种形式:
struct stu //形式1 先定义类型,后定义变量
{
...
};struct stu s;
struct stu //形式2 定义类型的同时定义变量
{
...
}s1,s2,*s3,s4[10];struct stu s;
struct //形式3 省略了类型名 --如果只用一次,可以这样写
{
...
}s1,s2,*s3,s4[10];
共用体:与结构体较为相似,不过其内部成员共用一块内存,该内存的大小是成员中的最大内存的大小。
考点:用来判断大端小段存储。
union test
{
int a = 1;
char b;
};
printf(“%d\n”,b);
判断b 的0和1
共用体的本质上是节省内存。
结构体和共用体都是定义一种数据类型,有了数据类型便可以实现定义变量、数组、指针、函数返回值。
struct member
{
char name[20];
int no;
union
{
float score;
float salary;
}d;
}
枚举:enum是一种基本数据类型,其实质是int数据类型。
其主要作用是用来方便阅读。可以将特定的数字用枚举的元素表示。
枚举也可定义变量、数组、指针、以及函数返回值。
链表
是数据结构中一种组织数据的方式。
与数组不同的是链表可以实现灵活的增减数据,其缺点也在于访问不够快捷。
节点:
struct Node
{
//数据域
struct stu s;
//指针域
struct Node *p; //指针类型
};
空链表
空链表:
特点:
只有头节点
并且头节点的指针域 为NULLstrcut Node head = {0,NULL};
struct Node *p = &head;
尾插和头插
//尾插
思路:
s1.创建一个新的节点
struct Node *pNew = malloc(sizeof(struct Node));
//放在了堆区
//
s2.找到尾节点
struct Node *p = &head; //此时p在头节点
while( p->next != NULL )
{
p = p->next; //让p指向下一个节点
}
s3.链接到尾节点后面
p->next = pNew;
pNew->next = NULL; //尾节点
void pushBack(struct Node *head)
{
s1.创建一个新的节点
struct Node *pNew = malloc(sizeof(struct Node));
//放在了堆区
//
s2.找到尾节点
struct Node *p = head; //此时p在头节点
while( p->next != NULL )
{
p = p->next; //让p指向下一个节点
}
s3.链接到尾节点后面
p->next = pNew;
pNew->next = NULL; //尾节点
}
int length(struct Node *head)
{
//统计有效节点的个数
}
//头插
void pushFront(struc Node *head,int data)
{
//1.创建新节点
pNew
//2.链接
pNew->next = p->next;
p->next = pNew;
}
注意:创建空链表封装成函数
在创建节点时,将其开辟在堆上。使其长期保存,如果在定义在栈上则在用完之后就会被释放掉,那么数据就不会被保存下来。