数组
静态数组
例子
:
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;
}