链表专题(C语言)

2023-10-28

 本文目录:

                一.初识链表

                        1.链表的基本概念

                        2.链表和顺序表的区别

                二.链表的基本操作

                        1.链表的初始化

                        2.链表的创建(头插法,尾插法)

                        3.打印链表

                        4.获得链表的长度

                        5.获得链表中间结点

                        6.在任意位置处添加结点

                        7.删除结点

一.初识链表

1.链表的基本概念

        链表一种线性的数据结构,通过指针将一个个零散的内存块连接起来,链表的每个内存块称为结点。 

2.顺序表和链表的区别 

  • 存储分配方式不同:顺序存储结构是用一段连续的存储单元依次存储线性表的数据元素,单链表是采用链式存储结构,用一组任意的存储单元存放线性表的元素。可以是物理地址不连续的物理空间
  • 空间利用率不同:顺序表的空间利用率比链表高。因链表在存储数据时,每次只申请一个节点的空间,这种申请存储空间的方式一定程序上造成了空间浪费。 

二.链表的基本操作

基本操作接口:

LinkList InitList();//初始化链表
void CreatByRear(LinkList head);//尾插法
void CreatByHead(LinkList head);//头插法
void OutPut(LinkList head);//打印链表
int GetLength(LinkList head);//获得链表的长度
Node *GetMid(LinkList head);//获得链表中间结点
void DelNode(LinkList head,int pos);//删除结点
void InsertPos(LinkList head,int pos);//在任意位置处插入结点

 首先:链表的基本结构:

typedef struct ListNode{
    int val;
    struct ListNode *next;
}Node,*LinkList;

 

 

1.链表的初始化:

LinkList InitList()
{
    LinkList head;
    head=(Node *)malloc(sizeof(Node));
    head->next=NULL;
    return head;
}

2.链表的创建:

  • 尾插法: 

 

 

void CreatByRear(LinkList head)
{
    int val;
    Node *p=head,*s;
    while(1)
    {
        scanf("%d",&val);
        if(val==0) break;
        else {
            s=(Node *)malloc(sizeof(Node));
            s->val=val;
            p->next=s;
            p=s;
        }
    }
    s->next=NULL;
}
  • 头插法:

 

 

void CreatByHead(LinkList head)
{
	Node *s;
	int val;
	while(1)
	{
		scanf("%d",&val);
		if(val==0) break;
		else {
			s=(Node *)malloc(sizeof(Node));
			s->val=val;
			s->next=head->next;
			head->next=s;
		}
	}
}

 3.打印链表

void OutPut(LinkList head)
{
    Node *p=head->next;
    while(p)
    {
        printf("%d ",p->val);
        p=p->next;
    }
}

 4.获得链表的长度

int GetLength(LinkList head)
{
	int cnt=0;
	Node *p=head->next;
	while(p)
	{
		p=p->next;
		cnt++;
	}
	return cnt;
}

 5.获得链表的中间结点

         快慢指针法:fast每次走两步,slow指针每次走一步,当fast指针走到链表尾部时,slow指针就走到了链表的中间结点

Node *GetMid(LinkList head)
{
	Node *slow=head,*fast=head;
	while(fast!=NULL && fast->next!=NULL)
	{
		fast=fast->next->next;
		slow=slow->next;
	}
	return slow;
}

 6.在任意位置处插入结点

        首先,判断pos位置是否合法,调用GetLength()函数,获得链表的长度,如果说pos小于等于0或者大于链表的长度的话,位置不合法。

        其次,要找到要插入位置的前一个结点 

void InsertPos(LinkList head,int pos,int val)
{
	if(pos<0 || pos>GetLength(head))
	{
		printf("pos位置不合法\n");
		return;
	}
	int i=1;
	Node *p=head,*s;
	s->val=val;
	while(i<pos)
	{
		p=p->next;//找到要插入位置处的前一个结点
		i++;
	}
	s->next=p->next;
	p->next=s;
}

 

7.删除结点 

         与在任意位置处插入结点一样,要判断pos位置是否合法

        其次,要找到要删除结点的前一个结点

void DelNode(LinkList head,int pos)
{
	if(pos<=0 || pos>GetLength(head))
	{
		printf("pos位置不合法\n");
		return;
	}
	Node *s=head;
	int i=1;
	while(i<pos)
	{
		i++;
		s=s->next;//找到要删除结点的下一个结点
	}
	Node *p=s->next;
	s->next=p->next;
	free(p);//最后要释放要删除的结点的空间
}

    还有一些其他的操作还没有写,等下次再跟大家分享!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链表专题(C语言) 的相关文章

  • 微信小程序在手机上预览时image加载的图片无法显示

    错误原因 image加载的图片中含有中文字符 改正 将图片的名字改为全英文字符就可以了
  • React-api配置

    config js配置 在services文件下根据后端文档配置请求接口地址 然后通过 index js 文件统一暴露 接下来新建api文件 在下面创建js文件开始配置接口 POST GET 其中 commonHeaders 是单独配置的需

随机推荐

  • 解封装(十)总结代码

    include
  • 使用Druid查出SQL中所有的表名并为所有表名添加后缀

    使用Druid查出SQL中所有的表名并为所有表名添加后缀 例子是给所有的表名前增加模式名 1 ExportTableAliasVisitorForGP 继承不同数据库类型的ASTVisitorAdapter 重写visit方法 即可修改表名
  • Unity3d之Vector3 学习与应用

    今天的目标是Vector3 和部分 Transform 先说Vector3 首先是Vector3的中英文API Struct Representation of 3D vectors and points 表示3D的向量和点 This st
  • 抖音项目实现2: api层的实现

    目录导航 1 测试user微服务 2 api层的实现 3 github仓库地址 1 测试user微服务 接上一篇实现了user微服务 并将服务注册到了etcd上 测试为服务业编写一个客户端发现服务并进行rpc调用 新建douyin test
  • element的el-table合并,处理合并产生的hover样式问题

    项目场景 有时候列表页需要合并单元格展示 这时候element自带的hover效果没有全选中 如下图所示 但是最终的实现效果是 点击单元格显示合并后的所有行 需要的效果图 解决方案 将合并在一起的行 row 添加相同的currentInde
  • SD卡SPI模式入门教程

    我是阿荣 关注我 在技术路上一起精进 SD卡简介 SD卡是一种基于半导体快闪记忆器的新一代记忆设备 英文全称Secure Digital Memory Card 中文名又称安全数码卡 尺寸分类 按尺寸分类 SD卡分为 标准尺寸 Mini S
  • VS2022 C# 自定义用户控件(PictureBox)

    文章目录 1 创建自定义控件 PictureBox 1 1 新建自定义控件类库 1 2 添加pictureBox控件 1 3 写显示图像的程序代码 1 4 生成dll 2 调用自定义的控件 2 1 新建窗体应用 2 2 添加控件dll 2
  • 面试前端实习生 经验(1)

    一 公司情况 规模 5 60人 前端项目组 6 1 正式员工 实习生 位置 杭州余杭 二 大概问题 1 谈谈深拷贝和浅拷贝的理解 2 你了解的css3新增的东西 3 垂直居中怎么实现 4 谈谈css的核心模块 大概是答padding mar
  • DBCP连接池的.properties文件配置信息

    driverClassName com mysql cj jdbc Driver url jdbc mysql localhost 3306 jdbcdemo serverTimezone GMT 2B8 驱动包用的是mysql conne
  • 距离向量路由算法实现java_距离向量路由协议及优化链路状态路由协议

    1 距离向量路由算 距离向量路由算法要求每个路由器维护一张距离表和路由表 并在表中给出到每个已知目的地的最短距离和路径 在距离表中 列表示和这个节点直接相连的邻居 表中的行表示目的节点 而表中的元素表示 距离 距离 可以是跳跃次数 时延或丢
  • ADAS倒车雷达超声波传感器elmos524.03驱动

    最近一直在思考一个问题 什么是知识 什么是能力 自己的价值在哪里 感觉自己做笔记做的太少 燕过却不留声 最近也想总结下自己到底做过什么 固以此篇献给做汽车电子的朋友 以及想以超声波作为工程化落地的道友们 如有不对之处 欢迎指教 话不多说 测
  • 两个字符串相加——字符串进位的实践

    一 二进制求和 1 1 题目 给你两个二进制字符串 返回它们的和 用二进制表示 输入为 非空 字符串且只包含数字 1 和 0 1 2 题解 我们可以借鉴 列竖式 的方法 末尾对齐 逐位相加 在十进制的计算中 逢十进一 二进制中我们需要 逢二
  • Python遍历文件夹存入list,并合并多文件夹中后缀名相同的文件

    目前一共有五个文件夹 每个文件夹中有多个csv文件 文件夹分别为N N1 N2 N3 N4 每个文件夹中的csv文件都是以子文件夹名称 日期命名 均有相同列 Unnamed 0 默认第一列 需求就是使用for循环将每个日期的五个csv表格合
  • 默认值 唯一性约束

    默认值约束即DEFAULT用于给数据表中的字段指定默认值 即当在表中插入一条新记录时若未给该字段赋值 那么 数据库系统会自动为这个字段插人默认值 其基本的语法格式如下所示 字段名 数据类型 DEFAULT 默认值 1 示例 MySQL命令
  • get 几种传参方式

    1 地址栏传参数 ApiOperation get2控制类 GetMapping get2 public String get2 ApiParam 用户名 String username return hello username 可以直接
  • 加脱壳、加解密、破解辅助及其源码

    PE辅助工具 程序名称 作者 说明 PETool v0 45 beta MackT PE文件信息查看编辑工具 VC源码 PE Labs 1 0 Latigo PE文件信息查看工具 Win32ASM源码 moveres Spring W 移动
  • 彩灯循环控制系统 电路与电子技术 课程设计

    设计目的 本次课程设计要设计一个彩灯循环控制器 首先要分析设计要求 从要实现四花样入手推导出要使用的芯片 可通过八位右移寄存器74LS164实现八个彩灯的向右移动 从它的右移输入端输入四种码来实现它的四种花样 根据四种花样确定这四种码 可通
  • 虚拟机监视器(VMM)

    虚拟机监视器 VMM 是一个系统软件 可以维护多个高效的 隔离的程序环境 该环境支持用户直接去访问真实硬件 而这样的程序环境就称为虚拟机 虚拟机是一个真实存在的计算机系统的硬软件副本 其中部分虚拟处理器指令子集以本地 native 方式执行
  • lduoj_2021年初寒假训练第41场

    2021年初寒假训练第41场 A 复制 粘贴 B 足球联赛 C 捕食关系 D 幻方 E 求和 F 猜歌名 A 复制 粘贴 Description 小y是一个聪明的程序员 但是他懒到了极致 在输入程序时甚至不愿意多打一行代码 有一次 小y发现
  • 链表专题(C语言)

    本文目录 一 初识链表 1 链表的基本概念 2 链表和顺序表的区别 二 链表的基本操作 1 链表的初始化 2 链表的创建 头插法 尾插法 3 打印链表 4 获得链表的长度 5 获得链表中间结点 6 在任意