C语言基础系列(三)——链表

2023-10-27

C语言基础系列(三)——链表

1.链表的定义

链表是一些包含数据的独立结构体(被称为节点)的集合。

1.1 单链表

在单链表中,每个节点包含一个指向链表下一节点的指针,示意图如下:
在这里插入图片描述
定义的节点结构体声明如下:

typedef struct NODE {
    int 	val;
    struct NODE *next;
} Node;
1.链表的初始化

链表初始化过程:

  • 申请一个头节点
  • 将其他的节点一直添加至next
//create link_list, return header pointer
//该函数返回了头节点
Node *init_Link(void)
{
    Node *p = (Node *)malloc(sizeof(Node));
    Node *temp = p;

    int i = 0;
    for (i = 0; i< 5; i++)
    {
		Node *a = (Node *)malloc(sizeof(Node));
		a->val = i;
		a->next = NULL;
	
		temp->next = a;
		temp = temp->next;
    }

    return p;
}
2.链表的插入

插入链表的步骤:
1.将新结点的 next 指针指向插入位置后的结点;
2.将插入位置前结点的 next 指针指向插入结点;

/*
 * args: p: header pointer, val: insert number, add: the place want to insert
 * 该函数实现将新结点插入到自己所设定的地方
 */
Node *insert_val(Node *p, int val, int place)
{
    Node *temp = p;
    //judge the place is legal or not
    int i = 0;
    for (i = 1; i < place; i++)
    {
		if (temp == NULL)
		{
		    printf("illegal place insert!\n");
		    return p;
		}
		temp = temp->next;
    }

    Node *c = (Node *)malloc(sizeof(Node));
    c->val = val;

    c->next = temp->next;
    temp->next = c;

    return p;
}

完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>


typedef struct NODE {
    int 	val;
    struct NODE *next;
} Node;

//create link_list, return header pointer
Node *init_Link(void)
{
    Node *p = (Node *)malloc(sizeof(Node));
    Node *temp = p;

    int i = 0;
    for (i = 0; i< 5; i++)
    {
	Node *a = (Node *)malloc(sizeof(Node));
	a->val = i;
	a->next = NULL;

	temp->next = a;
	temp = temp->next;
    }

    return p;
}

//arg: the header pointer
void display(Node *p)
{
    Node *temp = p->next;

    while(temp->next != NULL)
    {
	printf("%d ", temp->val);
	temp = temp->next;
    }
    printf("\n");
}

/*
 * args: p: header pointer, val: insert number, add: the place want to insert
 *
 */
Node *insert_val(Node *p, int val, int place)
{
    Node *temp = p;
    //judge the place is legal or not
    int i = 0;
    for (i = 1; i < place; i++)
    {
	if (temp == NULL)
	{
	    printf("illegal place insert!\n");
	    return p;
	}
	temp = temp->next;
    }

    Node *c = (Node *)malloc(sizeof(Node));
    c->val = val;

    c->next = temp->next;
    temp->next = c;

    return p;
}

int main(void)
{
    Node *p = NULL;
    p = init_Link();
    display(p);

    insert_val(p, 6, 1);
    display(p);
    return 0;
}

参考资料

1.2 双链表

双向链表,简称双链表。从名字上理解双向链表,即链表是 “双向” 的
结构体的定义如下:

typedef struct NODE {
    struct NODE *prior;   //前一个节点
    int 	val;
    struct NODE *next;    //后一个节点
} Node;
#include <stdio.h>
#include <stdlib.h>
//节点结构
typedef struct line {
    struct line * prior;
    int data;
    struct line * next;
}line;
//双链表的创建函数
line* initLine(line * head);
//输出双链表的函数
void display(line * head);

int main() {
    //创建一个头指针
    line * head = NULL;
    //调用链表创建函数
    head = initLine(head);
    //输出创建好的链表
    display(head);
    //显示双链表的优点
    printf("链表中第 4 个节点的直接前驱是:%d", head->next->next->next->prior->data);
    return 0;
}
line* initLine(line * head) {
    int i = 0;
    line * list = NULL;
    //创建一个首元节点,链表的头指针为head
    head = (line*)malloc(sizeof(line));
    //对节点进行初始化
    head->prior = NULL;
    head->next = NULL;
    head->data = 1;
    //声明一个指向首元节点的指针,方便后期向链表中添加新创建的节点
    list = head;
    for (i = 2; i <= 5; i++) {
        //创建新的节点并初始化
        line * body = (line*)malloc(sizeof(line));
        body->prior = NULL;
        body->next = NULL;
        body->data = i;

        //新节点与链表最后一个节点建立关系
        list->next = body;
        body->prior = list;
        //list永远指向链表中最后一个节点
        list = list->next;
    }
    //返回新创建的链表
    return head;
}
void display(line * head) {
    line * temp = head;
    while (temp) {
        //如果该节点无后继节点,说明此节点是链表的最后一个节点
        if (temp->next == NULL) {
            printf("%d\n", temp->data);
        }
        else {
            printf("%d <-> ", temp->data);
        }
        temp = temp->next;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言基础系列(三)——链表 的相关文章

随机推荐

  • Python opencv学习-7图像梯度学习

    图像梯度学习 再次感觉到 先不求甚解 现阶段学习思路为会用就行 基本原理不做太深研究 理解大概原理就行 以下为两个实验 主要演示了sobel求图像梯度的过程 和问题的解决 第一个实验只能找到一种边界 原理 简单的来说 梯度的原理就是求导数
  • opencv的图像编解码问题

    问题1 不同版本的opencv读取的图像数据灰度值不一样 问题2 一个版本的opencv保存的图像 用另一个版本的opencv无法打开 两个问题的原因 不同版本的opencv发布包 从官方下载的dll和lib 采用了不同版本的图像编解码库
  • html p怎么设置空两格,【总结】怎样在

    标签内显示空格——空格实体

    一般在 标签中 无论文字间有几个空格都只会显示一个 若需显示多个 则需用到html中的几种空格实体 即不换行空格 全称No Break Space 是最常见且使用最多的空格 HTML字符值引用为 宽度受字体影响明显而强烈 即 半角空格 全称
  • 解决复制粘贴出现的错误

    proc2 c 49 5 错误 程序中有游离的 240 proc2 c 49 5 错误 程序中有游离的 302 proc2 c 49 5 错误 程序中有游离的 240 proc2 c 49 5 错误 程序中有游离的 302 proc2 c
  • 2022年度笔记本十大热门品牌销量排行榜

    近年来 由于大环境的改变 线上教育 线上办公等的需求使得平板电脑出货量逐步提升 同时 5G时代来临 万物互联是未来的趋势 手机由于操作系统和交互上的局限性 笔记本电脑将会扮演更加重要的角色 未来 整个笔记本电脑行业的空间有望进一步打开 根据
  • 数据结构代码——折半插入排序

    折半插入排序的算法思想可以参考王道数据结构的书 建议先看书或者通过B站学习相关课程了解算法思想后再看代码 代码 define CRT SECURE NO WARNINGS 1 define ElemType int include
  • 什么是Token(令牌)

    Acess Token 访问资源接口 API 时所需要的资源凭证 简单token 的组成 uid 用户唯一的身份标识 time 当前时间的时间戳 sign 签名 token的前几位以hash算法压缩成的一定长度的16进制字符串 特点 服务端
  • centos7 systemctl 命令详解

    Systemctl 命令简介 定义 systemctl一个系统管理守护进程 工具和库的集合 用于取代System V service和chkconfig命令 功能 systemctl 主要用于查询或发送控制命令给systemd服务 管理单元
  • 执行查看数据库表空间信息报错 ORA-01116、ORA-01110、ORA-27041

    查看剩余表空间大小 SELECT tablespace name 表空间 sum blocks 8192 1000000 剩余空间M FROM dba free space GROUP BY tablespace name ORA 0111
  • Django(8)-静态资源引用CSS和图片

    除了服务端生成的 HTML 以外 网络应用通常需要一些额外的文件 比如图片 脚本和样式表 来帮助渲染网络页面 在 Django 中 我们把这些文件统称为 静态文件 我们使用static文件来存放静态资源 django会在每个 INSTALL
  • pip install 出现Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问

    pip install U numpy进行更新的时候出现了上述的问题 百度了一下直接在install后面加上 user 就可以了 pip install user upgrade numpy
  • 使用ffmpeg对rtsp视频截图

    ffmpeg i rtsp 192 168 1 64 554 Streaming Channels 1 y f mjpeg t 0 001 s 1280x720 test jpg 使用ffmpeg对摄像头的视频流进行截图 rtsp 192
  • Linux内网环境安装nginx,离线安装nginx教程

    说明 本教程针对内网环境 没有互联网环境 安装nginx 安装前测试 nginx未安装时 无法访问 curl http localhost 80 第一步 请参考教程 本地yum源安装 教程连接如下 https note youdao com
  • IDEA在XML中提示SQL

    首先配置Database 选择数据库类型之后 填写数据库配置 配置完成之后右键表名 mybatis generator生成从controller dao单表的代码 Jump to Query Console跳转到IDEA编写SQL的页面 非
  • Stable Diffusion界面参数及模型使用

    系列文章目录 本地部署Stable Diffusion教程 亲测可以安装成功 谷歌Colab云端部署Stable Diffusion 进行绘图 文章目录 系列文章目录 前言 Stable Diffusion界面参数 一 模型是干什么的 二
  • uniapp引入iconfont图标

    1 iconfont官网下载好图标并解压 2 将以下文件复制到项目中 3 文件在项目中的位置 4 打开iconfont css文件修改 font face 里面的路径 修改为相对路径 static fonts 示例如下 5 在App vue
  • 利用mysql load data秒级别大批量写入数据,建议单次10w+以上~速度远超批量insert,附上完整封装工具

    平时项目中 有时候可能会遇到需要大批量写入数据到mysql数据库中的场景 这时候我们可以利用mysql自带的load data语法 先将数据写入文本文件 再将文件读入数据库 具体用法看下面 1 表结构如下 CREATE TABLE wewo
  • Win10家庭版禁用系统更新方法汇总及问题解决

    这个文章针对没有组策略gpedit msc的win10家庭版 网上有几种方法 我在这里汇总一下 并记录之后遇到的问题及 一 先启用组策略 然后禁止更新 1 启用组策略 win10家庭版是没有组策略gpedit msc的 在电脑任意位置创建一
  • 微软宣布在 Excel 中使用 Python:结合了 Python 的强大功能和 Excel 的灵活性。

    文章目录 Excel 中的 Python 有何独特之处 1 Excel 中的 Python 是为分析师构建的 高级可视化 机器学习 预测分析和预测 数据清理 2 Excel 中的 Python 通过 Anaconda 展示了最好的 Pyth
  • C语言基础系列(三)——链表

    C语言基础系列 三 链表 1 链表的定义 链表是一些包含数据的独立结构体 被称为节点 的集合 1 1 单链表 在单链表中 每个节点包含一个指向链表下一节点的指针 示意图如下 定义的节点结构体声明如下 typedef struct NODE