数据结构 / day04 作业

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.mfbz.cn/a/193669.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ClickHouse中的物化视图

技术主题 技术原理 物化视图&#xff08;Materialized View&#xff09;是一种预先计算并缓存结果的视图&#xff0c;存储在磁盘上自动更新&#xff0c;空间换时间的思路。物化视图是一种优化技术&#xff0c;本质上就是为了加速查询操作&#xff0c;降低系统负载&#xff0c…

Java远程连接本地开源分布式搜索引擎ElasticSearch

文章目录 前言1. Windows 安装 Cpolar2. 创建Elasticsearch公网连接地址3. 远程连接Elasticsearch4. 设置固定二级子域名 前言 简单几步,结合Cpolar内网穿透工具实现Java远程连接操作本地Elasticsearch。 什么是elasticsearch&#xff1f;一个开源的分布式搜索引擎&#xff0…

第1章 爬虫基础

目录 1. HTTP 基本原理1.1 URI 和 URL1.2 HTTP 和 HTTPS1.3 请求1.3.1 请求方法1.3.2 请求的网址1.3.3 请求头1.3.4 请求体 1.4 响应1.4.1 响应状态码1.4.2 响应头1.4.3 响应体 2. Web 网页基础2.1 网页的组成2.1.1 HTML2.1.2 CSS2.1.3 JavaScript 2.2 网页的结构2.3 节点树及节…

160 相交链表

解题思路&#xff1a; \qquad 若两个链表a, b相交&#xff0c;则它们之间的区别就仅在于相交节点之前的部分&#xff08;其实任意两个链表最终都会相交&#xff0c;最坏相交于NULL节点&#xff09;。一开始的思路&#xff1a; \qquad\qquad\qquad 1、找到两个链表较长的那个&…

UE5 - 虚幻引擎各模块流程图

来自虚幻官方的一些资料&#xff0c;分享一下&#xff1b; 一些模块的流程图&#xff0c;比如动画模块&#xff1a; 或角色相关流程&#xff1a; 由于图片比较大&#xff0c;上传到了网络&#xff0c;可自取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1BQ2KiuP08c…

【JavaScript框架】2024年需要学习的顶级JavaScript框架:Blitz、SolidJS、Svelte等

如今&#xff0c;Web开发人员面临两大问题。 第一个是如何自动化繁琐的web开发工作。要为标准web应用程序设置一个项目&#xff0c;您必须花费宝贵的时间学习用于常见任务的几个库&#xff0c;如身份验证和数据库处理&#xff0c;并将它们捆绑在一起。第二个问题是如何使网络应…

数据增强让模型更健壮

在做一些图像分类训练任务时,我们经常会遇到一个很尴尬的情况,那就是: 明明训练数据集中有很多可爱猫咪的照片,但是当我们给训练好的模型输入一张戴着头盔的猫咪进行测试时,模型就不认识了,或者说识别精度很低。 很明显,模型的泛化能力太差,难道戴着头盔的猫咪就不是猫…

MATLAB的rvctools工具箱熟悉运动学【机械臂机器人示例】

1、rvctools下载安装 rvctools下载地址&#xff1a;rvctools下载 截图如下&#xff0c;点击红色箭头指示的“Download Shared Folder” 即可下载 下载之后进行解压&#xff0c;解压到D:\MATLAB\toolbox这个工具箱目录&#xff0c;这个安装路径根据自己的情况来选择&#xff0c…

案例030:基于微信小程序的英语学习交流平台

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)

目录 一.什么是泛型 二.Java中为什么要使用泛型 三.泛型的语法 四.泛型类的使用 五.泛型的编译机制&#xff08;擦除机制&#xff09; 六.泛型的上界 一.什么是泛型 泛型&#xff08;Generics&#xff09;是Java SE 5中引入的一个新特性&#xff0c;可以使Java中的类和方…

SpringBoot : ch07 整合websocket

前言 当涉及到在Spring Boot应用程序中整合WebSocket时&#xff0c;我们可以使用Spring框架提供的功能来实现实时双向通信。WebSocket是一种在Web浏览器和服务器之间进行全双工通信的协议&#xff0c;它允许服务器主动向客户端发送消息&#xff0c;而不需要客户端发起请求。 …

23种经典设计模式:单例模式篇(C++)

前言&#xff1a; 博主将从此篇单例模式开始逐一分享23种经典设计模式&#xff0c;并结合C为大家展示实际应用。内容将持续更新&#xff0c;希望大家持续关注与支持。 什么是单例模式&#xff1f; 单例模式是设计模式的一种&#xff08;属于创建型模式 (Creational Pa…

多功能智慧路灯系统整体解决方案介绍

在不改变现有城市景观的前提下&#xff0c;利用现有路灯改造&#xff0c;或新建多功能叁仟智慧路灯的方法&#xff0c;可实现城市无线网络、视频监控、物联传感网络、新能源充电系统、网格信息化管理的全覆盖&#xff0c;有效解决信息化设备选址难、取电难等问题。在目前无线通…

87基于matlab的双卡尔曼滤波算法

基于matlab的双卡尔曼滤波算法。第一步使用了卡尔曼滤波算法&#xff0c;用电池电压来修正SOC&#xff0c;然后将修正后的SOC作为第二个卡尔曼滤波算法的输入&#xff0c;对安时积分法得到的SOC进行修正&#xff0c;最终得到双卡尔曼滤波算法SOC估计值。结合EKF算法和安时积分法…

pytorch实现遥感建筑物提取

如何自动地从高分辨率遥感影像中提取建筑物等人工目标是高分辨率遥感影像处理与理解领域的一个热点与难点问题。本篇文章我们将学习如何使用pytorch实现遥感建筑物的智能提取。 智能提取的流程 基于深度学习的遥感建筑物智能提取&#xff0c;首先需要制作数据集&#xff0c;然后…

【Java数据结构 -- 包装类和泛型】

包装类和泛型 1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱1.4 自动装箱实际上是调用了valueOf&#xff08;&#xff09;1.5 Integer包装类赋值注意点 2 什么是泛型3 引出泛型4 泛型的使用4.1 语法4.2 类型推导 5 裸类型6 泛型如何编译6.1 擦…

C++-继承

一. 继承的概念及定义 1 . 继承的概念 继承(inheritance) 机制是面向对象程序设计 使代码可以复用 的最重要的手段&#xff0c;它允许程序员在 保 持原有类特性的基础上进行扩展 &#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承 呈现了面向对象 程…

亚马逊、eBay店铺如何提升销量转化?掌握测评自养号的技巧

跨境电商随着互联网和物流技术的迅速发展&#xff0c;消费者可以更轻松地借助跨境电商平台在全球范围内进行购物&#xff0c;而提到跨境电商&#xff0c;亚马逊平台是不可忽视。 在竞争激烈的亚马逊市场中&#xff0c;提升销量转化率是每个卖家都追求的目标&#xff0c;高转化…

企业被列入经营异常会有什么后果?

1、工商方面的不良影响 被工商纳入异常吊销营业执照&#xff1a;公司地址异常将会被工商部门纳入经营异常名录&#xff0c;需要及时申请移出&#xff0c;否则会影响正常经营&#xff0c;严重则有被吊销营业执照的风险。 影响企业形象及信誉度&#xff1a;企业间的合作都非常重视…

git报错:error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413

git报错&#xff1a;error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 如图&#xff1a; error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 send-pack: unexpected disconnect while reading sideband packet fatal: th…