数据结构---单链表

  • 题目:构造一个单链表。

  • 使用的软件:VS2022
  • 使用的语言:C语言
  • 使用的项目:test.c 

                             Setlist.h

                             Setlish.c

  • 项目实践: Setlist.h的代码为:
    #pragma once
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    
    //定义节点的结构
    //数据 + 指向下一个节点的指针
    typedef int SLTDataType;
    
    typedef struct SListNode {
    	SLTDataType data;
    	struct SListNode* next;
    }SLTNode;
    
    void SLTPrint(SLTNode* phead);
    
    //尾插
    void SLTPushBack(SLTNode** pphead, SLTDataType x);
    //头插
    void SLTPushFront(SLTNode** pphead, SLTDataType x);
    //尾删
    void SLTPopBack(SLTNode** pphead);
    //头删
    void SLTPopFront(SLTNode** pphead);
    

    它和顺序表的头文件基本上差不多,

  • Setlish.c的主文件,则代码为:

    #define  _CRT_SECURE_NO_WARNINGS 1
    
    #include"SList.h"
    void SLTPrint(SLTNode* phead)
    {
    	SLTNode* pcur = phead;
    	while (pcur)//pcur != NULL
    	{
    		printf("%d->", pcur->data);
    		pcur = pcur->next;
    	}
    	printf("NULL\n");
    }
    
    SLTNode* SLTBuyNode(SLTDataType x)
    {
    	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
    	if (newnode == NULL)
    	{
    		perror("malloc fail!");
    		exit(1);
    	}
    	newnode->data = x;
    	newnode->next = NULL;
    
    	return newnode;
    }
    
    //尾插
    void SLTPushBack(SLTNode** pphead, SLTDataType x)
    {
    	assert(pphead);
    	//*pphead 就是指向第一个节点的指针
    	//空链表和非空链表
    	SLTNode* newnode = SLTBuyNode(x);
    	if (*pphead == NULL)
    	{
    		*pphead = newnode;
    	}
    	else
    	{
    		//找尾
    		SLTNode* ptail = *pphead;
    		while (ptail->next)
    		{
    			ptail = ptail->next;
    		}
    		//ptail指向的就是尾结点
    		ptail->next = newnode;
    	}
    }
    //头插
    void SLTPushFront(SLTNode** pphead, SLTDataType x)
    {
    	assert(pphead);
    	SLTNode* newnode = SLTBuyNode(x);
    	//newnode *pphead
    	newnode->next = *pphead;
    	*pphead = newnode;
    }
    //尾删
    void SLTPopBack(SLTNode** pphead)
    {
    	//链表不能为空
    	assert(pphead && *pphead);
    	//链表只有一个节点
    	if ((*pphead)->next == NULL) //-> 优先级高于*
    	{
    		free(*pphead);
    		*pphead = NULL;
    	}
    	else {
    		//链表有多个节点
    
    		SLTNode* prev = *pphead;
    		SLTNode* ptail = *pphead;
    		while (ptail->next)
    		{
    			prev = ptail;
    			ptail = ptail->next;
    		}
    		//prev ptail
    		free(ptail);
    		ptail = NULL;
    		prev->next = NULL;
    	}
    }
    //头删
    void SLTPopFront(SLTNode** pphead);

    这里就直接写完了,不做过多的解释,请看vcr

  • test.c的代码:

    #define  _CRT_SECURE_NO_WARNINGS 1
    
    
    #include"SList.h"
    
    void SListTest01()
    {
    	//链表是由一个一个的节点组成
    	//创建几个节点
    	SLTNode* node1 = (SLTNode*)malloc(sizeof(SLTNode));
    	node1->data = 1;
    
    	SLTNode* node2 = (SLTNode*)malloc(sizeof(SLTNode));
    	node2->data = 2;
    
    	SLTNode* node3 = (SLTNode*)malloc(sizeof(SLTNode));
    	node3->data = 3;
    
    	SLTNode* node4 = (SLTNode*)malloc(sizeof(SLTNode));
    	node4->data = 4;
    
    	//将四个节点连接起来
    	node1->next = node2;
    	node2->next = node3;
    	node3->next = node4;
    	node4->next = NULL;
    
    	//调用链表的打印
    	SLTNode* plist = node1;
    	SLTPrint(plist);
    }
    
    void SListTest02()
    {
    	SLTNode* plist = NULL;
    	SLTPushBack(&plist, 1);
    	SLTPushBack(&plist, 2);
    	SLTPushBack(&plist, 3);
    	SLTPushBack(&plist, 4);
    	SLTPrint(plist);
    	//SLTPushBack(NULL, 5);
    	//
    	//测试头插
    	//SLTPushFront(&plist, 6);
    	//SLTPrint(plist);
    	//SLTPushFront(&plist, 7);
    	//SLTPrint(plist);
    	//SLTPushFront(&plist, 8);
    	//SLTPrint(plist);
    
    	//测试尾删
    	SLTPopBack(&plist);
    	SLTPrint(plist);
    	SLTPopBack(&plist);
    	SLTPrint(plist);
    	SLTPopBack(&plist);
    	SLTPrint(plist);
    	SLTPopBack(&plist);
    	SLTPrint(plist);
    
    }
    
    int main()
    {
    	//SListTest01();
    	SListTest02();
    	return 0;
    }

    基本上就这么多,如果要解释,就是越解释越乱,请大家仔细观看。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL注入基础-3

一、宽字节注入 1、宽字节&#xff1a;字符大小为两个及以上的字节&#xff0c;如GBK&#xff0c;GB2312编码 2、数据库使用GBK编码时&#xff0c;会将两个字符合并为一个汉字(宽字节)。特殊值字符如单引号都会被转义【--->\】&#xff0c;如sqli-lads第32关&#xff0c;输…

【C++】学习笔记——vector_2

文章目录 七、vector2. vecotr的使用3. vector的模拟实现 未完待续 七、vector 2. vecotr的使用 上节我们以二维数组结束&#xff0c;这一节我们以二维数组开始。 // 二维数组 vector<vector<int>> vv;二维数组在底层是连续的一维数组。vv[i][j] 是怎样访问的&a…

Sarcasm detection论文解析 |使用基于多头注意力的双向 LSTM 进行讽刺检测

论文地址 论文地址&#xff1a;https://ieeexplore.ieee.org/document/8949523 论文首页 笔记框架 使用基于多头注意力的双向 LSTM 进行讽刺检测 &#x1f4c5;出版年份:2020 &#x1f4d6;出版期刊:IEEE Access &#x1f4c8;影响因子:3.9 &#x1f9d1;文章作者:Kumar Avinas…

第11章 软件工程

这里写目录标题 1.软件过程1.1能力成熟度模型(CMM)1.2能力成熟度模型集成(CMMI)1.3瀑布模型(线性顺序)1.4增量模型1.5演化模型1.5.1原型模型1.5.2螺旋模型 1.6喷泉模型1.7统一过程(UP)模型 2.敏捷方法3.系统设计4.系统测试4.1单元测试(模块测试)4.2集成测试4.3黑盒测试(功能测试…

论文辅助笔记:Tempo之modules/prompt.py

1 get_prompt_param_cls 2 get_prompt_value 3 Prompt 类 3.1 _init_weights 3.2 forward

一、RocketMQ基本概述与部署

RocketMQ基本概述与安装 一、概述1.MQ概述1.1 用途1.2 常见MQ产品1.3 MQ常用的协议 2.RocketMQ概述2.1 发展历程 二、相关概念1.基本概念1.1 消息&#xff08;Message&#xff09;1.2 主题&#xff08;Topic&#xff09;1.3 标签&#xff08;Tag&#xff09;1.4 队列&#xff0…

gige工业相机突破(一,准备资源)

gige相机能不能绕开相机生产商提供的sdk&#xff0c;而直接取到像&#xff1f; 两种办法&#xff0c;第一&#xff0c;gige vision2.0说明书&#xff0c;第二&#xff0c;genicam 首先你会去干什么事&#xff1f; 好几年&#xff0c;我都没有突破&#xff0c;老虎吃天&#x…

产品AB测试设计

因为vue2项目升级到vue3经历分享1&#xff0c;vue2项目升级到vue3经历分享2&#xff0c;前端系统升级&#xff0c;界面操作也发生改变&#xff0c;为了将影响降到最低&#xff0c;是不能轻易让所有用户使用新系统的。原系统使用好好的&#xff0c;如果新界面用户不喜欢&#xf…

2024/5/5 英语每日一段

Meanwhile, in a twist, Tesla this month settled a high-profile case in Northern California that claimed Autopilot played a role in the fatal crash of an Apple engineer, Walter Huang. The company’s decision to settle with Huang’s family—along with a ruli…

如何打包Apk适配32和64位

一个表格了解lib下的文件夹 .so文件描述armeabi-v7a第七代及以上的ARM处理器&#xff0c;2011年以后生产的大部分Android设备都使用。arm64-v8a第8代、64位ARM处理器&#xff0c;很少设备&#xff0c;三星GalaxyS6是其中之一。armeabi第5代、第6代的ARM处理器&#xff0c;早期…

Mysql报错红温集锦(一)(ipynb配置、pymysql登录、密码带@、to_sql如何加速、触发器SIGNAL阻止插入数据)

一、jupyter notebook无法使用%sql来添加sql代码 可能原因&#xff1a; 1、没装jupyter和notebook库、没装ipython-sql库 pip install jupyter notebook ipython-sql 另外如果是vscode的话还需要安装一些相关的插件 2、没load_ext %load_ext sql 3、没正确的登录到mysql…

Git-flow分支管理与Aone-flow分支管理对比

Git-flow分支管理与Aone-flow分支管理对比 git-flow分支管理&#xff1a; master: 主分支&#xff0c;主要用来版本发布。 hotfix&#xff1a;线上 bug 紧急修复用到的临时分支。这个分支用来修复主线master的BUG release&#xff08;预发布分支&#xff09;&#xff1a;rel…

深入理解网络原理2----UDP协议

文章目录 前言一、UDP协议协议段格式&#xff08;简图&#xff09;校验和 二、UDP与TCP 前言 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同⼯作来完成业务&#xff0c;就有了⽹络互连。 一、UDP协议 协…

基于matlab GUI的Alpha shapes边缘提取

1、程序介绍 本程序是基于matlab语言&#xff0c;使用alpha shapes算法实现点云边缘提取。算法具体原理参考博客&#xff1a;基于alpha shapes的边缘点提取&#xff08;matlab&#xff09;-CSDN博客。该程序包括3个按钮&#xff1a;加载点云、边缘点提取、保存。其中&#xff0…

A Bug‘s Life (并查集)

//新生训练 #include <iostream> #include <algorithm> using namespace std; const int N 5000; int p[N], sz[N]; int n, m; int find(int x) {if (p[x] ! x)p[x] find(p[x]);return p[x]; } int main() {int T;scanf("%d", &T);for (int k 1; …

c#学习基础1

一、复杂数据类型 1&#xff09;概述 2&#xff09;枚举 1.基本概念 枚举是一个比较特别的存在&#xff0c;它是一个被命名的整形常量的集合&#xff0c;一般用它来表示状态&#xff0c;类型等 1.1申明枚举和申明枚举变量 1.2申明枚举语法 2.在哪里申明枚举 3.枚举的使用 4…

13_Scala面向对象编程_伴生对象

文章目录 1.伴生对象1.1 scala的一个性质&#xff0c;scala文件中的类都是公共的&#xff1b;1.2 scala使用object关键字也可以声明对象&#xff1b; 3.关于伴生对象和类4.权限修饰符&#xff0c;scala仅有private;5.伴生对象可以访问伴生类中的私有属性&#xff1b;6.案例7.伴…

五一假期告别人山人海,AI绘画让你的照片更美!

快乐总是短暂的&#xff0c;五一假期结束了&#xff0c;想必大家都拍了不少好看的照片&#xff0c;但是景点也经常是人山人海&#xff0c;照片中不免会出现其它不相干的人或物&#xff0c;以前想抹除这些人或物得找专业的美工或者图像处理专家P掉才行&#xff0c;现在AI绘画来了…

【Redis】Redis命令(一)

1.基本命令 1.1.切换DB 默认使用的是 0 号 DB&#xff0c;可以通过 select db 索引来切换 DB 1.2.查看 key 数量 dbsize 命令可以查看当前数据库中 key 的数量 1.3.删除当前库中数据 flushdb 命令仅仅删除的是当前数据库中的数据&#xff0c;不影响其它库 1.4.删除所有库中数据…

用Python做多项Logit模型

看到网上有一些用 python 做多项 Logit 模型的讲解&#xff0c;大多是使用 scikit-learn 库。这里要介绍的是如何使用 statsmodels 库来做多项 Logit 模型。 题外话&#xff0c;有人会问&#xff0c;statsmodels 和 scikit-learn 两个库有什么区别&#xff1f;为什么你非要用 …