栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言学习记录:链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言学习记录:链表

学了好久的C语言,终于开始学处理数据啦 ~

假设存储看过的电源和此电源的评级

#define TSIZE 40
#define FMAX 5

struct film
{
    char title[TSIZE];
    int rating;
};

struct film movies[FMAX];

可用 movies 数组来存储看过的电影,但是:

  • 电影数量是固定的,如果定义数组太大但是没存满无异于浪费空间。
  • 电影名称大小是固定的,也会出现占用空间的问题。

用 malloc() 方法分配内存

用 malloc() 分配存储位置,可调整存储电影数量的大小,还可不确定的添加数据。

#define TSIZE 40

struct film
{
    char title[TSIZE];
    int rating;
};

struct film * movies;

movies = (struct film *) malloc(n * sizeof(struct film));

此时可按需分配存储空间。

直接使用 malloc() 分配 5 个空间,这样存储空间是连续的。如果使用 5 次 malloc() ,这样存储空间就有可能不连续了。怎么找到存储数据的位置呢?

此时有个办法:每次使用 malloc() 时,也为新分配的空间的地址分配空间。

#define TSIZE 40

struct film
{
    char title[TSIZE];
    int rating;
    struct film * next;
};

结构体中添加第三项成员,存储下一个结构体的地址,用于指向下一个结构体的存储空间。

類 看!这种定义就有链表的意思了吧!


链表(linked list)

需要用一个单独的指针存储第一个结构的地址!这个指针称为头指针(head pointer)

头指针指向链表中的第一项。

如果没有下一项,则本项第三个元素指向下一项的指针应该为空(NULL)。

假设分配第二项的存储空间,则把第二项的地址存入第一项的 next 中。

 

链表使用示例
#define TSIZE 40

struct film
{
    char title[TSIZE];
    int rating;
    struct film * next;
};

s_gets(char * st, int n)是自定义的函数!

int main(void)
{
    struct film * head = NULL;        //定义头指针
    strucy film * prev, * current;
    
    char input [TSIZE];
    
    
    put("Enter first movies title:");
    while(s_get(input,TSIZE)!=NULL && input[0]!='')
    {
        current = (struct film *) malloc(sizeof(struct film)); //分配一个内存空间
        if (head == NULL)
            head = current;
        else
            prev->next = current;    //为当前结构体的第三个元素写入下一结构体的地址
        current->next = NULL;        //下一结构体指向后一结构体的指针为0,表示最后一结构体
        strcpy(current->title,input);
        put("Enter your rating<1-10>:");
        scanf("%d",¤t->rating);
        while(getchar() != 'n')
            continue;
        put("Enter next movie title:");
        prev = current;              //将刚分配的结构体置为当前结构体

    }

    
    if(head == NULL)
        printf("No data!");
    else
        printf("Movie list:n");
    current = head;                //当前结构
    while(current != NULL)
    {
        printf("Move:%s Rating:%d",current->title,current->rating);
        current = current->next;        //下一结构置为当前结构
        
    }
    
    
    current = head;
    while(current != NULL)
    {    
        head = current->next;
        free(current);
        current = head;
    }


    return 0;
}

需要注意一点!释放内存时要每个都释放,不能只释放头指针指向内存。

其中:本程序没有检测内存是否分配成功!而且没有实现删除链表中的项的代码,若需用在项目,需添加必要判断代码。

⛰️今日份学习目标达成!

表情包挺好看吧 ~ emojixd 自己搜吧 !

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/923625.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号