单链表的静态建立以及动态链表建立(红芯书院的研学)

简介: 在csdn写过链表,当时没有熟悉markdown的语法,所以排版很糟糕,虽然排版目前也不怎么样,但是看还是可以的。很用心去研究链表了。我将我的思想写下来。结点这个词组可能写的不对,还希望原谅,明白意思就好。结构体指针通过动态内存申请,会转变为结构体变量,你理解了吗?如果不对,请指教。当然啦,结构体的理解是学好链表的前提。众所周知,链表这种数据结构在数据结构与算法中的地位是极其重要的。我拼了也要把它搞懂。

有关链表(第六阶段笔记-星期一记录)



在csdn写过链表,当时没有熟悉markdown的语法,所以排版很糟糕,虽然排版目前也不怎么样,但是看还是可以的。很用心去研究链表了。我将我的思想写下来。


结点这个词组可能写的不对,还希望原谅,明白意思就好。


结构体指针通过动态内存申请,会转变为结构体变量,你理解了吗?如果不对,请指教。


当然啦,结构体的理解是学好链表的前提。众所周知,链表这种数据结构在数据结构与算法中的地位是极其重要的。我拼了也要把它搞懂。


1:先总结一下如何创建静态链表


显然这个没有任何难度,所谓静态就是它的内存空间并不是动态分配的,这应该是与动态链表的一个主要的区别。静态链表很明显是采用数组来实现这种连续的存储结,动态链表是通过不断动态申请内存空间的,所以链表的长度上没有限制。物理地址的不连续,导致动态链表需要我们使用指针去很好的访问。


终于可以自己完整的写出这两种链表了,先从静态开始。


简单建立一个静态链表


//静态链表的创建
#include<stdio.h>
typedef struct Student{
    int age;
    struct Student *next;
}stu1;
int main(){
    int i;
    int age1;
    stu1 stu[4];//申明变量,静态链表用数组来代替指针,很明显,这种空间是固定的。
    printf("请给结构体变量赋值\n");
    for(i=0;i<3;i++){
            scanf("%d",&age1);//现在给各结点的数据域赋值
            stu[i].age = age1;//用.引用的话,是结构体变量的特权。如果是->,那就是结构体指针引用的方式
    }
            stu1 *head =&stu[0];//定义一个头指针指向第一个元素,只是指针,没有空间,所以head不是结点。可以认为,当定义的指针,赋予它空间的时候,那么就会成为结点。
            stu[0].next = &stu[1];//一下是各个结点串起来,很好理解,依次类推
            stu[1].next = &stu[2];
            stu[2].next = &stu[3];
            stu[3].next =NULL;//没有在stu[3]里面存数据,并且将其指针域的指向赋值为NULL
            while((head->next!=NULL)){
                    printf("%d\n",head->age);
                    head=head->next;
            }
    return 0;
}


简单建立一个动态链表


插入我的小小的潦草的草稿比划,希望有用。哈哈哈哈



动态链表的各方面理解的话,可能并不是很好理解,在不断学习的过程中,一定要有直接的理解,永远顺从别人的代码思路去理解看的话很大可能在后来还回迷惑。比较管用的学习方式就是一定自己去写,并加以思考。


//goal:实现动态申请单链表(动态内存分配)采用了头插法实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 typedef struct Student {
    int age;//数据域
    struct Student* next;//指针域
}Student;
Student* create_head(Student *head){//创建头结点
    head = (Student*)malloc(sizeof(Student));
    head->next=NULL;
    //printf("Hello");
    if(head == NULL){
            printf("空间申请失败\n");
    }else{
            printf("申请空间成功\n");
    }
        return head;
}
Student*insert(Student *head){//插入结点,本次采用了头插法,每个插入方法只要理解一种,就基本都通了。关键在于理解这个过程
    int i=1;
    Student *p1 = head;//好,定义一个指针指向头结点,再次申明此处没有给指针申请空间,并不等同于结点。
    p1->next = NULL;
    printf("请输入要插入结点数据域的值\n");
    printf("输入1结束输入\n");
    while(i!=0){
    scanf("%d",&i);
    Student *p2 = (Student*)malloc(sizeof(Student));//此处给p2申请了空间,所以可以注意一下两者的区别以及用法。
    p2->age = i;
    p2->next = p1;//插入连接
    p1 = p2;//将p1指针指向p2结点,我这样说就很区别了。因为要用p2申请空间,然后p1会对其进行连接插入的操作。
    }
    return p1;
}
Student *printf1(Student *head){//打印操作
    Student *p = head;
    if(p->next==NULL){
        printf("没有可遍历的结点\n");
    }else{
        printf("可遍历的结点的值为\n");
        while(p->next!=NULL){
            printf("%d,",p->age);
            p=p->next;
        }
    }
}
int main()
{
    Student *head= create_head(head);
    Student * p2 = insert(head);
    printf1(p2);
    return 0;
}


一个小小的感想:


终于把动态链表自己去按照自己的思想写出来了。相比当初大一下学期假期在家里上数据结构是并不是太好。近来一定要把不会的东西自己补起来。当我完整的将他人讲课的思维转换为我自己的思维的时候,并可以实现出来完整的东西,这是多么让人喜悦的事情啊。我不怕花费太多的时间,当然前提是自己一直在思考,这个过程充满了痛苦与苦恼,但是很有趣,根是苦的,但是果实是甜的。


相关文章
|
2月前
|
人工智能 JSON 测试技术
AI智能体开发实战:从提示工程转向上下文工程的完整指南
曾被热捧的提示工程正逐渐退潮,本文揭示其局限性,并提出“上下文工程”新范式:通过结构化提示、精准上下文管理、工具调用与统一状态,构建可扩展、可恢复、生产级的智能体工作流,推动AI系统迈向工程化与可控化。
371 9
AI智能体开发实战:从提示工程转向上下文工程的完整指南
|
前端开发 IDE 编译器
HBuilderX 最新安装使用教程,附详细图解,持续更新
HBuilderX 最新安装使用教程,附详细图解,持续更新
|
5月前
|
物联网
云服务器搭建rttys服务
RTTYS是一款基于Web的串口调试工具,分为服务端(rttys)和客户端(rtty)。服务端负责连接串口设备并提供接口,客户端通过浏览器访问实现远程串口调试。它具有跨平台、易部署的特点,适用于物联网、嵌入式开发等场景,极大提升调试效率。
|
9月前
|
监控 数据可视化 搜索推荐
营销人必看:复盘工具选对,效率直接翻倍
营销活动的结束并非任务的终点,而是优化的起点。复盘作为营销闭环中的关键环节,旨在总结经验、发现问题,并为后续策略提供数据支撑和方向指引。本文系统解析了如何高效完成有价值的复盘,涵盖目标回顾、数据拆解、策略优化及团队协作等方面,助力营销能力持续升级。通过明确复盘的核心价值(数据沉淀、策略校准、团队共识),避免常见误区,确保复盘真正推动营销进化,构建可持续的增长飞轮。
564 12
|
存储 SQL NoSQL
Doris数据仓库介绍
Doris数据仓库介绍
4328 14
|
监控 Java 决策智能
使用Java实现智能物流管理系统
使用Java实现智能物流管理系统
|
设计模式 测试技术 Go
Go 项目必备:Wire 依赖注入工具的深度解析与实战应用
在现代软件开发中,依赖注入(Dependency Injection,简称 DI)已经成为一种广泛采用的设计模式。它的核心思想是通过外部定义的方式,将组件之间的依赖关系解耦,从而提高代码的可维护性、可扩展性和可测试性。然而,随着项目规模的增长,手动管理复杂的依赖关系变得日益困难。这时,依赖注入代码生成工具就显得尤为重要。在众多工具中,Wire 以其简洁、强大和易用性脱颖而出,成为 Go 语言项目中的宠儿。本文将带你深入了解 Wire 的安装、基本使用、核心概念以及高级用法,并通过一个实际的 web 博客项目示例,展示如何利用 Wire 简化依赖注入的实现。准备好了吗?让我们开始这场代码解耦的奇
|
存储 PyTorch 算法框架/工具
Transformers 4.37 中文文档(八十五)(1)
Transformers 4.37 中文文档(八十五)
135 4
|
存储 网络协议 数据中心
|
缓存 API 数据库
构建高效Python Web应用:Flask框架与RESTful API设计原则
【5月更文挑战第20天】 在现代Web开发中,构建一个轻量级且高效的后端服务至关重要。本文将深入探讨如何使用Python的Flask框架结合RESTful API设计原则来创建可扩展和易于维护的Web应用程序。我们将通过分析Flask的核心特性,以及如何利用它来实现资源的合理划分、接口的版本控制和请求处理优化等,来指导读者打造高性能的API服务。文中不仅提供了理论指导,还包括了实践案例,旨在帮助开发者提升开发效率,并增强应用的稳定性和用户体验。