自己手写一个单向链表【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…

[AIGC] CompletableFuture如何实现任务链式调用?

Java 中的 CompletableFuture 提供了多种方法来支持任务链式调用。这些方法允许你将一组操作链接在一起&#xff0c;形成一个任务链&#xff0c;每一个任务只有在上一个任务成功完成后才会被执行。现在&#xff0c;我们来看一下一些常用的链接任务的方法&#xff1a; thenAppl…

构建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())…

glances的安装方式

1、 对于基于Debian的系统(如Ubuntu) 可以直接使用命令进行安装 sudo apt install glances2、对于基于Red Hat的系统(如CentOS) 安装EPEL仓库 yum install epel-release安装Glances yum install glances3、pip安装glances pip install glances glances网页管理服务bo…

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-…

【IPD进阶】学习IPD流程,从黑话开始

目录 前言 概念一&#xff1a;基于市场的创新 概念二&#xff1a;结构化流程 概念三&#xff1a;管道管理 概念四&#xff1a;异步开发 概念五&#xff1a;CBB 作者简介 前言 学习一个新领域、一套新方法。 有一个很重要的点就是&#xff1a;要了解行业黑话。 你比如…

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; 这一切…

什么是跨域?为什么会产生跨域?怎么解决跨域?

跨域&#xff0c;即跨域资源共享&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;&#xff0c;是一个W3C标准&#xff0c;它定义了一种浏览器和服务器交互的方式来确定是否允许跨源请求。简单来说&#xff0c;跨域就是浏览器的同源策略导致来自不同源的…

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) 的相关论文…

博客摘录「 Sql Server 收缩日志文件原理及always on 下的实践」2024年5月22日

四、Always on 环境下实践   先对数据库进行完整备份&#xff1a; EXEC sp_configure show advanced options, 1; RECONFIGURE; EXEC sp_configure xp_cmdshell, 1; RECONFIGURE; DECLARE DbName NVARCHAR(1000); DECLARE myCursor CURSOR LOCAL STATIC FOR S…

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

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

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

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

前端面试题日常练-day33 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末。 在jQuery中&#xff0c;以下哪个选项用于在元素上绑定一个点击事件&#xff1f; a) click() b) bind() c) on() d) trigger() jQuery中&#xff0c;以下哪个选项用于获取元素的属性值&#xff1f; …