链表(1)

目录

单链表

主函数test.c

test1

test2

test3

test4

头文件&函数声明SList.h

函数实现SList.c

打印SLPrint

创建节点CreateNode

尾插SLPushBack

头插SLPushFront

头删SLPopBck

尾删SLPopFront

易错点


本篇开始链表学习。今天主要是单链表&OJ题目。

单链表

前面的博文我们讲了顺序表。顺序表的优势就是【物理空间的连续】,就只需要一个指针指向开始位置,用数组下标去访问即可。但是这也是它的劣势。当插入和删除数据需要挪动数据。

无论是【顺序表】还是【链表】里的数据,任何类型都可。所以用typedef。

在开始阶段,线性表可能是物理空间上连续【顺序表】,可能是逻辑顺序上连续【链表】。链表的优势就是,删除和插入数据不需要挪动,空间可以一块一块的释放,不会影响其他节点。链表每个节点都是独立的。

【链表】的种类很多,今天先介绍【无头单项不循环链表】----【单链表】。

主函数test.c

#include"SList.h"
int main()
{SLNode* phead = NULL;//结构体指针变量存放结构体的地址 头节点test1(&phead);//测试尾插test2(&phead);//测试头插test3(&phead);//测试尾删test4(&phead);//测试头删return 0;
}

test1

void test1(SLNode** pphead)//测试尾插
{SLPushBack(pphead, 10);SLPushBack(pphead, 20);SLPushBack(pphead, 30);SLPushBack(pphead, 40);SLPrint(*pphead);
}

test2

void test2(SLNode** pphead)//测试头插
{SLPushFront(pphead, 77);SLPushFront(pphead, 66);SLPushFront(pphead, 55);SLPushFront(pphead, 33);SLPrint(*pphead);
}

test3

void test3(SLNode** pphead)//测试头删
{SLPopFront(pphead);SLPopFront(pphead);SLPopFront(pphead);SLPrint(*pphead);
}

test4

void test4(SLNode** pphead)//测试尾删
{SLPopBack(pphead);SLPopBack(pphead);SLPrint(*pphead);
}

头文件&函数声明SList.h

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
  • 创建单链表
//创建单链表
typedef int SLNDataType;//单链表节点数据类型typedef struct SListNode//创建节点
{SLNDataType val;struct SListNode* next;
}SLNode;

?为什么 SListNode 还未创建好,就可以在结构体内部使用这个 SListNode 了

因为next是一个结构体指针变量,主体是指针变量,无影响。但是如果是 struct SListNode next;不可以,结构体嵌套结构体是不可以的。


  •  打印数据
//打印数据
void SLPrint(SLNode* phead);
  • 尾插
//尾插
void SLPushBack(SLNode** pphead, SLNDataType x);
  • 头插
//头插
void SLPushFront(SLNode** pphead, SLNDataType x);
  • 头删
//头删
void SLPopFront(SLNode** pphead);
  • 尾删 
//尾删
void SLPopBack(SLNode** pphead);

函数实现SList.c

#include"SList.h"

打印SLPrint

  • 不要让phead移动
void SLPrint(SLNode* phead)
{assert(phead);SLNode* tail = phead;printf("phead->");while (tail->next != NULL){printf("%d->", tail->val);tail = tail->next;}printf("NULL");printf("\n");
}

创建节点CreateNode

//创建链表的节点---结构体
SLNode* CreateNode(SLNDataType x)
{SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));if (newnode == NULL){perror("malloc");exit(-1);//直接终止程序//return;}newnode->val = x;newnode->next = NULL;return newnode;
}

尾插SLPushBack

  • 二级指针的使用,不然就会链接不起来,出了函数栈帧局部变量就销毁了。
  • 改变外部的变量,一定有一个解引用的操作
  • 多情况的考虑
//尾插
void SLPushBack(SLNode** pphead, SLNDataType x)
{//assert(*pphead);SLNode* newnode = CreateNode(x);//无节点if (*pphead == NULL){*pphead = newnode;}//多个节点else{SLNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}tail->next = newnode;}}

头插SLPushFront

  • 代码书写的先后顺序
  • 二级指针 
//头插
void SLPushFront(SLNode** pphead, SLNDataType x)
{//assert(*pphead);SLNode* newnode = CreateNode(x);newnode->next = *pphead;*pphead = newnode;
}

头删SLPopBck

  • 代码书写的先后顺序
  • 二级指针 
//头删
void SLPopFront(SLNode** pphead)
{assert(*pphead);SLNode* tail = *pphead;*pphead = (*pphead)->next;free(tail);tail = NULL;
}

 

尾删SLPopFront

  • 多种情况的考虑 
//尾删
void SLPopBack(SLNode** pphead)
{assert(*pphead);//一个节点if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{SLNode* tail = *pphead;SLNode* prve = tail;while (tail->next != NULL){prve = tail;tail = tail->next;}prve->next = NULL;free(tail);tail = NULL;}
}

 


 

易错点

  • 断言❌
  • 无节点/一个节点/多节点的考虑❌
  • 传值调用/传址调用(二级指针使用)❌
  • 记住:要修改头节点(头节点是结构体指针变量的指向必须用二级指针❌
  • 空间的释放(不是释放指针变量,释放的是指针指向的空间)❌
  • *pphead&*pphead->next辨析❌
  • 野指针的诞生❌

代码---------→【唐棣棣 (TSQXG) - Gitee.com】

联系---------→【邮箱:2784139418@qq.com】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/162530.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】多路IO复用技术②——poll详解如何使用poll模型实现简易的一对多服务器(附图解与代码实现)

在阅读本篇博客之前&#xff0c;建议大家先去看一下我之前写的这篇博客&#xff0c;否则你很可能会一头雾水 【Linux】多路IO复用技术①——select详解&如何使用select模型在本地主机实现简易的一对多服务器&#xff08;附图解与代码实现&#xff09;http://t.csdnimg.cn/…

yolov5--ptq--qat量化之敏感层分析

敏感层分析&#xff0c;应该是发生在ptq量化之前进行分析的操作&#xff0c;经过该操作&#xff0c;可得出哪些层不适合进行量化&#xff0c;则在接下来ptq时可以手动关闭这些层的量化。 进入敏感层分析函数sensitive_analysis中&#xff0c; 具体流程为&#xff1a; 首先验证…

下载树莓派对应的64位Ubuntu系统步骤

说点废话&#xff1a;因为ros2需要安装在64位Ubuntu上面&#xff0c;所以安装64位最合适&#xff1b; 第一步打开https://cn.ubuntu.com/ 网站&#xff1b;选择下载--->iot----> 选择这个镜像文件下载。我觉得镜像文件是img格式的&#xff0c;跟iso文件区别是&#xff…

Android - 编译 openssl 踩坑之路

一、简述 如果你想快速在项目中使用上 openssl,可以使用网上其他开发者提供好的预编译库: OpenSSL(All):https://builds.viaduck.org/prebuilts/openssl/OpenSSL(3.1.*) :https://github.com/217heidai/openssl_for_android以上的预编译库可能最低只支持 API 21(即 Andro…

kubernetes集群编排——k8s存储

configmap 字面值创建 kubectl create configmap my-config --from-literalkey1config1 --from-literalkey2config2kubectl get cmkubectl describe cm my-config 通过文件创建 kubectl create configmap my-config-2 --from-file/etc/resolv.confkubectl describe cm my-confi…

NFC芯片MS520:非接触式读卡器 IC

MS520 是一款应用于 13.56MHz 非接触式通信中的高集成 度读写卡芯片。它集成了 13.56MHz 下所有类型的被动非接触 式通信方式和协议&#xff0c;支持 ISO14443A 的多层应用。 主要特点 ◼ 高度集成的解调和解码模拟电路 ◼ 采用少量外部器件&#xff0c;即可将输…

大数据毕业设计选题推荐-收视点播数据分析-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

python opencv 实现对二值化后的某一像素值做修改和mask叠加

实现对二值化后的某一像素值做修改 使用OpenCV的findNonZero函数找到所有非零&#xff08;也就是像素值为255&#xff09;的像素&#xff0c;然后遍历这些像素并修改他们的值。示例代码&#xff1a; import cv2 import numpy as np # 加载并二值化图像 img cv2.imread(…

SpringCloudAlibaba - 项目完整搭建(Nacos + OpenFeign + Getway + Sentinel)

目录 一、SpringCloudAlibaba 项目完整搭建 1.1、初始化项目 1.1.1、创建工程 1.1.2、配置父工程的 pom.xml 1.1.3、创建子模块 1.2、user 微服务 1.2.1、配置 pom.xml 1.2.2、创建 application.yml 配置文件 1.2.3、创建启动类 1.2.4、测试 1.3、product 微服务 1…

探索ChatGPT在学术写作中的应用与心得

随着人工智能的迅猛发展&#xff0c;ChatGPT作为一种强大的自然语言处理模型&#xff0c;逐渐在学术界引起了广泛的关注。本文将探讨ChatGPT在学术写作中的应用&#xff0c;并分享使用ChatGPT进行学术写作时的一些经验和心得。 01 — ChatGPT在学术写作中的应用 1.文献综述和…

【教3妹学编程-算法题】最大单词长度乘积

3妹&#xff1a;哇&#xff0c;今天好冷啊&#xff0c; 不想上班。 2哥&#xff1a;今天气温比昨天低8度&#xff0c;3妹要空厚一点啊。 3妹 : 嗯&#xff0c; 赶紧把我的羽绒服找出来穿上&#xff01; 2哥&#xff1a;哈哈&#xff0c;那倒还不至于&#xff0c; 不过气温骤降&…

Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库

背景介绍 Apache Doris是一个基于MPP架构的易于使用&#xff0c;高性能和实时的分析数据库&#xff0c;以其极高的速度和易用性而闻名。海量数据下返回查询结果仅需亚秒级响应时间&#xff0c;不仅可以支持高并发点查询场景&#xff0c;还可以支持高通量复杂分析场景。 这些都…