数组
静态数组
例子 :
int nums[5] = {0};
struct person ps[5];
缺点 :
1,无法修改地址
2,无法动态定义长度
3,占用内存过大或过小
4,增删速度慢
优点
数组的内存是连续开辟的, 所以读取速度快
动态数组
例子 :
int *nums = (int *) calloc(5,sizeof(int));
struct person *ps = (struct person *)calloc(5,sizeof(struct
person));
缺点 :
增删速度慢
编写代码较为复杂
优点 :
读取效率高
常用的数据结构
1, 数组结构 : 内存连续开辟 ,
2, 链表结构 : 离散开辟
3, 树
4, 二叉树 ( 均衡二叉树 , 非均衡二叉树 )
5, 图
链表结构
分类:
单链表
一个节点只记录下一个节点的地址
双链表
一个节点即记录下一个节点的地址,也记录上一个节点的地址
设计节点
将多个学员信息设计为链表
单链表节点设计
typedef struct student
{
// 数据域
char name[50];
char sex[5];
int num;
double score;
// 指针域
struct student *next;
}Stu;
双链表节点设计
typedef struct student
{
// 数据域
char name[50];
char sex[5];
int num;
double score;
// 指针域
struct student *next;
struct student *head;
}Stu;
总结
typedef struct 结构体名称
{
// 数据域
// 指针域
} 别名 ;
静态链表
#include
// 设计的节点
typedef struct student
{
// 数据域
char name[50];
char sex[5];
int num;
double score;
// 指针域
struct student *next;
}Stu;
int main(int argc, char const *argv[])
{
Stu s01 = {"张三 "," 男 ",1,99,NULL};
Stu s02 = {"李四 "," 女 ",2,69,NULL};
Stu s03 = {"王五 "," 女 ",3,9,NULL};
Stu s04 = {"马六 "," 男 ",4,79,NULL};
Stu s05 = {"候七 "," 男 ",5,92,NULL};
Stu *head = &s01;//将 s01 做完首节点
s01.next = &s02;//将 s02 设置为 s01 的下一个节点
s02.next = &s03;//将 s03 设置为 s02 的下一个节点
s03.next = &s04;//将 s04 设置为 s03 的下一个节点
s04.next = &s05;//将 s05 设置为 s04 的下一个节点
// 链表的遍历
//pd 当前节点
Stu *pd = head;
while(pd != NULL)
{
printf("%s %s %d %.2lf\n",pd->name,pd->sex,pd->num,pd->score);
// 将下一个节点作为下一轮的当前节点
pd = pd->next;
}
return 0;
}
动态链表
#include
#include
#include
// 设计的节点
typedef struct student
{
// 数据域
char name[50];
char sex[5];
int num;
double score;
// 指针域
struct student *next;
}Stu;
int main(int argc, char const *argv[])
{
Stu *s01 = calloc(1,sizeof(Stu));
strcpy(s01->name,"张三 ");
strcpy(s01->sex,"男 ");
s01->num = 1;
s01->score = 99;
Stu *s02 = calloc(1,sizeof(Stu));
strcpy(s02->name,"张三 2");
strcpy(s02->sex,"男 ");
s02->num = 1;
s02->score = 99;
Stu *s03 = calloc(1,sizeof(Stu));
strcpy(s03->name,"张三 3");
strcpy(s03->sex,"男 ");
s03->num = 1;
s03->score = 99;
Stu *s04 = calloc(1,sizeof(Stu));
strcpy(s04->name,"张三 4");
strcpy(s04->sex,"男 ");
s04->num = 1;
s04->score = 99;
Stu *s05 = calloc(1,sizeof(Stu));
strcpy(s05->name,"张三 5");
strcpy(s05->sex,"男 ");
s05->num = 1;
s05->score = 99;
Stu *head = s01;//将 s01 做完首节点
s01->next = s02;//将 s02 设置为 s01 的下一个节点
s02->next = s03;//将 s03 设置为 s02 的下一个节点
s03->next = s04;//将 s04 设置为 s03 的下一个节点
s04->next = s05;//将 s05 设置为 s04 的下一个节点
// 链表的遍历
//pd 当前节点
Stu *pd = head;
while(pd != NULL)
{
printf("%s %s %d %.2lf\n",pd->name,pd->sex,pd->num,pd->score);
// 将下一个节点作为下一轮的当前节点
pd = pd->next;
}
return 0;
}