[数据结构]不带头单向非循环链表

我们有学过,顺序表如何制作,还有一个与其非常相似的结构就是链表的制作,不过链表在数据中的存储不像顺序表一样是按照内存的顺序进行存储的,其在内存中是一块一块的进行存储,具体如何我们可以看看下面这张图

此链表有一个头指针pList,我们要创造的链表为不带头指针的链表,既我们创造一个结构体,其中一部分为数据部分,另外一部分为下一个数据的地址。

如何开辟内存呢?

我们知道如果我们要增加数据,我们无法像静态顺序表一样一开始就定下来最大数据量为多少,因此我们这边采用动态内存的方式进行开辟内存。还有一些具体的功能

如增删查改,具体如何实现我们可以看以下代码

SeqList.h文件

#pragma once
//单向链表,增删查改插
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define datatype int
typedef struct Single_list
{
	datatype x;
	struct SL* next;
}SL;

//购买一个动态内存空间
SL* buynode();
//尾插
void pushback(SL** head,datatype input);
//打印链表
void printlist(SL* head);
//头插
void pushfront(SL** head, datatype input);
//尾删
void popback(SL** head);
//头删
void popfront(SL** head);
//查找
SL* findlist(SL* head, datatype input);
//改
void modifylist(SL** head, int location, datatype input);
//插入
void insertlist(SL** head, int location, datatype input);

SeqList.c文件

#include "Slist.h"

SL* buynode()
{
	SL*temp = (SL*)malloc(sizeof(SL));
	if (temp == NULL)
	{
		perror("buynode:");
	}
	return temp;
}
void pushback(SL** head,datatype input)
{
	SL* temp = buynode();
	temp->x = input;
	temp->next = NULL;
	if (*head == NULL)
	{
		*head  = temp;
	}
	else
	{
		SL* tail = *head;
		while (tail->next)
		{
			tail = tail->next;
		}
		tail->next = temp;
	}
}
void printlist(SL* head)
{
	if (head == NULL)
	{
		printf("NULL");
		printf("\n");
		return;
	}
	while (head->next)
	{
		printf("%d --> ", head->x);
		head = head->next;
	}
	printf("%d --> ", head->x);
	printf("NULL");
	printf("\n");
}
void pushfront(SL** head, datatype input)
{
	if (*head == NULL)
	{
		SL* temp = buynode();
		temp->x = input;
		temp->next = NULL;
		*head = temp;
	}
	SL* temp = buynode();
	temp->x = input;
	temp->next = *head;
	*head = temp;
}
void popback(SL** head)
{
	if (*head == NULL)
	{
		printf("目前没有数据填入,请输入数据后再进行删除\n");
		return;
	}
	if ((*head)->next == NULL)
	{
		free(*head);
		*head = NULL;
		return;
	}
	SL* pre = NULL;
	SL* tail = *head;
	while (tail->next)
	{
		pre = tail;
		tail = tail->next;
	}
	pre->next = NULL;
	free(tail);
	tail = NULL;
} 
void popfront(SL** head)
{
	if (*head == NULL)
	{
		printf("目前没有需要删除的数据,请先输入\n");
		return;
	}
	SL* temp;
	temp = (*head)->next;
	free(*head);
	*head = temp;
}
SL* findlist(SL* head, datatype input)
{
	SL* tail = head;
	while (tail->next == NULL)
	{
		if (tail->x == input)
		{
			printf("找到了\n");
			return tail;
		}
		tail = tail->next;
	}
	//判断最后一个数据
	if (tail->x == input)
	{
		printf("找到了\n");
		return tail;
	}
	printf("没找到数据");
}
void modifylist(SL** head, int location, datatype input)
{
	int count = 1;
	SL* tail = *head;
	while (count < location)
	{
		tail = tail->next;
		count++;
	}
	tail->x = input;
}
void insertlist(SL** head, int location, datatype input)
{
	SL* newnode = buynode();
	newnode->x = input;
	if (*head == NULL)
	{
		SL* temp = buynode();
		temp->x = input;
		temp->next = NULL;
		*head = temp;
		return;
	}
	if (location == 1)
	{
		newnode->next = *head;
		return;
	}
	int count = 1;
	SL* pre = NULL;
	SL* tail = *head;
	while (count < location)
	{
		pre = tail;
		tail = tail->next;
		count++;
	}
	pre->next = newnode;
	newnode->next = tail;
}

Test.c文件

#include "Slist.h"

void test1()
{
	SL* Singlelist = NULL;
	pushback(&Singlelist, 1);
	pushback(&Singlelist, 2);
	pushback(&Singlelist, 3);
	pushback(&Singlelist, 4);
	pushfront(&Singlelist, 5);
	pushfront(&Singlelist, 6);
	pushfront(&Singlelist, 7);
	printf("一开始:");
	printlist(Singlelist);
	findlist(Singlelist, 7);
	popback(&Singlelist);
	printf("尾删:");
	printlist(Singlelist);
	printf("头删:");
	popfront(&Singlelist);
	printlist(Singlelist);
	printf("修改后:");
	modifylist(&Singlelist, 3, 3);
	printlist(Singlelist);
	printf("插入:");
	insertlist(&Singlelist, 3, 5);
	printlist(Singlelist);
	findlist(Singlelist, 7);
	return;
}

void test2()
{
	SL* Singlelist = NULL;
	pushback(&Singlelist, 1);
	printlist(Singlelist);
	popfront(&Singlelist);
	printlist(Singlelist);
}

void main()
{
	test1();
}

总之单向非循环链表是一个非常简单的数据结构,读者可以自行阅读代码以及注释理解。

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

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

相关文章

线程安全性问题的原因

1.抢占式执行随机调度 这里的意思就是&#xff0c;当两个线程同时启动的时候&#xff0c;两个线程会同时进行&#xff0c;并且是抢占式执行的。 而且是随机调度资源的。 如代码&#xff1a; public class Deome4 {public static void main(String[] args) {Thread t1 new …

2024单品正价起号,直播素材投流选品,【选品课】+【投流课】+【素材课】+【卡首屏】

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89064168 更多资源下载&#xff1a;关注我。 课程内容: 01 01 1.如何养账号过风控,mp4 01 1.如何搭建一条计划(1)..mp4 02 1.如何搭建一条计划(2)..mp4 02 02 2.单品起号方案如何选择,mp4 03 2.-比…

【ONE·基础算法 || 字符串】

总言 主要内容&#xff1a;编程题举例&#xff0c;熟悉理解字符串类题型。       文章目录 总言1、字符串2、最长公共前缀&#xff08;easy&#xff09;2.1、题解 3、最长回文子串 (medium)3.1、题解 4、二进制求和&#xff08;easy&#xff09;&#xff1a;高精度加法4.1、…

2.网络编程-HTTP和HTTPS

目录 HTTP介绍 HTTP协议主要组成部分 GET 和 POST有什么区别 常见的 HTTP 状态码有哪些 http状态码100 HTTP1.1 和 HTTP1.0 的区别有哪些 HTTPS 和 HTTP 的区别是什么 HTTP2 和 HTTP1.1 的区别是什么 HTTP3 和 HTTP2 的区别是什么 HTTPS的请求过程 对称加密和非对称…

armlinux裸机-uart

uart是一对一的串行异步全双工通信通信协议&#xff0c;串行速度较慢&#xff08;usart支持同步通信&#xff09; 传输原理 多个参数可以设置 为满足使用需求&#xff0c;我们一般都用带fifo缓冲中断。 我们使用S3C2440芯片&#xff0c;具体寄存器操作可以查看用户手册

积木报表Excel数据量大导出慢导不出问题、大量数据导不出问题优化方案和分析解决思路(优化前一万多导出失败,优化后支持百万级跨库表导出)

文章目录 积木报表Excel数据量大导出慢导不出问题、大量数据导不出问题优化方案和分析解决思路&#xff08;优化前一万多导出失败&#xff0c;优化后支持百万级跨库表导出&#xff09;优化结果需求背景和解决方案的思考解决方案流程描述&#xff1a;关键代码引入easy excel新建…

CentOS7.9.2009安装elasticsearch7.11.1(单节点)

本文章使用CentOS7.9.2009服务器安装elasticsearch7.11.1软件 1.服务器信息 [root@elasticsearch ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@elasticsearch ~]# [root@elasticsearch ~]# cat /etc/hosts | grep elasticsearch 192.168.10.24…

如何理解图像处理领域的病态问题(ill-posed problem)

ill-posed problem&#xff0c;我们可以理解为病态问题或者不适定问题。在本文中&#xff0c;统一成为不适定问题。 在讨论不适定问题&#xff08;ill-posed problem&#xff09;之前&#xff0c;我们先来看一下什么叫适定性问题&#xff08;well-posed problem&#xff09;。…

14届蓝桥杯 C/C++ B组 T7 子串简写 (字符串)

采用存储目标字符下标的方法&#xff0c;此题的想法比较新奇&#xff0c;故予以记录。 存好下标之后&#xff0c;可以先定位好启始的字符&#xff0c;然后去搜结尾字符符合长度k并且最靠近启始字符的下标&#xff0c;找到之后可以直接取到这个下标之后的所有下标&#xff0c;因…

3d怎么在一块模型上开个孔---模大狮模型网

在进行3D建模时&#xff0c;有时候需要在模型上创建孔&#xff0c;以实现特定的设计需求或功能。无论是为了添加细节&#xff0c;还是为了实现功能性的要求&#xff0c;创建孔都是常见的操作之一。本文将介绍在3D模型上创建孔的几种常用方法&#xff0c;帮助您轻松实现这一目标…

免费全开源,功能强大的多连接数据库管理工具:DbGate

DbGate&#xff1a;您的全能数据库指挥中心&#xff0c;一站式免费开源解决方案&#xff0c;无缝连接并管理多款主流数据库&#xff0c;让复杂的数据世界变得轻松易控! - 精选真开源&#xff0c;释放新价值。 概览 DbGate 是跨平台的数据库管理器。支持 MySQL、PostgreSQL、SQ…

新零售SaaS架构:客户管理系统架构设计(万字图文总结)

什么是客户管理系统&#xff1f; 客户管理系统&#xff0c;也称为CRM&#xff08;Customer Relationship Management&#xff09;&#xff0c;主要目标是建立、发展和维护好客户关系。 CRM系统围绕客户全生命周期的管理&#xff0c;吸引和留存客户&#xff0c;实现缩短销售周…

chrome 浏览器 有自带的自动字幕功能,支持英文,控制您的音乐、视频等媒体内容

chrome 浏览器 有自带的自动字幕功能&#xff0c;支持英文&#xff0c;控制您的音乐、视频等媒体内容

Android Studio学习15——多页面情况下再看Activity生命周期

按返回键退出APP时&#xff1a; 走正常页面的退出流程&#xff1a;onPause–>onStop–>onDestroy(会Destroy,因为它从任务栈中退出了) 再点击图标回来时&#xff1a; 走正常页面的创建流程&#xff1a;onCreate–>onStart–>onResume 按Home键退出App时&#xff1a…

【C#】yield使用

&#x1f4bb;代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace ConsoleApp15 {internal class Program{static void Main(string[] args){IEnumerable<int&…

深度比较Vue 3.0中的computed和watch属性用法与最佳实践

摘要&#xff1a;在Vue 3.0中&#xff0c;computed和watch属性是用于处理数据逻辑的重要工具。本文将详细对比这两个属性的工作原理、适用场景以及使用时的注意事项&#xff0c;旨在帮助开发者更有效地选择和使用它们。 一、computed属性 computed属性是Vue 3.0中用于计算数据…

【小白学机器学习10】假设检验之1:F检验,F检验量的构造,F分布,F分布查表求P值等

目录 1 什么是F检验 F-test 1.1 F-test的定义 1.1.1 维基百科对F检验的定义 1.1.2 百度百科的定义 1.2 F检验的别名 1.3 F检验的判断手段 / 要达成的目标 / 适用范围 1.3.1 判断手段 1.3.2 对H0原假设的理解 1.3.3 判断目标/目的 1.3.4 适用的范围&#xff0c;场合 …

C++【组合模式】

简单介绍 组合模式是一种结构型设计模式&#xff0c; 只有在可以将对象拆分为【树状结构】的情况下使用。并且像使用独立对象一样使用它们。 常用于表示与图形打交道的用户界面组件或代码的层次结构。 基础理解 Q&#xff1a;为什么要用组合模式 &#xff1f; A&#xff1a;在…

每天学习一个Linux命令之curl

每天学习一个Linux命令之curl 在Linux系统中&#xff0c;有很多有用的命令可以帮助我们与网络进行交互。一个非常常用的命令是curl&#xff0c;它是一个功能强大的工具&#xff0c;可用于发送、接收和处理各种网络请求。本文将详细介绍在Linux下使用curl命令的各种选项及其用法…

011_C标准库函数之<time.h>

头文件<time.h>中说明了一些用于处理日期和时间的类型和函数。其中的一部分函数用于处理当地时间&#xff0c;因为时区等原因&#xff0c;当地时间与日历时间可能不相同。clock_t和time_t是两个用于表示时间的算术类型&#xff0c;而struct tm则用于存放日历时间的各个成…