首页 > 其他分享 >单链表的增删查改

单链表的增删查改

时间:2024-08-09 22:54:10浏览次数:16  
标签:单链 void next phead 查改 SL 增删 newnode NULL

头文件

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef struct MyStruct
{
    int data;
    struct MyStruct* next;
}SL;
void listprint(SL** phead);//打印链表
void listpushback(SL** phead, int x);//尾插链表
void listpopback(SL** phead);//尾删链表
void listpushfront(SL** phead, int x);//头插链表
void listpopfront(SL** phead);//头删链表
SL* listfind(SL** phead, int x);//查找某个数
void listinsert(SL** phead, SL* pos,int x);//插入一个数
void listerase(SL** phead, SL* pos);//任意位置删除目标
void listdestory(SL** phead);//销毁链表

主函数

#include"list.h"
void listprint(SL **phead)//打印链表
{
	SL* cur = *phead;
	while(cur != NULL)
	{
		printf("%d", cur->data);
		cur = cur->next;
	}
}
void listpushback(SL**phead,int x)//尾插链表
{
	SL* newnode = (SL*) malloc(sizeof(SL));
	if (newnode == NULL)
	{
		printf("malloc,error");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	if (*phead == NULL)
	{
		*phead = newnode;
	}
	else
	{
		SL* tail = *phead;
		while(tail->next!=NULL)
		{
			tail = tail->next;
		}
		tail->next = newnode;
	}
}
void listpopback(SL** phead) // 尾删链表
{
	assert(*phead);
	SL* aheadtail = *phead;
	SL* tail = aheadtail->next;
	while (tail->next != NULL)
	{
		tail = tail->next;
		aheadtail = aheadtail->next;
	}
	free(tail);
	tail = NULL;
	aheadtail->next = NULL;

}
void listpushfront(SL** phead, int x)
{
	SL* newnode = (SL*)malloc(sizeof(SL));
	if (newnode == NULL)
	{
		printf("malloc,error");
		exit(-1);
	}
	SL* fronthead;
	newnode->data = x;
	if (*phead == NULL)
		*phead = newnode;
	else
	{
		fronthead = *phead;
		newnode->next = fronthead;
		*phead = newnode;
	}
}
void listpopfront(SL** phead) {

	assert(*phead);
	SL* delphead= *phead;
	delphead = delphead->next;
	free(*phead);
	*phead = delphead;

}
SL* listfind(SL** phead, int x)

{
	SL* newnode = *phead;
	assert(*phead);
	while (*phead)
		if (newnode->data == x)
			return newnode;
		else
		{   
			newnode = newnode->next;
			if (newnode == NULL)
				return newnode;
		}
}
void listinsert(SL** phead, SL* pos, int x)
{
	assert(*phead);
	SL* find=NULL;
	SL* newnode = (SL*)malloc(sizeof(SL));
	if (newnode == NULL)
	{
		printf("malloc,error");
		exit(-1);
	}
	newnode->data = x;
	if (*phead == pos)  // 使用比较运算符
		{
			listpushfront(phead, x);
		}
	else
	{
		find = *phead;
		while (find->next != pos)
		{
			find = find->next;

		}
		newnode->next = find->next;
		find->next = newnode;
	}
			}
void listerase(SL** phead, SL* pos)//任意位置删除目标
{
	if (*phead == pos)
	{
		listpopfront(phead);

	}
	else
	{
		SL* prev = *phead;
		while (prev->next != pos)
		{

			prev = prev->next;


		}
		prev->next = pos->next;
		free(pos);
		pos = NULL;
	}

}
void listdestory(SL** phead)//销毁链表
{
	assert(*phead);
	SL* cur = *phead;
	while (cur)
	{
		
		*phead = cur->next;
		free(cur);
		cur = *phead;

	}
	cur = NULL;
	*phead = NULL;
	printf("销毁成功");

}

测试

#include"list.h"
void test()
{
	SL* plist = NULL;
	listpushback(&plist, 1);
	listpushback(&plist, 3);
	listpushback(&plist, 2);
	listpushfront(&plist, 5);
	SL* pos = listfind(&plist, 5);
	listinsert(&plist, pos, 8);

	listprint(&plist);
	listdestory(&plist);

}
int main()
{
	test();


}

标签:单链,void,next,phead,查改,SL,增删,newnode,NULL
From: https://blog.csdn.net/m0_74217856/article/details/141072599

相关文章

  • go 通过泛型实现通用的增删改查
    接口typeIpagedbRequestModel[Tany]interface{Insert(entity*T)errorUpdate(entity*T)errorInsert2Result(entity*T)*pagemodel.IchubResult[T]Update2Result(entity*T)*pagemodel.IchubResult[T]DeleteById(idint64,keys...string)......
  • 如何把Connection 封装到工具类里面 调用工具类方法实现 增删改查操作 java JDBC
    如何把Connection封装到工具类里面调用工具类方法实现增删改查操作javaJDBC使用数据库连接池以HikariCP为例在JDBC中,使用数据库连接池是一个常见的做法,以提高数据库操作的效率和性能。连接池管理着一组数据库连接,这些连接可以被重用而不是每次需要时都创建新的连接。......
  • 如何把Connection 封装到工具类里面 调用工具类方法实现 增删改查操作 java JDBC使用
    如何把Connection封装到工具类里面调用工具类方法实现增删改查操作javaJDBC使用C3P0数据库连接池答:当使用C3P0作为数据库连接池时,你可以按照类似的模式来配置和使用它。以下是一个示例,展示了如何在Java项目中配置C3P0连接池,并创建一个工具类来管理数据库连接和执行基本的......
  • SpringIOC整合dbUtil做的增删改查以及转账业务的实现
    目录一、xml方式实现1.介绍lombok插件2.功能3.步骤3.1idea安装插件(只做一次)3.2添加坐标 3.3编写注解4.核心类4.1QueryRunner4.2query()查询4.3update()增删改5.配置文件applicationContext.xml6.junit测试6.1使用步骤6.1.1坐标6.1.2注解(修饰方......
  • 安卓开发重点:数据库使用(学生信息库的增删改查)
    安卓开发的基础学习中,有一个名为数据处理的重难点。也就是如何实现增删改查。现在咱们以学生信息库为例,看看如何实现学生信息的查找,删除,添加和修改。XML:activity_main首先制作初始页面,也就是上图的四个图片按钮,文件名为activity_main<LinearLayoutxmlns:android="htt......
  • C# wnform 三层架构 增删改查 修改数据(修改篇)
    ss一.留言本专栏三层架构已经更新了添加登录显示,还差修改以及删除,本篇更新修改,主要操作为点击修改某一条数据,然后跳转页面进行修改。二.展示我们先看DAL代码///<summary>///修改///</summary>///<paramname="id"></param>//......
  • MYSQL死锁分析案例二(高并发增删改同一条记录)
    1、建表CREATETABLE`t1`(`id`intNOTNULL,`name`varchar(200)DEFAULTNULL,`age`intDEFAULTNULL,PRIMARYKEY(`id`),KEY`idx111`(`name`),KEY`idx_age`(`age`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci2、数据......
  • 织梦dedecms怎么写增删改查
    数据库查询<?phprequire_once(dirname(__FILE__)."/include/common.inc.php");//引用数据库连接文件if($dsql->IsTable(&#39;dede_test&#39;)){//如果存在dede_test表//-------------------//|查询一条记录|......
  • 【数据结构】单链表
    前言:小编这里将讨论无头单向非循环的单链表。1.ArrayList的缺陷 在上一期中,小编模拟了列表的相关操作实现,可以发现在增删的过程中非常麻烦,每次增加,或者删除数据的时候,都需要将操作下标的后面所有数据进行前移或者后移。上期博客:http://t.csdnimg.cn/VI2yz所以:由于其......
  • MyBatis搭建和增删改查
    MyBatis是一个开源的持久层框架,用于处理数据库的增删改查操作。它能够将Java对象与数据库中的数据进行映射关系的配置,并自动生成对应的SQL语句,从而简化了数据库操作的编码工作。MyBatis的核心思想是将SQL语句与Java代码分离,通过XML或注解来配置SQL语句,使得SQL语句可以进行灵活......