数据结构 / day04 作业

news2024/11/28 14:48:30

1. 单链表任意位置删除, 单链表任意位置修改, 单链表任意位置查找, 单链表任意元素查找, 单链表任意元素修改, 单链表任意元素删除, 单链表逆置

// main.c

#include "head.h"

int main(int argc, const char *argv[])
{
	Linklist head=NULL; //head 是头指针
	// printf("head=%p\n", head);
	// printf("head->data=%d\n", head->data);
	// printf("head->next=%p\n", head->next);

	int n;
	int pos;
	int key;
	data_type element;
	printf("please input n:");
	scanf("%d", &n);

	for(int i=0; i<n; i++)
	{
		printf("please input No.%d element: ", i+1);
		scanf("%d", &element);
		head=insert_head(element, head);
	
	}

	puts("---ouput Linklist---");
	output(head);
	

/*
	puts("---get tail node---");
	Linklist node_tail = get_tail_node(head);
	printf("tail->data=%d\n", node_tail->data);

	puts("---append element---");
	printf("please input element to append:");
	scanf("%d", &element);
	head=append(head, element);
	output(head);


	puts("---delete first node---");
	head=delete_first(head);
	head=delete_first(head);
	output(head);

	
	puts("---delete tail node---");
	head=delete_tail(head);
	head=delete_tail(head);
	output(head);

	puts("---get list len---");
	int len=get_len(head);
	printf("len=%d\n", len);

	puts("---insert_by_pos---");
	int pos;
	printf("please input pos: ");
	scanf("%d", &pos);
	printf("please input element: ");
	scanf("%d", &element);
	head=insert_by_pos(head, pos, element);
	output(head);

	puts("---get node by pos---");
	printf("please input pos:");
	scanf("%d", &pos);
	Linklist node  = get_node_by_pos(head, pos);
	printf("node->data=%d\n", node->data);

*/
	puts("---delete node by pos---");
	printf("please input pos:");
	scanf("%d", &pos);
	head = delete_by_pos(head, pos);
	output(head);

	puts("---update node by pos---");
	printf("please input pos:");
	scanf("%d", &pos);
	printf("please element:");
	scanf("%d", &element);
	int ret = update_by_pos(head, pos, element);
	output(head);


	puts("---get node by element---");
	printf("please element:");
	scanf("%d", &element);
	pos = get_node_by_element(head, element);
	printf("pos=%d\n",pos);
//
	puts("---update node by element---");
	printf("please input a key:");
	scanf("%d", &key);
	printf("please input an element:");
	scanf("%d", &element);
	ret = update_node_by_element(head, key, element);
	output(head);
//
	puts("---delete by element---");
	printf("please input element:");
	scanf("%d", &element);
	head = delete_node_by_element(head, element);
	output(head);

	//
	puts("---reverse list---");
	head = revser_list(head);
	output(head);
//


	return 0;
}
//head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

typedef int data_type;

typedef struct Node
{
	int data;
	struct Node *next;

}*Linklist;

Linklist create();

typedef struct Node node;

Linklist create_node();
Linklist insert_head(data_type data, Linklist head);
int output(Linklist head);
Linklist append(Linklist head, data_type element);
Linklist get_tail_node(Linklist head);
Linklist delete_first(Linklist head);
Linklist free_node(Linklist node);
Linklist delete_tail(Linklist head);
int get_len(Linklist head);
Linklist insert_by_pos(Linklist head, int pos, data_type element);
Linklist delete_by_pos(Linklist head, int pos);
Linklist get_node_by_pos(Linklist head, int pos);
int update_by_pos(Linklist head, int pos, data_type element);
int get_node_by_element(Linklist head, data_type key);
Linklist delete_node_by_element(Linklist head, data_type key);
Linklist revser_list(Linklist head);
int update_node_by_element(Linklist head, data_type key, data_type element);
#endif

//test.c

#include "head.h"

Linklist create_node()
{
	Linklist node=(Linklist)malloc(sizeof(struct Node));
	if(NULL==node)
	{
		return NULL;

	}
	//success
	node->data=0;
	node->next=NULL;

	return node;
}

Linklist insert_head(data_type element, Linklist head)
{
	//创建新节点
	Linklist node = create_node();
	if(NULL==node){
		return head;
	}
	node->data=element;

	//判断链表是否位空
	if(NULL==head)
	{
		head=node;

	}
	else //链表不为空
	{
		node->next=head;
		head=node;		
	}
	return head;// 这里的head是形参,所以需要返回用以改变主函数的head
}


int output(Linklist head)
{
	if(NULL==head)
	{
		return -1;
	}

	Linklist node = head;

	while(node!=NULL)
	{
		//printf("data=%d, next=%p\t", node->data, node->next);
		printf("%d\t", node->data);
		node=node->next;

	}
	putchar(10);

}

Linklist get_tail_node(Linklist head)
{

	Linklist node=head;
	while(node->next!=NULL && node!=NULL)
	{
		node=node->next;

	}
	return node;


}


Linklist append(Linklist head, data_type element)
{
	//
	Linklist node = create_node();
	if(NULL==node)
	{
		return head;
	}
	node->data=element;
	node->next=NULL;

	Linklist node_tail=get_tail_node(head);
	if(NULL==node_tail)
	{
		head = node;
	}

	node_tail->next = node;	

	return	head;

}

Linklist free_node(Linklist node)
{
	free(node);
	node=NULL;
	return node;

}


Linklist delete_first(Linklist head)
{
	if(NULL==head)
	{
		return head;
	}

	Linklist node_deleted = head;

	head=head->next;

	node_deleted = free_node(node_deleted);

	return head;

}

Linklist delete_tail(Linklist head)
{
	if(NULL==head)
	{
		return head;
	}

	//找到 tail 之前的node
	Linklist node = head;
	if(node->next==NULL)
	{
		head=free_node(node);
		return head;
	}
	while(NULL!=node->next->next)
	{
		node=node->next;
	}

	node->next=free_node(node->next);
	node->next=NULL;
	return head;
}

int get_len(Linklist head)
{
	//puts("in get_len");
	int count=0;
	Linklist node=head;
	while(node!=NULL)
	{
		//printf("len=%d\n", len);
		count++;
		node=node->next;
	}
	return count;

}

Linklist insert_by_pos(Linklist head, int pos, data_type element)
{
	//pos, Linklist pos start from 1 hear
	int len=get_len(head);
	if(pos<1 || pos>len+1)
	{
		return head;

	}

	if(NULL==head || pos==1)
		head=insert_head(element, head);

	else
	{
		//find node at pos
		Linklist node=head;
		for(int i=1; i<pos-1; i++)
		{
			node=node->next;
		}
		printf("node(pos-1)->data=%d", node->data);

		//create new node
		Linklist node_new= create_node();
		if(NULL==node_new)
		{
			return head;
		}
		node_new->data=element;

		//insert 
		node_new->next=node->next;
		node->next=node_new;
	}
	return head;
}


Linklist get_node_by_pos(Linklist head,int pos)
{
	if(NULL==head)
	{
		return head;
	}

	int len=get_len(head);
	if(pos<1||pos>len)
	{
		return NULL;
	}

	Linklist node=head;
	int count=1;

	while(count<pos)
	{
		count++;
		node=node->next;
	}

	return node;

}

Linklist delete_by_pos(Linklist head,int pos)
{
	//note: list pos start from 1

	if(NULL==head)
	{
		return head;
	}

	//判断pos合法
	int len=get_len(head);
	if(pos<1 && pos>len) 
	{
		return head;
	}

	if(1==len || 1==pos)
	{
		head=delete_first(head);
	}
	else
	{
		Linklist node = get_node_by_pos(head, pos-1);
		//delete
		Linklist node_tbd = node->next;
		node->next=node->next->next;
		free_node(node_tbd);
		node_tbd=NULL;
	}
	return head;

}


int update_by_pos(Linklist head, int pos, data_type element)
{
	if(NULL==head)
	{
		return -1;
	}

	Linklist node = get_node_by_pos(head, pos);
	if(NULL==node)
		return -1;

	node->data=element;

	return 0;

}

int get_node_by_element(Linklist head, data_type key)
{
	//找到返回pos信息

	if(NULL==head)
	{
		return -1;
	}

	int count=0;
	int is_found=0;
	Linklist node=head;


	while(NULL!=node)
	{
		//printf("node->data=%d\n", node->data);
		count++;
		if(node->data==key)
		{
			is_found=1;
			break;
		}

		node=node->next;

	}

	if(is_found==1)
	{
		return count;
	}
	else
	{
		return -1;
	}
}


Linklist delete_node_by_element(Linklist head, data_type key)
{
	if(NULL==head)
	{
		return head;
	}

	int pos = get_node_by_element(head, key);
	if(-1==pos)
	{
		return head;
	}

	head=delete_by_pos(head, pos);
	return head;

}

Linklist revser_list(Linklist head)
{
	if(NULL==head||NULL==head->next)
	{
		return head;
	}

	Linklist node=head->next;

		head->next=NULL;

	while(NULL!=node)
	{
		Linklist node_t=node;
		node=node->next;

		node_t->next=head;
		head=node_t;
	}
	return head;
}


int update_node_by_element(Linklist head, data_type key, data_type element)
{
	if(NULL==head)
	{
		return -1;
	}

	int pos=get_node_by_element(head, key);
	if(-1==pos)
	{
		return -1;
	}

	int ret=update_by_pos(head, pos, element);
	return ret;

}

运行结果

please input n:7
please input No.1 element: 1
please input No.2 element: 2
please input No.3 element: 3
please input No.4 element: 4
please input No.5 element: 5
please input No.6 element: 6
please input No.7 element: 7
---ouput Linklist---
7	6	5	4	3	2	1	
---delete node by pos---
please input pos:1
6	5	4	3	2	1	
---update node by pos---
please input pos:2
please element:500
6	500	4	3	2	1	
---get node by element---
please element:4
pos=3
---update node by element---
please input a key:4
please input an element:400
6	500	400	3	2	1	
---delete by element---
please input element:2
6	500	400	3	1	
---reverse list---
1	3	400	500	6	

2.思维导图

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

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

相关文章

基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(四)

目录 前言总体设计系统整体结构图系统流程图 运行环境爬虫模型训练实际应用 模块实现1. 数据准备1&#xff09;爬虫下载原始图片2&#xff09;手动筛选图片 2. 数据处理3. 模型训练及保存4. 模型测试1&#xff09;前端2&#xff09;后端 系统测试1. 测试效果2. 模型应用1&#…

极兔快递查询,极兔快递单号查询,对需要的单号记录进行备注

批量查询极兔快递单号的物流信息&#xff0c;对需要的快递单号记录进行备注。 所需工具&#xff1a; 一个【快递批量查询高手】软件 极兔快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左…

redis(Remote Dictionary Service) 底层数据结构

redis 底层数据结构 动态字符串SDS 优点 获取字符串长度的时间复杂度O(1) 支持动态扩容&#xff0c;减少内存分配次数 新字符串小于1M – 新空间为扩展后字符串长度的两倍 1 新字符串大于1M – 新空间为扩展后字符串长度 1M 1. 内存预分配 二进制安全&#xff08;记录了…

java springboot中使用 AOP监听方法执行周期

首先 我们在 pom.xml 中 dependencies标签中加入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>然后 我们随便创建一个类 编写代码如下 package com.ex…

pytorch导出rot90算子至onnx

如何导出rot90算子至onnx 1 背景描述2 等价替换2.1 rot90替换(NCHW)2.2 rot180替换(NCHW)2.3 rot270替换(NCHW) 3 rot导出ONNX 1 背景描述 在部署模型时&#xff0c;如果某些模型中或者前后处理中含有rot90算子&#xff0c;但又希望一起和模型导出onnx时&#xff0c;可能会遇到…

YOLOv5轻量化改进之mobilenetv3,更换mobilenetv3中的注意力机制。

目录 一、原理 二、代码 三、YOLOv5改进 一、原理 我们提出了基于互补搜索技术和新颖架构设计相结合的下一代mobilenet。MobileNetV3通过硬件网络架构搜索(NAS)和NetAdapt算法的结合来调整到移动电话cpu,然后通过新的架构进步进行改进。本文开始探索自动搜索算法和网络设计如…

Java新建项目如何整理项目结构,没有src文件夹

现在IDEA2023中新建项目时, 不会有src文件夹。这时需要自己创建一个src的包&#xff0c;然后将这个包设置为source root。 可能出现没有这个选项的情况&#xff0c;这是需要把设置的当前项目首先Unmark了&#xff0c;然后再对src文件夹mark一下。 src: 这是源代码的根目录。 …

Self Distillation 自蒸馏论文解读

paper&#xff1a;Be Your Own Teacher: Improve the Performance of Convolutional Neural Networks via Self Distillation official implementation&#xff1a; https://github.com/luanyunteng/pytorch-be-your-own-teacher 前言 知识蒸馏作为一种流行的压缩方法&#…

与Windows 10更新大同小异!一步一步教你如何更新Windows 11

如果你想让你的Windows 11设备获得最佳性能&#xff0c;那么定期更新是至关重要的。即使是最好的电脑如果不更新也会受到影响&#xff0c;因为更新会应用软件调整&#xff0c;帮助你的设备更快、更平稳地运行。它还提高了安全性&#xff0c;意味着你可以从Microsoft的最新功能中…

自动驾驶学习笔记(十一)——高精地图

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 高精地图 地图采集 底图制作 地图…

OpenFeign入门

OpenFeign是Spring Cloud OpenFeign&#xff0c;是Spring Cloud团队开发的基于Feign的框架 1、OpenFeign功能升级 OpenFeign在Feign的基础上提供了以下增强和扩展功能 &#xff08;1&#xff09;便于集成Spring Cloud组件&#xff1a;OpenFeign与Spring Cloud其他组件&#…

TCP/IP协议、三次握手、四次挥手

TCP/IP TCP/IP协议分层TCP头部三次握手TCP四次挥手常见问题1、什么是TCP网络分层2、TCP为什么是三次握手&#xff0c;不是两次或者四次&#xff1f;3、TCP为什么是四次挥手&#xff0c;为什么不能是三次挥手将第二次挥手和第三次挥手合并&#xff1f;4、四次挥手时为什么TIME_W…

汽车电子 - UDS

汽车电子 - UDS 概念基本概念分类请求与响应寻址信息物理寻址功能寻址 协议格式&#xff1f;&#xff1f;&#xff1f;750/758厂家自定义的吗&#xff1f;&#xff1f;&#xff1f;&#xff0c; 所有的UDS服务都在这里边吗&#xff1f;&#xff1f;&#xff1f;&#xff0c;代码…

Redis-缓存设计

缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c; 缓存层和存储层都不会命中&#xff0c; 通常出于容错的考虑&#xff0c; 如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c; 失去了缓存保护后端存储的…

Linux:docker容器操作(4)

docker的基础操作 Linux&#xff1a;docker基础操作&#xff08;3&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/134616198?spm1001.2014.3001.5501 我这里准备了两个镜像 镜像加载到容器 docker create [选项] 镜像 运行的程序 -i 让容器的标准输…

基于单片机的可升降助眠婴儿床(论文+源码)

1.系统设计 本课题为基于单片机的可升降助眠婴儿床系统&#xff0c;在设计目标上确定如下&#xff1a; 1. 可以实现婴儿床的升降&#xff0c;摇床功能控制&#xff1b; 2. 具有音乐播放功能&#xff0c;并且有多首曲目&#xff1b; 3. 用户可以通过按键或者红外遥控&#x…

6.12找树左下角的值(LC513-M)

算法&#xff1a; 这道题适合用迭代法&#xff0c;层序遍历&#xff1a;按层遍历&#xff0c;每次把每层最左边的值保存、更新到result里面。 看看Java怎么实现层序遍历的&#xff08;用队列&#xff09;&#xff1a; /*** Definition for a binary tree node.* public clas…

openpnp - 给底部相机加防尘罩

文章目录 openpnp - 给底部相机加防尘罩概述笔记END openpnp - 给底部相机加防尘罩 概述 设备标定完, 看着底部相机, 有点担心掉进去东西, 万一从吸嘴掉下去的料(或者清理设备台面时, 不小心掉进去东西)将顶部相机搞短路怎么办. 就想加个防尘罩, 如果有东西掉进去, 可以掉到机…

【机器学习 | 开山篇】打造坚实基础、Kaggle 登榜之路

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…