自己手写一个单向链表【C风格】

//单链表
#include <iostream>
#define MAX_SIZE 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0typedef int ElemType;//元素的类型
typedef int Status;//返回状态typedef struct Node
{ElemType data;//链表中保存的数据struct Node* next;//指向下一个节点
};typedef struct Node* linkList;//定义单链表,指针//初始化,L是指针的指针
Status InitList(linkList* L)
{(*L) = (linkList)malloc(sizeof(Node));//c语言分配内存头节点if ((*L) == NULL)return ERROR;//没有成功分配内存(*L)->next = NULL;//头节点的下一节点为空,此时只有一个空节点,头结点不包含return OK;
}//清空
Status ClearList(linkList* L)
{linkList p, q;p = (*L)->next;//拿到第一个节点while (p != NULL){q = p->next;//提前保存下一个节点以及后面内容free(p);//释放拿到的节点内存p = q;//继续拿下一个节点}(*L)->next = NULL;//最后将头结点的下一节点置为空return OK;
}//是否为空
Status isListEmpty(linkList L)
{if (L->next != NULL) return FALSE;return TRUE;
}//返回长度
int ListLength(linkList L)
{int i = 0;linkList p = L->next;//指向头结点的下一节点while (p){i++;p = p->next;}return i;
}//获取指定位置元素
Status GetElem(linkList L, int i, ElemType *e)
{linkList p = L->next;int j = 1;//从1开始,如果j==1,就正是第一个节点,头结点不算while ((p != NULL) && (j < i)){j++;p = p->next;}if (p == NULL || j > i){return ERROR;}*e = p->data;return OK;
}//定位元素
int LocateElem(linkList L, ElemType e)
{int i = 1;linkList p = L->next;while (p){if (p->data == e)return i;//返回元素所在的节点位置,从1开始i++;p = p->next;}return ERROR;
}//增加元素
Status ListInsert(linkList* L, int i, ElemType e)
{linkList p, q;p = *L;//增加元素时是增加到对应位置的上一节点,比如1是在头节点之后int j = 1;while ((p != NULL) && j < i){j++;p = p->next;}if (!p || j > i)return ERROR;q = (linkList)malloc(sizeof(Node));if (q == NULL)return ERROR;q->data = e;q->next =  p->next;//上一节点的后面节点赋予添加节点的后面p->next = q;//再把添加节点赋予上一节点的后面return OK;}//删除元素
Status ListDelete(linkList* L, int i)
{int j = 1;linkList p = *L, q;//删除元素,也要知道上一节点while (p && j < i){j++;p = p->next;}if (!p || j > i)return ERROR;if (p->next == NULL)return ERROR;//***提前保存需要删除的内存****q = p->next;//保存后面第一个节点p->next = p->next->next;//让后面第二个节点开始接到后面第一个节点位置//特别注意,不能是free(p->next)因为已经变化了free(q);//再释放后面第一个的内存return OK;
}//遍历显示
Status ListTraverse(linkList L)
{linkList p = L->next;while (p){printf("%d-->", p->data);p = p->next;}printf("\n");return OK;}//创建头部n个新的随机元素
Status CreatListHead(linkList* L, int n)
{srand((unsigned)time(NULL));//随机数种子,根据时间变化linkList p;*L = (linkList)malloc(sizeof(Node));if((*L) == NULL)return ERROR;(*L)->next = NULL;while (n--){p = (linkList)malloc(sizeof(Node));if((p) == NULL)return ERROR;p->data = rand() % 100 + 1;p->next = (*L)->next;//新节点后面接上头结点后面的节点(*L)->next = p;//一直再头结点后面添加新节点}return OK;}//创建尾部
Status CreatListTail(linkList* L,int n)
{srand((unsigned)time(NULL));linkList p, q;*L = (linkList)malloc(sizeof(Node));if ((*L) == NULL)return ERROR;q = *L;while (n--){p = (linkList)malloc(sizeof(Node));if ((p) == NULL)return ERROR;p->data = rand() % 100 + 1;q->next = p;//尾部后面一直接新节点q = p;//更换尾部}q->next = NULL;return OK;
}int main()
{linkList L;ElemType e = 0;Status res;int i, j;res = InitList(&L);printf("初始化后的长度:%d\n", ListLength(L));for (i = 0; i < 5; i++){res = ListInsert(&L, 1, i);if (!res)printf("插入元素失败!\n");}printf("插入5个元素后:\n");ListTraverse(L);printf("插入5个元素后是否为空:%d(1:是  0:否)\n", res);printf("插入5个元素后的长度:%d\n", ListLength(L));res = isListEmpty(L);printf("是否为空:%d(1:是  0:否)\n", res);res = ClearList(&L);printf("清空后后的长度:%d\n", ListLength(L));printf("清空后是否为空:%d(1:是  0:否)\n", res);//重新插入for (i = 0; i < 10; i++){res = ListInsert(&L, 1, i);if (!res)printf("插入元素失败!\n");}printf("插入10个元素后:\n");ListTraverse(L);printf("插入10个元素后的长度:%d\n", ListLength(L));GetElem(L, 5, &e);printf("第5个元素为:%d\n",e);//删除测试j = ListLength(L);res = ListDelete(&L, j + 1);if (res == ERROR)printf("删除第%d元素失败!\n", j + 1);elseprintf("删除第%d元素成功!\n", j);res = ListDelete(&L, j);if (res == ERROR)printf("删除第%d元素失败!\n", j);elseprintf("删除第%d元素成功!\n", j);printf("删除后:\n");ListTraverse(L);if (ListDelete(&L, 5)){printf("删除第五个元素成功!\n");}ListTraverse(L);ClearList(&L);CreatListHead(&L, 20);printf("头部创建:\n");ListTraverse(L);ClearList(&L);printf("尾部创建:\n");CreatListTail(&L, 20);ListTraverse(L);ClearList(&L);free(L);return 0;
}

在这里插入图片描述

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

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

相关文章

【CSP CCF记录】201909-1 小明种苹果

题目 过程 #include<bits/stdc.h> using namespace std; int N,M; long long tree[1010]; int main() {cin>>N>>M;long long result0,max0;//result剩余苹果&#xff0c;max最大疏果个数 int id0;//id最大疏果的果树编号 for(int i1;i<N;i){long long b0…

构建php环境

目录 php简介 官网php安装包 选择下载稳定版本 &#xff08;建议使用此版本&#xff0c;文章以此版本为例&#xff09; 安装php解析环境 准备工作 安装依赖 zlib-devel 和 libxml2-devel包。 安装扩展工具库 安装 libmcrypt 安装 mhash 安装mcrypt 安装php 选项含…

Gin框架学习笔记(六)——gin中的日志使用

gin内置日志组件的使用 前言 在之前我们要使用Gin框架定义路由的时候我们一般会使用Default方法来实现&#xff0c;我们来看一下他的实现&#xff1a; func Default(opts ...OptionFunc) *Engine {debugPrintWARNINGDefault()engine : New()engine.Use(Logger(), Recovery())…

uniapp微信小程序解决type=“nickname“获取昵称,v-model绑定值为空问题!

解决获取 type"nickname"值为空问题 文章目录 解决获取 type"nickname"值为空问题效果图Demo解决方式通过表单收集内容通过 uni.createSelectorQuery 效果图 开发工具效果图&#xff0c;真机上还会显示键盘输入框 Demo 如果通过 v-model 结合 blur 获取不…

【Linux】写时拷贝技术COW (copy-on-write)

文章目录 Linux写时拷贝技术(copy-on-write)进程的概念进程的定义进程和程序的区别PCB的内部构成 程序是如何被加载变成进程的&#xff1f;写时复制&#xff08;Copy-On-Write, COW&#xff09;写时复制机制的原理写时拷贝的场景 fork与COWvfork与fork Linux写时拷贝技术(copy-…

VUE3 学习笔记(十)查看vue版本

命令&#xff1a; npm list vue(空) (在项目的根目录下执行以下命令即可查看项目所使用的vue版本) npm list vue version(空) npm info vue (全局查看vue版本号&#xff0c;详细) npm list vue -g(全局查看vue版本号&#xff0c;简单) npm view vue version(查看项目依赖的vue…

开源博客项目Blog .NET Core源码学习(26:App.Hosting项目结构分析-14)

后台管理页面的系统管理下主要包括用户管理、角色管理、按钮管理和菜单管理&#xff0c;其中创建用户时要指定角色&#xff0c;创建角色时需指定菜单权限&#xff0c;按钮管理也是基于各菜单项进行设置&#xff0c;只有菜单管理相对独立&#xff0c;因此本文学习并分析App.Host…

蓝桥杯【第15届省赛】Python B组 32.60 分

F 题列表越界访问了……省一但没什么好名次 测评链接&#xff1a;https://www.dotcpp.com/oj/train/1120/ C 语言网真是 ** 测评&#xff0c;时间限制和考试的不一样&#xff0c;E 题给我整时间超限&#xff1f; A&#xff1a;穿越时空之门 100&#x1f3c6; 【问题描述】 随…

使用梦畅闹钟,结合自定义bat、vbs脚本等实现定时功能

梦畅闹钟-每隔一段时间运行一次程序 休息五分钟bat脚本&#xff08;播放音乐视频&#xff0c;并锁屏&#xff09; chcp 65001 echo 回车开始休息5分钟 pause explorer "https://www.bilibili.com/video/BV1RT411S7Tk/?p47" timeout /t 3 /nobreak rundll32.exe use…

什么是SSL证书?如何选择SSL证书?

在浏览网站的时候&#xff0c;你会不会有这样一些疑问。 为什么有的网站是http://开头&#xff0c;有的却是https://&#xff1f;它们有什么区别吗&#xff1f; 经常访问的网站&#xff0c;浏览器突然提示“安全证书过期”&#xff0c;提醒你不要浏览该网址&#xff1f; 这一切…

Debug-010-git stash的用法及使用场景

问题原因&#xff1a; 其实也不是最近&#xff0c;就是之前就碰到过这个问题&#xff0c;那就是我正在新分支开发新功能&#xff0c;开发程度还没有到可以commit的程度&#xff0c;我不想提交(因为有些功能没有完全实现&#xff0c;而且没有自测的话很容易有问题&#xff0c;提…

ICML 2024 时空数据(Spatial-Temporal)论文总结

2024ICML&#xff08;International Conference on Machine Learning&#xff0c;国际机器学习会议&#xff09;在2024年7月21日-27日在奥地利维也纳举行 &#xff08;好像ICLR24现在正在维也纳开&#xff09;。 本文总结了ICML 24有关时空数据(Spatial-temporal) 的相关论文…

Golang并发编程-协程goroutine任务取消(Context)

文章目录 前言一、单个任务的取消二、 所有任务取消三、Context的出现Context的定义Context使用 总结 前言 在实际的业务种&#xff0c;我们可能会有这么一种场景&#xff1a;需要我们主动的通知某一个goroutine结束。比如我们开启一个后台goroutine一直做事情&#xff0c;比如…

【小程序八股文】系列之篇章二 | 小程序的核心机制

【小程序八股文】系列之篇章二 | 小程序的核心机制 前言三、微信小程序原理与运行机制简述一下微信小程序的原理微信小程序的双线程的理解为什么不采用浏览器多线程模式&#xff1f;为什么是双线程&#xff1f;&#xff08;出发点&#xff1a;安全&#xff0c;快速&#xff0c;…

Express 的 req 和 res 对象

新建 learn-express文件夹&#xff0c;执行命令行 npm init -y npm install express 新建 index.js const express require(express); const app express();app.get(/, (req, res, next) > {res.json(return get) })app.post(/, (req, res, next) > {res.json(retur…

论文精读-SRFormer Permuted Self-Attention for Single Image Super-Resolution

论文精读-SRFormer: Permuted Self-Attention for Single Image Super-Resolution SRFormer:用于单图像超分辨率的排列自注意 Params&#xff1a;853K&#xff0c;MACs&#xff1a;236G 优点&#xff1a; 1、参考SwinIR的RSTB提出了新的网络块结构PAB&#xff08;排列自注意力…

sky walking日志采集以及注意事项

文章目录 1&#xff0c;sky walking日志采集功能概述2&#xff0c;采集log4j2日志3&#xff0c;采集logback日志4&#xff0c;效果展示5&#xff0c;注意事项 1&#xff0c;sky walking日志采集功能概述 在介绍Sky walking日志采集功能之前&#xff0c;最好在系统学习一遍日志…

【医学AI|顶刊精析|05-25】哈佛医学院·告别切片局限:3D病理如何革新癌症预后

小罗碎碎念 先打个预防针&#xff0c;我写这篇推文用了两个多小时&#xff0c;这就意味着要读懂这篇文章不太容易&#xff0c;我已经做好反复阅读的准备了。不过&#xff0c;风险之下&#xff0c;亦是机会&#xff0c;读懂的人少&#xff0c;这个赛道就越值得押宝。 在正式阅…

【C语言】8.C语言操作符详解(3)

文章目录 10.操作符的属性&#xff1a;优先级、结合性10.1 优先级10.2 结合性 11.表达式求值11.1 整型提升11.2 算术转换11.3 问题表达式解析11.3.1 表达式111.3.2 表达式211.3.3 表达式311.3.4 表达式411.3.5 表达式5: 11.4 总结 10.操作符的属性&#xff1a;优先级、结合性 …

基于Keras的手写数字识别(附源码)

目录 引言 为什么要创建虚拟环境&#xff0c;好处在哪里&#xff1f; 源码 我修改的部分 调用本地数据 修改第二层卷积层 引言 本文是博主为了记录一个好的开源代码而写&#xff0c;下面是代码出处&#xff01;强烈建议收藏&#xff01;【深度学习实战—1】&#xff1a…