数据结构---链表的基本操作

  1. 头插法
  2. 遍历链表
  3. 尾插法
  4. 头删法
  5. 尾删法
  6. 按位置插入数据
  7. 按位置删除数据
  8. 直接插入排序
  9.  链表翻转
  10. 快慢指针

linklist.c

#include <stdio.h>
#include <stdlib.h>
#include "./linklist.h"linklist* create_linklist(void)
{linklist* head = (linklist*)malloc(sizeof(linklist));	if(NULL == head){printf("头结点申请失败!\n");return NULL;}head->text.len = 0;head->next = NULL;return head;
}
//头插法
int  insertHead_linlist(linklist *head,dataType num)
{//创建一个新结点linklist* temp = (linklist*)malloc(sizeof(linklist));if(NULL == temp){printf("创建失败!\n");return 0;}temp->text.data = num;temp->next = NULL;//头插法插入数据temp->next = head->next;head->next = temp;return 0;
}//遍历链表void show_linklist(linklist* head)
{linklist *p = head;while(p->next != NULL){p = p->next;printf("%d ",p->text.data);}printf("\n");//更新头结点中记录的链表长度head->text.len++;return;
}//尾插法
int insertTail_linlist(linklist* head,dataType num)
{linklist* temp = (linklist*)malloc(sizeof(linklist));if(NULL == temp){printf("创建失败!\n");return 0;}//初始化新结点temp->next = NULL;temp->text.data = num;linklist* p = head;while(p->next != NULL){p = p->next;}p->next = temp;temp->next = NULL;head->text.len++;return 0;
}
//判空
int isEmpty_linlist(linklist* head)
{return head->next == NULL?1:0;
}//头删
dataType delHead_linlist(linklist* head)
{if(isEmpty_linlist(head)){printf("链表为空!");return (dataType)0;}linklist* temp = head->next;head->next = head->next->next;dataType num = temp->text.data;free(temp);temp = NULL;head->text.len--;return num;
}//尾删
dataType delTail_linlist(linklist* head)
{if(isEmpty_linlist(head)){printf("链表为空!");return (dataType)0;}linklist* p = head;linklist* temp;while(p->next != NULL)   //p->next->next != NULL{temp = p;p = p->next;}temp->next=temp->next->next;free(p);    //free(temp->next)p = NULL;   //temp->next = NULLhead->text.len--;return 0;}//按位置插入
void insert_location_linlist(linklist *head,dataType index,dataType num)
{if(index<1 || index >head->text.len+1){printf("位置非法!");return;}int i;linklist* temp=head;linklist* p = (linklist*)malloc(sizeof(linklist));if(NULL == p){printf("插入失败!\n");return ;}//初始化新结点p->text.data = num;p->next = NULL;for(i=0;i<index-1;i++){temp = temp->next;}p->next = temp->next;temp->next = p;head->text.len++;return;}//按位置删除
void del_location_linlist(linklist* head,dataType index)
{if(isEmpty_linlist(head)){printf("链表为空!");return;}linklist* temp = head;for(int i=0;i<index-1;i++){temp = temp->next;}linklist* p = temp->next;temp->next = temp->next->next;free(p);p = NULL;head->text.len--;return;}//按位置查找
void find_location_linlist(linklist* head,dataType index)
{linklist* temp = head;for(int i=0;i<index;i++){temp = temp->next;}printf("%d\n",temp->text.data);head->text.len++;return;}//直接插入排序
void insert_sort_linlist(linklist* head,dataType num)
{linklist* p = head;int sum=0;while(p != NULL){sum++;p = p->next;}linklist* temp = head;for(int i=0;i<sum;i++){linklist* q = temp;while(q->next != NULL){if(q->text.data > q->next->text.data){int tem = q->text.data;q->text.data = q->next->text.data;q->next->text.data = tem;}q = q->next;}}int t=0;linklist* temp2 = head;for(int j=0;j<sum;j++){if(num > temp2->text.data){t++;}temp2 = temp2->next;}//按位置插入insert_location_linlist(head,t,num);}//链表翻转
void  reversal_linlist(linklist* head)
{linklist *p;linklist *q;p=head->next;head->next=NULL;while(p!=NULL){q=p;p=p->next;q->next=head->next;head->next=q;}
}
//快慢指针查找中间节点位置                    
void middleNode_linklist(linklist* head)      
{if(isEmpty_linlist(head)){printf("链表为空!");return;}                                         linklist *low,*fast;low = head->next;fast = head->next;                        while(fast != NULL && fast->next != NULL){low = low->next;                      fast = fast->next->next;}printf("low = %d\n",low->text.data);return;
} 

linklist.h

#ifndef __LINKLIDT_H__
#define __LINKLIDT_H__typedef int dataType;union msg{dataType data;int len;
};
typedef struct node
{struct node* next;union msg text; 
}linklist;linklist* create_linklist(void);
int  insertHead_linlist(linklist *head,dataType num);
void show_linklist(linklist* head);
int insertTail_linlist(linklist* head,dataType num);
dataType delHead_linlist(linklist* head);
dataType delTail_linlist(linklist* head);
void insert_location_linlist(linklist *head,dataType index,dataType num);
void del_location_linlist(linklist* head,dataType index);
void find_location_linlist(linklist* head,dataType index);
void insert_sort_linlist(linklist* head,dataType num);
void reversal_linlist(linklist* head);
void middleNode_linklist(linklist* head)
#endif

main.c

#include <stdio.h>
#include "./linklist.h"
int main(int argc, const char *argv[])
{linklist* head =  create_linklist();insertHead_linlist(head,11);insertHead_linlist(head,24);insertHead_linlist(head,46);insertHead_linlist(head,28);insertHead_linlist(head,18);
//	show_linklist(head);insertTail_linlist(head,36);insertTail_linlist(head,27);insertTail_linlist(head,30);show_linklist(head);/*	dataType num = 0;num = delHead_linlist(head);show_linklist(head);num = delHead_linlist(head);show_linklist(head);num = delTail_linlist(head);show_linklist(head);num = delTail_linlist(head);show_linklist(head);
*/	/*	insert_location_linlist(head,1,111);insert_location_linlist(head,5,555);insert_location_linlist(head,8,888);show_linklist(head);
*/	
/*	del_location_linlist(head,2);show_linklist(head);
*/
/*	find_location_linlist(head,1);find_location_linlist(head,3);find_location_linlist(head,8);
*/insert_sort_linlist(head,22);show_linklist(head);reversal_linlist(head);show_linklist(head);middleNode_linklist(head)return 0;
}  

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

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

相关文章

应用回归分析:非参数回归

非参数回归是一种统计方法&#xff0c;它在建模和分析数据时不假设固定的模型形式。与传统的参数回归模型不同&#xff0c;如线性回归和多项式回归&#xff0c;非参数回归不需要预先定义模型的结构&#xff08;例如&#xff0c;模型是否为线性或多项式&#xff09;。这使得非参…

[面试] 如何保证Redis和MySQL数据一致性?

为什么要在Redis存数据 Redis 用来实现应用和数据库之间读操作的缓存层&#xff0c;主要目的是减少数据 库 IO&#xff0c;还可以提升数据的 IO 性能。 因为Redis基于内存, 查询效率比MySQL快很多, 所以有限查询Redis中的数据,如果Redis没有就查询数据库然后同步到Redis 出…

低代码与大语言模型的探索实践

低代码系列文章&#xff1a; 可视化拖拽组件库一些技术要点原理分析可视化拖拽组件库一些技术要点原理分析&#xff08;二&#xff09;可视化拖拽组件库一些技术要点原理分析&#xff08;三&#xff09;可视化拖拽组件库一些技术要点原理分析&#xff08;四&#xff09;低代码…

1978-2021年全国及31省市农业机械总动力(万千瓦)

1978-2021年全国及31省市农业机械总动力&#xff08;万千瓦&#xff09; 1、时间&#xff1a;1978-2020年 2、范围&#xff1a;31省 3、来源&#xff1a;各省NJ 农业统计NJ 4、缺失情况&#xff1a;无缺失 5、指标&#xff1a;农业机械总动力 6、指标解释&#xff1a; 农…

每日五道java面试题之spring篇(二)

目录&#xff1a; 第一题 Spring事务传播机制第二题 Spring事务什么时候会失效?第三题 什么是bean的⾃动装配&#xff0c;有哪些⽅式&#xff1f;第四题 Spring中的Bean创建的⽣命周期有哪些步骤&#xff1f;第五题 Spring中Bean是线程安全的吗&#xff1f; 第一题 Spring事务…

LeetCode 448.找到所有数组中消失的数字

目录 1.题目 2.代码及思路 3.进阶 3.1题目 3.2代码及思路 1.题目 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&am…

Redis中的rdb和aof

Redis中的rdb和aof 持久化流程RDB机制redis.conf中rdb的配置save bgsave 自动化 rdb触发的三种方式save 命令bgsave命令自动触发 rdb的优势劣势 AOFaof原理aof配置文件重写原理aof的三种触发机制 appendfsyncaof fix工具 redis-check-aof练习aofaof的优缺点 redis是一个内存数据…

try catch执行return的区别

在Java&#xff08;或类似的语言&#xff09;中&#xff0c;try-catch 块是用于异常处理的结构&#xff0c;而 return 语句用于从方法中返回值。当它们结合使用时&#xff0c;会有一些行为上的差异。 try-catch 块&#xff1a; try-catch 块用于捕获可能会在 try 代码块中抛出的…

一年级英语单元测试

起因 小孩读一年级的&#xff0c;期末想复习下之前的英语听力单元测试。在网上找了一圈没有找到资源。干脆自己用扫描王&#xff0c;把自己手上纸质的扫描后&#xff0c;擦除答题痕迹。 硬货 下述链接是整理后的资源&#xff0c;包括试卷和听力录音。是上海教育出版社的版本。需…

java——IO流基础

目录 IO流IO流的四大分类&#xff1a;IO流的体系&#xff1a;FileinputStream&#xff08;文件字节输入流&#xff09;FileOutputStream(文件字节输出流&#xff09;文件复制资源释放FileReader&#xff08;文件字符输入流&#xff09;FileWriter(文件字符输出流&#xff09;缓…

Python实战: 获取 后缀名(扩展名) 或 文件名

Python实战: 获取 后缀名(扩展名) 或 文件名 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅和支持~ &…

mysql 事务详解一

前言 提到事务&#xff0c;大家肯定不陌生。在我们现实生活中也是存在的&#xff0c;比如我们去超市购物&#xff0c;然后去支付。虽然是两个步骤&#xff0c;必须保证同时成功&#xff0c;这个交易才可以完成。 如果这个场景&#xff0c;拿到我们购物系统&#xff0c;就是几…

VirtualBox+Vagrant安装linux

一、VirtualBox安装 VirtualBox官网&#xff1a;Oracle VM VirtualBox 这里采用VirtualBox--7.0.0 版本 二、Vagrant安装 Vagrant官网&#xff1a;Vagrant by HashiCorp Vagrant镜像仓库&#xff1a;Discover Vagrant Boxes - Vagrant Cloud 这里采用Vagrant--2.4.1版本 在…

神经网络系列---权重初始化方法

文章目录 权重初始化方法Xavier初始化&#xff08;Xavier initialization&#xff09;Kaiming初始化&#xff0c;也称为He初始化LeCun 初始化正态分布与均匀分布Orthogonal InitializationSparse Initializationn_in和n_out代码实现 权重初始化方法 Xavier初始化&#xff08;X…

关于uniapp H5应用无法在触摸屏正常显示的处理办法

关于uniapp H5应用无法在触摸屏正常显示的处理办法 1、问题2、处理3、建议 1、问题 前几天&#xff0c; 客户反馈在安卓触摸大屏上无法正确打开web系统&#xff08;uni-app vue3开发的h5 应用&#xff09;&#xff0c;有些页面显示不出内容。该应用在 pc 端和手机端都可以正常…

【递归版】归并排序算法(1)

目录 MergeSort归并排序 整体思想 图解分析 代码实现 时间复杂度 递归&归并排序VS快速排序 MergeSort归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法&#xff08;Divide and Conquer&a…

元宇宙与大模型的关系

元宇宙与大模型之间存在密切的关系&#xff0c;它们可以相辅相成&#xff0c;共同构建一个更加复杂、真实和全面的虚拟世界。 元宇宙的概念&#xff1a;元宇宙是一个包容性的虚拟世界&#xff0c;涵盖了虚拟现实、增强现实和混合现实等多种技术&#xff0c;以及人工智能、区块…

Golang性能分析神器:pprof与火焰图实战揭秘

文章目录 性能分析的重要性性能分析的维度 pprof简介pprof的作用pprof的工作原理 使用pprof进行性能分析采样方式数据分析实战案例火焰图 深入理解pprof的采样机制CPU采样如何启动CPU采样 Goroutine采样如何启动Goroutine采样 内存采样如何启动内存采样 阻塞和锁竞争采样如何启…

Linux第65步_学习“Makefie”

学习“Makefie”&#xff0c;为后期学习linux驱动开发做铺垫。 1、在“/home/zgq/linux/atk-mp1”创建一个“Test_MakeFile”目录用于学习“Makefie”。 打开终端 输入“cd /home/zgq/linux/回车”&#xff0c;切换到“/home/zgq/linux/”目录 输入“mkdir Linux_Drivers回…

window: C++ 获取自己写的dll的地址

我自己用C写了一个插件,插件是dll形式的,我的插件式在dll的目录下有个config文件夹,里面是我用json写的插件配置文件,当插件运行的时候我需要读取到json配置文件,所有最重要的就是如何获取dll的路径. 大概就是这么个结构, 我自己封装了一个函数.只适用于window编程,因为里面用…