首页 > 其他分享 >数据结构--链表

数据结构--链表

时间:2024-09-04 17:14:28浏览次数:7  
标签:head -- pos next 链表 int Sqlist 数据结构

单向链表

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

相较于数组,链表有以下优点:

逻辑结构

(1)链表采用动态内存分配的方式,在内存中不连续 (2)支持动态增加或者删除元素 (3)需要时可以使用malloc或者new来申请内存,不用时使用free或者delete来释放内存

内存结构

链表从堆上分配内存,自由度大,但是要注意内存泄漏

访问效率

链表访问效率低,如果想要访问某个元素,需要从头遍历

越界问题

指针一般使用$ malloc $关键字申请动态内存,只要可以申请得到链表空间,链表就无越界风险

链表的基本操作

创建链表

这里用结构体(struct)存储链表。不同于C++,C语言中新定义结构体变量需要以下格式

struct Data a;

使用typedef关键字后可直接用Sqlist来定义变量
next指针指向表中下一个数据

typedef struct Data {
	int value;
	struct Data* next;
}Sqlist;

malloc 为库<stdlib.h>中的函数,用于动态分配内存,传入所需内存大小,返回值为类型为void的指针,这里使用(Sqlist *)强制转换

Sqlist* Init()
{
	Sqlist* t = (Sqlist*)malloc(sizeof(Sqlist));
	t->value = 1;
	t->next = NULL;
	return t;
}
在pos后插入数值

传入参数为插入数值的位置pos和数值,从头开始遍历链表直到第pos个位置,新建一个节点,将pos指向新节点,新节点指向pos的下一个节点(pos->next)

Sqlist* Create_node()
{
	Sqlist* node = (Sqlist*)malloc(sizeof(Sqlist));;
	return node;
}
Sqlist* getPos(Sqlist*head,int pos)
{
	Sqlist* t = head;
	int i = 1;
	while (i != pos && t != NULL)
	{
		t = t->next; i++;
	}
	return t;
}
void Insert(Sqlist* head, int pos, int value)
{
	Sqlist* t = getPos(head,pos), * newNode = Create_node;
	newNode->value = value;
	t->next = newNode;
	if (t == NULL)//t 为最后一个节点,没有next
	{
		return;
	}
	newNode->next = t->next;
}

删除节点pos

记录下当前节点的前一个节点pre,将pre->next指向pos->next,释放pos的内存

void Delete(Sqlist* head, int pos)
{
	Sqlist* t = head,*pre=head; int i = 1;
	while (i != pos && t != NULL)
	{
		pre = t;
		t = t->next;
		i++;
	}
	if (t != NULL)
	{
		pre->next = t->next;
		free(t);
	}
}

基本操作大概就这些,根据实际问题灵活运用。
提供luogu上的一道练习题luogu
由于用指针维护链表每次操作都需要从头遍历,导致效率不尽人意,想要AC这道题可以考虑使用数组模拟链表
如果出现了RE,可能是调用了NULL->next

附70ptsCODE

#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef struct data
{
	int value;
	struct data* next;
}Sqlist;

int Length = 0;
Sqlist* Create()
{
	Sqlist* node = (Sqlist*)malloc(sizeof(Sqlist));
	Length++;
	return node;
}
Sqlist* Init()
{
	Sqlist* head;
	head = Create();
	head->value = 1;
	head->next = NULL;
	return head;
}
void Delete(Sqlist* head, int ith)
{
	Sqlist* t = head, * pre=head;
	int i = 1;
	while (i != ith && t != NULL)
	{
		pre = t;t = t->next; i++;
	}
	pre->next = t->next;
	free(t); Length--;
}
void Insert(Sqlist* head, int ith, int data)
{
	Sqlist* t = head,*newnode = Create();
	int i = 1;
	while (i != ith && t != NULL)
	{
		t = t->next; i++;
	}
	newnode->value = data;
	newnode->next = t->next;
	t->next = newnode;
}
int Locate(Sqlist* head, int Target)
{
	Sqlist* t = head; int pos=1;
	while (t != NULL)
	{
		if (t->value == Target)return pos;
		t = t->next; pos++;
	}
	return 0;
}
int Query(Sqlist* head, int pos)
{
	Sqlist* t = head;
	int i = 1;
	while (t != NULL && i != pos)
	{
		t = t->next; i++;
	}
	return t->value;
}
void print(Sqlist* head)
{
	Sqlist* t = head;
	while (t != NULL)
	{
		printf("%d ", t->value);
		t = t->next;
	}
	puts("");
}
inline int read()
{
	char c = getchar(); int res = 0;
	while (c < '0' || c>'9')c = getchar();
	while (c >= '0' && c <= '9') {
		res = (res << 1) + (res << 3) + (c - '0'); c = getchar();
	}
	return res;
}
void work()
{
	int q = read();
	Sqlist* L = Init();
	for (int i = 1; i <= q; ++i)
	{
		int var = read(),x,y;
		if (var == 1)
		{
			x = read(), y = read();
			int pos= Locate(L, x);
			Insert(L, pos, y);
		}
		if (var == 2)
		{
			x = read();
			int pos=Locate(L, x);
			if (pos == Length)printf("0\n");
			else {
				printf("%d\n",Query(L,pos+1));
			}
		}
		if (var == 3)
		{
			x = read();
			int pos = Locate(L, x);
			Delete(L, pos+1);
		}
	}
}
int main()
{
	work();
	return 0;
}

标签:head,--,pos,next,链表,int,Sqlist,数据结构
From: https://www.cnblogs.com/Chano/p/18396618

相关文章

  • 网站上传图片被压缩怎么解决
    当网站上传图片被压缩导致质量下降时,可以通过以下几种方式来解决这个问题:1.了解平台压缩机制首先了解平台对图片压缩的具体机制,比如压缩算法、压缩比例等。这有助于针对性地采取措施。2.优化图片上传前的准备按照规定尺寸设计素材:确保上传的图片符合平台要求的尺寸,避免不必......
  • 常用linux命令
    lsls-l(详细信息)ls-la(列出隐藏文件)ls-ladrwxrwxr-x3yanyan40969月415:59./-rw-rw-r--1yanyan140689月415:55CMakeCache.txtdrwxrwxr-x:d表示directory(目录)-表示普通文件rwx权限readwrite执行(所有者的权限)rwx权限readwrite执......
  • 认识HTML
    HTML(超文本标记语言——HyperTextMarkupLanguage)是构成Web世界的一砖一瓦。它定义了网页内容的含义和结构。除HTML以外的其他技术则通常用来描述一个网页的表现与展示效果(如 CSS),或功能与行为(如 JavaScript)。HTML是网络世界Web世界的通用文档,对于人类而言则是消息messag......
  • 中华财险60%研发人员用通义灵码全面提效,“越用越上瘾”
    点击查看中华财险视频采访!保险业被看成是社会“稳定器”和经济“助推器”,近年来已驶入数字化发展快车道。在 AI、大模型当道的今天,保险行业的研发流程、产品设计、场景拓展等业务链条各环节,都值得用大模型进行重塑。日前,中华联合财产保险股份有限公司(以下简称“中华财险”)创新......
  • 中华财险60%研发人员用通义灵码全面提效,“越用越上瘾”
    点击查看中华财险视频采访!保险业被看成是社会“稳定器”和经济“助推器”,近年来已驶入数字化发展快车道。在 AI、大模型当道的今天,保险行业的研发流程、产品设计、场景拓展等业务链条各环节,都值得用大模型进行重塑。日前,中华联合财产保险股份有限公司(以下简称“中华财险”)创新......
  • promise实现一个动态删减并持续执行的队列
     promiseQueue.js:/**@Author:Simoon.jia*@Date:2024-09-0416:00:24*@LastEditors:Simoon.jia*@LastEditTime:2024-09-0416:55:48*@Description:描述*/exportclassPromiseQueue{constructor(){this.queue=[];this.isProcessing=......
  • 安全:nginx安装modsecurity
    一,modsecurity官网:   官网:https://modsecurity.org/如图:   官方代码站:https://github.com/owasp-modsecurity/ModSecurity二,安装环境准备:1,安装依赖库:[root@localhostsource]#yuminstall-ygccmakepcre-devellibxml2libxml2-develcurl-develht......
  • 常见HTTP状态码报错汇总整理
    常见HTTP状态码成功响应200OK:请求已成功,请求所希望的响应头或数据体将随此响应返回。201Created:请求被满足,资源已被创建。202Accepted:请求已被接受,但尚未处理。204NoContent:服务器成功处理了请求,但没有返回任何内容。206PartialContent:服务器成功处理了部分GET请求......
  • IIS相关错误报错汇总整理及解决方案
    解决方案400BadRequest:检查请求是否包含错误的信息或格式。401Unauthorized:确认是否已经进行了身份验证。403Forbidden:检查是否有足够的权限访问资源。404NotFound:确认请求的URL是否正确,资源是否存在。500InternalServerError:检查服务器日志,寻找错误信息。503Ser......
  • vue路由传参接收以及传参对象为对象时的问题及解决--router
    场景:<div@click='toDetail'>查看详情</div>路由传参不能直接传一个对象,需要使用JSON.stringify()方法将其转换成一个字符串,然后在其他页面接受的时候再使用JSON.parse()方法转换成一个对象constrouter=useRouter()consttoDetail=()=>{   //我使用的是Vue3,rout......