【数据结构】链表(单链表实现+测试+原码)

1.链表


1.1 链表的概念及结构

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。

现实中:链表就像是一列动车,一节连着一节
数据结构中的链表

 注意:
1.从上图可看出,链式结构在逻辑上是连续的。但是在物理上不一定连续

2.现实中的结点一般都是从堆上申请出来的

3.从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续

2  链表的实现

SList.h(头文件引用)

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <malloc.h>
#include <assert.h>typedef int SLTDataType;typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;void SLTPrint(SLTNode* phead);SLTNode* BuySListNode(SLTDataType x);
void SLTPushBack(SLTNode ** pphead,SLTDataType x);
void SLTPushFront(SLTNode** pphead, SLTDataType x);
void SLTPopBack(SLTNode** pphead);
void SLTPopFront(SLTNode** pphead);//作业
SLTNode* SLTFind(SLTNode* pphead,SLTDataType x);//在pos之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
//在之后插入x
void SLTInsertAfter( SLTNode* pos, SLTDataType x);
//删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos);
//删除pos后一个位置
void SLTEraseAfter(SLTNode* phead,SLTNode* pos);

SList.c(函数功能的实现)

#include "SList.h"void SLTPrint(SLTNode* phead)
{SLTNode* cur = phead;while (cur != NULL){printf("%d->", cur->data);cur = cur->next;}printf("NULL\n");
}SLTNode* BuySListNode(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);	//空地址不正确//assert(*pphead);//空链表可以尾插SLTNode* newnode = BuySListNode(x);if (*pphead == NULL)	//如果为空,则指向新创建元素{*pphead = newnode;}else	//不为空则遍历到尾部插入数据{//需要用指针结构体指针,改变结构体,传递形参SLTNode* tail = *pphead;while (tail->next != 0){tail = tail->next;}tail->next = newnode;}
}void SLTPushFront(SLTNode** pphead, SLTDataType x)//头插
{assert(pphead);	//空地址不正确assert(*pphead);//空链表不可以前删SLTNode* newnode = BuySListNode(x);newnode->next = *pphead;*pphead = newnode;
}void SLTPopBack(SLTNode** pphead)	//尾删
{// 1.空assert(*pphead != NULL);//	2.一个节点if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}//	3.多个节点else{SLTNode* tail = *pphead;while (tail->next->next){tail = tail->next;} free(tail->next);tail->next = NULL;}
}void SLTPopFront(SLTNode** pphead)	//头删
{assert(pphead);assert(*pphead);SLTNode* newhead = (*pphead)->next;free(*pphead);*pphead = newhead;
}SLTNode* SLTFind(SLTNode*phead, SLTDataType x)
{assert(phead);SLTNode* tail = phead;while (tail){if (tail->data == x){return tail;}tail = tail->next;}return NULL;while (tail->data != x){tail = tail->next;if (tail->next==NULL&&tail->data!=x)
//下一个元素的值指向NULL并且数据值不等于要查找的数,既已遍历查找完毕并且没有找到数据{printf(" 输入错误,找不到输入值\n");return 0;}}printf("已找到:%d\n", x);return tail;
}void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{//有错误版本 ,地址近似一样(bug)find函数调试就好了assert(pos);    assert(*pphead);if (pos == *pphead){SLTPushFront(pphead, x); }else{SLTNode* tail = *pphead;//在pos之前插入xwhile (tail->next != pos){tail =  tail->next;}SLTNode* newnode = BuySListNode(x);tail->next = newnode;newnode->next = pos;}} void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{assert(pos);assert(pos->next);SLTNode* newnode = BuySListNode(x);//注意顺序,不然会照成死循环(画图)newnode->next = pos->next;pos->next = newnode;}void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pos);if (pos == *pphead){SLTPopFront(pphead);}else{SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);}}void SLTEraseAfter(SLTNode* phead,SLTNode* pos)
{//assert(pos);//检查是否为尾节点//assert(pos->next);SLTNode* posNext;	//纪录要删除的节点//避免丢失无法FreeposNext = pos->next;//pos->next = pos->next->next;pos->next = posNext->next;free(posNext);posNext = NULL;
}

Test_1_16(各种功能的调试、函数、以及面试OJ题的接口实现)

#include "SList.h"void TestSList1()
{int n;printf("请输入链表长度:");scanf("%d", &n);printf("\n请依次输入每个节点的值:");SLTNode* plist = NULL;	//第一个元素的地址 for (size_t i = 0; i < n; i++){int val;scanf("%d", &val);SLTNode* newnode = BuySListNode(val);//头插newnode->next = plist;plist = newnode;}SLTPrint(plist);SLTPushBack(&plist, 5);SLTPrint(plist);
}void TestSList()
{SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTPushFront(&plist, 10);SLTPushFront(&plist, 20);SLTPushFront(&plist, 30);SLTPushFront(&plist, 40);SLTPrint(plist);}void TestSList3()
{SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);}void TestSList4()
{SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);//SLTPopFront(&plist);//SLTPopFront(&plist);//SLTPrint(plist);SLTFind(plist, 1);SLTFind(plist, 2);SLTFind(plist, 3);SLTFind(plist, 4);SLTFind(plist, 5);SLTFind(plist, 0);
}void TestSlist5()
{SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTNode* pos = SLTFind(plist,4);if (pos)pos->data = 20;//在pos之前插入x//SLTInsert(&plist, pos, 5);SLTPrint(plist);}void TestSlist6()
{SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTNode* pos = SLTFind(plist, 4);SLTInsert(&plist, pos, 90);SLTPrint(plist);
}void TestSlist7()
{SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTNode* pos = SLTFind(plist, 4);SLTInsertAfter(pos, 90);SLTPrint(plist);
}void TestSlist8()
{SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTNode* pos = SLTFind(plist, 4);SLTErase(&plist,pos);SLTPrint(plist);
}void TestSlist9()
{SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTNode* pos = SLTFind(plist, 4);SLTEraseAfter(&plist, pos);SLTPrint(plist);
}struct SListNode* removeElement()
{;
}struct ListNode {int val;struct ListNode* next;};//
//struct ListNode* FindKthToTail(struct ListNode* pListHead, int k)
//{
//	struct ListNode* first = pListHead;
//	struct ListNode* tail = pListHead;
//
//	while (first->next)
//	{
//		while (k>0&&first->next)
//		{
//			k--;
//			first = first->next;
//		}
//		if (first->next==NULL)
//		{
//			return tail;
//		}
//		tail = tail->next;
//		first = first->next;
//	}
//	//tail=tail->next;
//	return tail->next;
//}struct ListNode* FindKthToTail(struct ListNode* pListHead, int k)
{if (pListHead == NULL){return pListHead;}struct ListNode* first = pListHead;struct ListNode* tail = pListHead;while (first->next){while (k > 0 && first->next){k--;first = first->next;//if (first->next == NULL && k > 0)//{//	return NULL;//}}if (first->next == NULL&&k==1){return tail;}else{return NULL;}tail = tail->next;first = first->next;}//tail=tail->next;return tail->next;
}int main()
{struct SListNode* n1 = (struct ListNode*)malloc(sizeof(struct SListNode));struct SListNode* n2 = (struct ListNode*)malloc(sizeof(struct SListNode));struct SListNode* n3 = (struct ListNode*)malloc(sizeof(struct SListNode));struct SListNode* n4 = (struct ListNode*)malloc(sizeof(struct SListNode));struct SListNode* n5 = (struct ListNode*)malloc(sizeof(struct SListNode));n1->data = 1;n2->data = 2;n3->data = 3;n4->data = 4;n5->data = 5;n1->next = n2;n2->next = n3;n3->next = n4;n4->next = n5;n5->next = NULL;FindKthToTail(n1, 6);//TestSList1();//TestSList3();//TestSlist5();//TestSlist7();//TestSlist8();//TestSlist9();/*struct SListNode* n1 = (struct ListNode*)malloc(sizeof(struct SListNode));struct SListNode* n2 = (struct ListNode*)malloc(sizeof(struct SListNode));struct SListNode* n3 = (struct ListNode*)malloc(sizeof(struct SListNode));struct SListNode* n4 = (struct ListNode*)malloc(sizeof(struct SListNode));n1->data = 7;n2->data = 7;n3->data = 7;n4->data = 7;n1->next = n2;n2->next = n3;n3->next = n4;n4->next = NULL;struct SListNode* head = removeElement(n1, 7);return 0;*/}// 
// 
// 
// 
//int nums1[6] = { 1,2,3,0,0,0 };
//int nums1Size = 6;
//int m = 3;
//int nums2[3] = { 2,5,6 };
//int nums2Size = 3;
//int n = 3;int nums1[1];
int m = 0;
int nums2[1] = {1};
int n = 1;
//	int p1 = m - 1, p2 = n - 1;
//	int tail = m + n - 1;
//	int cur;
//	while (p1 > -1 || p2 > -1)
//	{
//		if (p1 == -1)
//		{
//			cur = nums2[p2--];
//		}
//		else if (p2 == -1)
//		{
//			cur = nums1[p1--];
//		}
//		else if (nums1[p1] > nums2[p2])
//		{
//			cur = nums1[p1--];
//		}
//		else
//		{
//			cur = nums2[p2--];
//		}
//		nums1[tail--] = cur;
//	}

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

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

相关文章

React16源码: React中LegacyContext的源码实现

LegacyContext 老的 contextAPI 也就是我们使用 childContextTypes 这种声明方式来从父节点为它的子树提供 context 内容的这么一种方式遗留的contextAPI 在 react 17 被彻底移除了&#xff0c;就无法使用了那么为什么要彻底移除这个contextAPI的使用方式呢&#xff1f;因为它…

知识点积累系列(一)golang语言篇【持续更新】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 知识点积累 系列文章的第一篇&#xff0c;记录golang语言相关的知识点 1.结构体的mapstructure是什么 mapstructure:"default" mapstructure是一个Go语言的库&#xff0c;用于将一个map中的值映射到…

C语言王道第八周一题

Description 初始化顺序表&#xff08;顺序表中元素为整型&#xff09;&#xff0c;里边的元素是 1,2,3&#xff0c;然后通过 scanf 读取一个元素&#xff08;假如插入的是 6&#xff09;&#xff0c;插入到第 2 个位置&#xff0c;打印输出顺序表&#xff0c;每个 元素占 3 个…

添加了gateway之后远程调用失败

前端提示500&#xff0c;后端提示[400 ] during [GET] to [http://userservice/user/1] 原因是这个&#xff0c;因为在请求地址写了两个参数&#xff0c;实际上只传了一个参数 解决方案&#xff1a;加上(required false)并重启所有相关服务

【程序员英语】【美语从头学】初级篇(入门)(笔记)Lesson13(买东西)(餐厅点餐事宜;询问有无座位;食物如何调理:牛排、咖啡等;菜单等相关)

《美语从头学初级入门篇》 注意&#xff1a;被 删除线 划掉的不一定不正确&#xff0c;只是不是标准答案。 文章目录 Lesson 13 At the Restaurant 在餐厅会话A会话B笔记餐厅询问有无座位&#xff1b;餐厅电话订座其他餐厅询问有无座位的问法 吸烟区与非吸烟区&#xff08;smo…

[力扣 Hot100]Day18 矩阵置零

题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 出处 思路 在原数组上直接操作势必会出现“冗余”的0&#xff0c;即原本[i,j]处不是0&#xff0c;例如由于i行的其他位置有0导致[i,j]…

Shell中的AWK

1.awk的工作原理 逐行读取文本&#xff0c;默认以空格或tab键为分隔符进行分隔&#xff0c;将分隔所得的各个字段保存到内建变量中&#xff0c;并按模式或者条件执行编辑命令。awk倾向于将一行分成多个"字段"然后再进行处理。awk信息的读入也是逐行读取的&#xff0…

day38_MySQL

今日内容 0 复习昨日 1 引言 2 数据库 3 数据库管理系统 4 MySQL 5 SQL语言 0 复习昨日 1 引言 1.1 现有的数据存储方式有哪些&#xff1f; Java程序存储数据&#xff08;变量、对象、数组、集合&#xff09;&#xff0c;数据保存在内存中&#xff0c;属于瞬时状态存储。文件&…

删除有序数组中的重复项[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个非严格递增排列的数组nums&#xff0c;请你原地删除重复出现的元素&#xff0c;使每个元素只出现一次&#xff0c;返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。 考虑nums的唯一元素…

Source Insight 4的使用经验

问题1 函数结束提示符<<end tagDebugData>> 在source insight里的options→preference→syntax decorations→auto annotations→annotate closing braceswith end-comments关闭或启动显示. 但是有的有有的没有&#xff0c;奇怪! 参照网络答案&#xff1a; Sou…

DataX介绍

一、介绍 DataX 是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 github地址 详细文档 操作手册 支持数据框架如下&#xff1a; 架构 Reader&#xff1…

IPV4 转 IPV6 解决方案大全

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

App全测试扫描漏洞工具

APP 有漏洞被测要下架&#xff0c;怎么处理&#xff1f; 如题&#xff0c;今天被问到&#xff1a;市面上有什么好的 APP 漏洞扫描工具推荐&#xff1f;我们的 APP 有漏洞&#xff0c;需要下架 APP&#xff1f; 前言 事情的经过是这样的&#xff1a; 1&#xff1a;学员公司测试…

UnityShader(九)Unity中的基础光照(下)

标准光照模型 光照模型有许多种&#xff0c;但在早期游戏引擎中&#xff0c;往往只使用一个光照模型&#xff0c;被称为标准光照模型。 标准光照模型只关心直接光照&#xff0c;也就是那些直接从光源发射出来照射到物体表面后&#xff0c;经过物体表面的一次反射直接进入摄像…

在Meteor Lake上测试基于Stable Diffusion的AI应用

上个月刚刚推出的英特尔新一代Meteor Lake CPU&#xff0c;预示着AI PC的新时代到来。AI PC可以不依赖服务器直接在PC端处理AI推理工作负载&#xff0c;例如生成图像或转录音频。这些芯片的正式名称为Intel Core Ultra处理器&#xff0c;是首款配备专门用于处理人工智能任务的 …

【安装记录】在pve中创建debian12虚拟机

1、官网下载debian12:https://www.debian.org/ 2、安装虚拟机 &#xff08;1&#xff09;上传 iso 文件到pve服务器&#xff1a; 等待上传中。。。 上传完毕结果如下&#xff1a; &#xff08;2&#xff09;创建虚拟机 类别我也不清楚有什么区别&#xff1f;我看推荐使用host…

[数据结构与算法]哈希算法

目录 哈希算法 常见哈希函数&#xff1a; MD5 (Message Digest Algorithm 5): SHA-1 (Secure Hash Algorithm 1): SHA-256 (Secure Hash Algorithm 256-bit): 代码演示: 哈希算法 哈希算法是一种将任意长度的输入数据映射为固定长度的输出数据的算法。哈希函数的主要目标是…

瑞_数据结构与算法_红黑树

文章目录 1 什么是红黑树1.1 红黑树的背景1.2 红黑树的特性 ★★★ 2 红黑树的Java实现2.1 红黑树颜色枚举类Color2.2 红黑树节点类Node2.2.1 实现判断是否是左孩子方法isLeftChild()2.2.2 实现查找叔叔节点方法uncle()2.2.3 实现查找兄弟节点方法sibling() 2.3 红黑树类RedBla…

Python如何递归删除空文件夹

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 1.Python如何递归删除空文件夹&#xff0c;这个问题很常见。 但大多数人的解决办法都是自己实现递归函数解决这个问题&#xff0c;其实根本不用那么麻烦。 Python中的os.walk提供了一种从内到外的遍历目录树的方法&#xff…

fullcalendar案例

fullcalendar案例 <script srchttps://cdn.jsdelivr.net/npm/fullcalendar6.1.10/index.global.min.js></script><script srchttps://code.jquery.com/jquery-3.6.0.min.js></script> <!-- 引入 jQuery CDN --><script>document.addEventL…