数据结构day05(单链表)

news2024/11/18 9:21:37

今日任务:

 思维导图:

实现 代码:(多文件)

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int datatype;

typedef struct Linklist
{
	union {
		int len;
		datatype data;
	};
	struct Linklist* next;
}Node,*NodeP;
NodeP head_create();
NodeP create();
int output(NodeP head);
int tail_insert(NodeP head,datatype data);
int head_insert(NodeP head,datatype data);
int tail_delete(NodeP head);
int head_delete(NodeP head);
int pos_insert(NodeP head,datatype data,int pos);
int pos_delete(NodeP head,int pos);
int pos_update(NodeP head,datatype data,int pos);
int value_index(NodeP head,datatype data);
int value_delete(NodeP head,datatype data);
int inversion(NodeP head);
int free_linklist(NodeP head);
#endif

fun.c

#include "head.h"
/*
 * function:   传参 空指针判定
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int void_point(NodeP p){
	if(NULL==p){
		puts("how dare you give me null point.");
		return -1;
	}
	return 0;
}
/*
 * function:    头结点创建
 * @param [ in] 
 * @param [out] 
 * @return      
 */
NodeP head_create(){
	NodeP head=(NodeP)malloc(sizeof(Node));
	if(head==NULL){
		puts("how dare you give me null place.");
		return NULL;
	}
	head->len=0;
	head->next=NULL;
	return head;
}
/*
 * function:    节点创建
 * @param [ in] 
 * @param [out] 
 * @return      
 */
NodeP create(datatype data){
	NodeP new=(NodeP)malloc(sizeof(Node));
	if(new==NULL){
		puts("how dare you give me null place.");
		return NULL;
	}
	new->data=data;
	new->next=NULL;
	return new;
}
/*
 * function:    输出
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int output(NodeP head){
	if(void_point(head))
		return -1;
	while(head->next!=NULL){
		printf("%d\t",head->next->data);
		head=head->next;
	}
	puts("output done.");
}
/*
 * function:    节点尾插
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int tail_insert(NodeP head,datatype data){
	if(void_point(head))
		return -1;
	//找到尾部节点
	NodeP p=head;
	while(p->next!=NULL)
		p=p->next;
	p->next=create(data);
	head->len++;
	puts("tail insert success.");
	return 0;
}
/*
 * function:    节点头插
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int head_insert(NodeP head,datatype data){
	if(void_point(head))
		return -1;
	NodeP new=create(data);
	new->next=head->next;
	head->next=new;
	head->len++;
	puts("head insert success");
}
/*
 * function:    尾删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int tail_delete(NodeP head){
	if(void_point(head))
		return -1;
	if(head->next==NULL){
		puts("there is no assigment to delete.");
		return -1;
	}
	//找到最后一个节点,free并len--,前一节点指向null
	NodeP p=head;
	while(p->next->next!=NULL)
		p=p->next;
	free(p->next);
	p->next=NULL;
	head->len--;
	puts("tail delete success");
	return 0;
}
/*
 * function:    头删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int head_delete(NodeP head){
	if(void_point(head))
		return -1;
	if(head->next==NULL){
		puts("there is no assigment to delete.");
		return -1;
	}
	NodeP p=head->next;
	free(head->next);
	head->next=p->next;
	p=NULL;
	head->len--;
	puts("head delete success");
	return 0;
}
/*
 * function:    指定位置添加
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int pos_insert(NodeP head,datatype data,int pos){

	if(void_point(head))
		return -1;
	if(pos>head->len+1||pos<1){
		puts("your position is illegal.");
		return -1;
	}
	NodeP p=head;
	while(pos--!=1)
		p=p->next;
	NodeP new=create(data);
	new->next=p->next;
	p->next=new;
	head->len++;
	puts("pos insert success");
}
/*
 * function:    指定位置删除
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int pos_delete(NodeP head,int pos){
	if(void_point(head))
		return -1;
	if(pos<1||pos>head->len){
		puts("your position is illegal.");
		return -1;
	}
	NodeP p=head;
	while(pos--!=1)
		p=p->next;
	NodeP x=p->next;
	p->next=p->next->next;
	free(x);
	x=NULL;
	head->len--;
	puts("pos delete success");
	return 0;
}
/*
 * function:    指定位置修改
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int pos_update(NodeP head,datatype data,int pos){
	if(void_point(head))
		return -1;
	if(pos<1||pos>head->len){
		puts("your position is illegal.");
		return -1;
	}
	NodeP p=head;
	while(pos--)
		p=p->next;
	p->data=data;
	puts("pos update success");
	return 0;
}
/*
 * function:    按值查找下表
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int value_index(NodeP head,datatype data){
	if(void_point(head))
		return -1;
	if(head->len==0){
		puts("linklist is null");
		return -1;
	}
	int index=0;
	NodeP p=head;
	while(p->next!=NULL){
		p=p->next;
		index++;
		if(p->data==data){
			printf("the index your want to find is%d\n",index);
			return index;
		}
	}
	puts("can't find your value");
	return 0;
}
/*
 * function:    按值删除
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int value_delete(NodeP head,datatype data){
	if(void_point(head))
		return -1;
	if(head->len==0){
		puts("linklist is null");
		return -1;
	}
	NodeP p=head;
	while(p->next!=NULL){
		if(p->next->data==data){
			pos_delete(head,value_index(head,data));
			puts("value delete success");
			return 0;
		}
		p=p->next;
	}
	puts("no value your want to delete");
}
/*
 * function:    循环逆置
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int inversion(NodeP head){
	if(void_point(head))
		return -1;
	if(head->len==0){
		puts("linklist is NULL");
		return -1;
	}
	if(head->len==1){
		puts("there is no deed");
		return 0;
	}
	//逆置
	//将第二个节点作为尾节点,但是得先记录一下,还得用于每次循环的头插的第一个元素
	NodeP p=head->next->next;
	head->next->next=NULL;
	//定义一个节点,用于方便循环调用后面的元素头插,
	NodeP k=p;
	puts("debug..");
	output(p);
	while(p!=NULL){
		p=p->next;

		k->next=head->next;
		head->next=k;

		k=p;
	}
	puts("inversion success.");
	return 0;
}
/*
 * function:    释放链表
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int free_linklist(NodeP head){
	if(void_point(head))
		return -1;
	NodeP p=NULL;
	while(head!=NULL){
		p=head;
		head=head->next;
		free(p);
		p=NULL;
	}
	puts("free success.");
	return 0;
}

main.c

#include "head.h"
int main(int argc, const char *argv[])
{
	NodeP p=head_create();
	tail_insert(p,10);
	tail_insert(p,20);
	tail_insert(p,30);
	tail_insert(p,40);
	tail_insert(p,50);
	head_insert(p,99);
	head_insert(p,88);
	output(p);
	//pos_insert(p,66,0);
	//output(p);
	//pos_delete(p,8);
	//output(p);
	//pos_update(p,66,8);
	//output(p);
	//tail_delete(p);
	//output(p);
	//head_delete(p);
	//output(p);
	//value_delete(p,77);
	//output(p);
	//inversion(p);
	//output(p);
	free_linklist(p);
	p=NULL;
	return 0;
}

不好,眼花了,没看到实现单项循环链表,ji

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

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

相关文章

Nuxt3 与 Vue3 的 Server api 全栈开发之路

Nuxt Server Api 阅读时长&#xff1a;15分钟 本文内容&#xff1a; 国内关于Nuxt3的资料太少了&#xff0c;而Nuxt3又发布了没有多久&#xff0c;导致资料太少。本文浓缩讲解了&#xff0c;对于一个前端开发&#xff0c;上手使用 Nuxt3&#xff0c;并一个人承担前后端开发的所…

Hive3第六章:更换引擎

系列文章目录 Hive3第一章&#xff1a;环境安装 Hive3第二章&#xff1a;简单交互 Hive3第三章&#xff1a;DML数据操作 Hive3第三章&#xff1a;DML数据操作(二) Hive3第四章&#xff1a;分区表和分桶表 Hive3第五章&#xff1a;函数 Hive3第六章&#xff1a;更换引擎 文章目…

网络安全—0基础学习笔记(黑客)

一、前言 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多 google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以后再来解决. …

2023年智慧政务一网通办云平台顶层设计与建设方案PPT

导读&#xff1a;原文《2023年智慧政务一网通办云平台顶层设计与建设方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 部分内容&#xff1a; 喜欢文章&#…

Spring——RESTful Web服务

文章目录 RESTful Web 服务介绍内容概览下载 Lombok 优化代码利器RESTful Web 服务开发运行项目并测试效果 RESTful Web 服务介绍 本节我们将开发一个简单的 RESTful Web 服务。 RESTful Web 服务与传统的 MVC 开发一个关键区别是返回给客户端的内容的创建方式&#xff1a;传…

Go操作各大消息队列教程(RabbitMQ、Kafka)

Go操作各大消息队列教程 1 RabbitMQ 1.1 概念 ①基本名词 当前市面上mq的产品很多&#xff0c;比如RabbitMQ、Kafka、ActiveMQ、ZeroMQ和阿里巴巴捐献给Apache的RocketMQ。甚至连redis这种NoSQL都支持MQ的功能。 Broker&#xff1a;表示消息队列服务实体Virtual Host&#x…

感觉车载测试的这一波敏捷风快过去了

敏捷&#xff0c;算不得汽车行业的原生产物&#xff0c;几年前&#xff0c;耳边很少听到这个字眼&#xff0c;基本算是在近几年传统汽车行业开始衰落的大背景下&#xff0c;而后伴随着软件从互联网等行业传进来的。 这两年&#xff0c;大家开始把敏捷谈得风生水起&#xff0c;…

用idea查看sqlite数据库idea sqlite

1、安装Database Navigator插件 2、导入数据库并查看 3、删除数据库连接 在此做个笔记

VUE环境下 CSS3+JS 实现发牌 翻牌

创建牌容器&#xff08;关键点&#xff1a;overflow&#xff1a;hidden&#xff09;&#xff1a; <div class"popup-box"></div> .popup-box {position: absolute;width: 100vw;height: 100vh;top: 0px;left: 0;overflow: hidden; } 创建每一张牌《固…

python+TensorFlow实现人脸识别智能小程序的项目(包含TensorFlow版本与Pytorch版本)(一)

pythonTensorFlow实现人脸识别智能小程序的项目&#xff08;包含TensorFlow版本与Pytorch版本&#xff09;&#xff08;一&#xff09; 一&#xff1a;TensorFlow基础知识内容部分&#xff08;简明扼要&#xff0c;快速适应&#xff09;1、下载Cifar10数据集&#xff0c;并进行…

react17:生命周期函数

挂载时更新时 setState触发更新、父组件重新渲染时触发更新forceUpdate触发更新卸载时 react&#xff08;v17.0.2&#xff09;的生命周期图谱如下。 相较于16版本&#xff0c;17版本生命周期函数有如下变化&#xff1a; componentWillMount() componentWillUpdate() compone…

mac电脑屏幕录制Berrycast Mac屏幕录制软件

Berrycast是一款为Mac设计的优秀屏幕录制软件&#xff0c;它让屏幕录制变得简单而高效。以下是Berrycast的一些主要特点&#xff1a; 简单的用户界面&#xff1a;Berrycast拥有直观和简洁的用户界面&#xff0c;使得用户可以轻松上手。高质量的视频输出&#xff1a;Berrycast能…

电商系统架构设计系列(十):怎么能避免写出慢SQL?

上篇文章中&#xff0c;我给你留了一个思考题&#xff1a;怎么能避免写出慢SQL&#xff1f; 我们知道&#xff0c;一个慢 SQL 就可以直接让 MySQL 瘫痪。以我个人经验总结来看&#xff0c;一般情况下系统出问题&#xff0c;大多数都是因为SQL语句的问题。掌握和用好了SQL&…

软件面试题:文件上传下载测试点

目前关于云文档的业务还是挺多的&#xff0c;相信出去面试的同学&#xff0c;大多会遇到这道高频软件测试面试题&#xff1a;文件上传下载测试点。今天向大家分享下&#xff0c;希望对大家有所启发。 一、文件上传测试点 1、文件大小 一般情况下&#xff0c;系统会设定上传文…

基于OV2640/ OV5640 的图像采集显示系统

基于OV2640/ OV5640 的图像采集显示系统系列文章目录&#xff1a; &#xff08;1&#xff09;基于 OV5640 摄像头理论知识讲解-成像和采样原理 &#xff08;2&#xff09;基于 OV5640 摄像头理论知识讲解-数字接口和控制接口 &#xff08;3&#xff09;基于 OV5640 摄像头理论知…

Mac软件删除方法?如何删除不会有残留

Mac电脑如果有太多无用的应用程序&#xff0c;很有可能会拖垮Mac系统的运行速度。因此&#xff0c;卸载电脑中无用的软件是优化Mac系统运行速度的最佳方式之一。Mac卸载应用程序的方式是和Windows有很大的区别&#xff0c;特别对于Mac新用户来说&#xff0c;如何无残留的卸载删…

Python Qt(七)Listview

源代码&#xff1a; # -*- coding: utf-8 -*-# Form implementation generated from reading ui file qt_listview.ui # # Created by: PyQt5 UI code generator 5.15.9 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not…

2024王道408数据结构P144 T18

2024王道408数据结构P144 T18 思考过程 首先还是先看题目的意思&#xff0c;让我们在中序线索二叉树里查找指定结点在后序的前驱结点&#xff0c;这题有一点难至少对我来说…我讲的不清楚理解一下我做的也有点糊涂。在创建结构体时多两个变量ltag和rtag&#xff0c;当ltag0时…

基于Axios完成前后端分离项目数据交互

一、安装Axios npm i axios -S 封装一个请求工具&#xff1a;request.js import axios from axios// 创建可一个新的axios对象 const request axios.create({baseURL: http://localhost:9090, // 后端的接口地址 ip:porttimeout: 30000 })// request 拦截器 // 可以自请求…

全网首发,人体姿态估计算法在OK3588上部署应用(十三)

一、主机模型转换 采用FastDeploy来部署应用深度学习模型到OK3588板卡上 进入主机Ubuntu的虚拟环境 conda activate ok3588 主机环境搭建可以参考上一篇 《OK3588板卡实现人像抠图&#xff08;十二&#xff09;》 生成onnx文件 cd FastDeploy # 下载Paddle静态图模型并解压…