1.结构体
1.1结构体的定义
结构体(Struct)是C语言中一种重要的复合数据类型,允许将不同类型的数据项组合成一
个单一的类型。定义结构体使用struct关键字,其基本语法为:
struct Student
{
成员列表;
}; //;不能省略;
其中,结构体名是用户自定义的标识符,用于标识这个结构体类型;成员列表是结构体中包
含的一个或多个成员,每个成员可以是基本数据类型或另一个结构体类型。
1.2结构体变量的声明和初始化
结构体变量的声明方式:
#include<stdio.h>
#include<string.h>
struct Student
{
int id;
float score;
char name[20];
};
int main(void)
{
int i;
struct Student s; //struct Student s = {1,95.5,"zhangsan"};
s.id = 1;//
s.score = 95.5;//
strcpy(s.name,"zhangsan");//
printf("%d,%f,%s\n",s.id,s.score,s.name);
return 0;
}
1.3结构体成员的访问
结构体成员的访问通常有两种方式:
通过结构体变量和点运算符(.):
stu.age = 20;
printf("%d\n", stu.age);
通过指向结构体变量的指针和箭头运算符(->):
struct Student *pstu = &stu;
pstu->age = 20;
printf("%d\n", pstu->age);
1.4结构体对齐
1、结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;
2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必
须能够整除成员的字节数;
3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;
4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。
1.5链表
构建链表:链表是一种常见的数据结构,其节点通常使用结构体来定义,包含数据和指向下
一个节点的指针。
示例代码,以下是一个使用结构体构建简单链表的示例代码:
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int a;
struct Node *next;
};
void push_front(struct Node *pHead,int n)//插入链表
{
struct Node *pNew = malloc(sizeof(struct Node));
pNew->next=pHead->next;
pHead->next = pNew;
pNew->a= n;
}
void printlist(struct Node *pHead)//打印链表
{
struct Node *p = pHead->next;
while(p!=NULL)
{
printf("%d,",p->a);
p = p->next;
}
printf("\b \n");
}
int size(struct Node *pHead)//有效元素
{
int i=0;
struct Node *p = pHead->next;
while(p!=NULL)
{
++i;
p = p->next;
}
return i;
}
int isEmpty(struct Node *pHead)//判断是否是空链表;
{
if(pHead->next == NULL)
{
return 1;
}
return 0;
}
int main(void)
{
struct Node head= {0,NULL};
printf("%d\n",isEmpty(&head));
push_front(&head,1);
push_front(&head,2);
push_front(&head,3);
push_front(&head,4);
printlist(&head);
printf("%d\n",size(&head));
printf("%d\n",isEmpty(&head));
return 0;
}