DAY13 链表

数组

静态数组

例子 :
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;
}

你可能感兴趣的:(C语言,链表,数据结构,c语言)