链表之头插法,尾插法,显示,长度,查找位置(两种),删除;内联函数小记

2023-05-16

# include<stdio.h>
# include<stdlib.h>
using namespace std;

typedef struct node
{
	int data;
	struct node * next;
}Node;
inline int len_list(Node * head)//链表长度
{
	Node* pt = head->next;
	int len = 0;
	while (pt)
	{
		len++;
		pt = pt->next;
	}

#if 0
	while (head->next)
	{
		len++;
		head->next = head->next->next;
	}
#endif
	return len;
}
int search_list(Node * head ,int search_data)//链表查找
{
	int loc = 0;
	int loc1 = 0;
	Node * pt = head->next;
	while (pt)
	{
		if (pt->data == search_data)
		{
			loc = loc1;
		}
		pt = pt->next;
		loc1++;
	}
	if (loc == 0)
	{
		printf("查无此数!!!");
		return -1;
	}
	else
	{
		return loc;
	}
	
}
Node * search_list_Node(Node * head, int search_data)
{
	head = head->next;
	while (head)
	{
		if (head->data == search_data)
			break;
		head = head->next;
	}
	if (head == NULL)
	{
		printf("查无此项!!!\n");
	}
	return head;
}


Node * creat_list_first()//头插法
{
	Node * head = (Node *)malloc(sizeof(Node));
	head->next = NULL;
	Node * cur = NULL;
	int data;
	printf("请输入节点数据:\n");
	scanf("%d", &data);
	while (data)
	{
		cur = (Node *)malloc(sizeof(Node));
		cur->data = data;
		cur->next = head->next;
		head->next = cur;
		scanf("%d", &data);
	}
	return head;
}

Node * creat_list_end()//尾插法
{
	Node * head = (Node*)malloc(sizeof(Node));
	head->next = NULL;
	Node * cur = NULL;
	Node * pt = head;
	int data;
	printf("请输入节点数据:\n");
	scanf("%d", &data);

	while (data)
	{
		cur = (Node *)malloc(sizeof(Node));
		cur->data = data;
		cur->next = NULL;
		pt->next = cur;
		pt = cur;	
		scanf("%d", &data);
	}
	return head;
}
inline void show_list(Node * head)//显示链表
{
	Node * phead = head->next;
	while (phead)
	{
		printf("%d\n", phead->data);
		phead = phead->next;
	}
}
inline void  delete_data(Node*head, int data)
{
	Node * loc_list = search_list_Node(head, data);
	//head = head->next;之所以没有这句是为了保证链表的结构完整性,加上该句的话会使链表丧失头结点
	while (head->next != loc_list) head = head->next;//此处说明是待查找数据的前一项节点;

	head->next = loc_list->next;
	free(loc_list);
	
}


int main()
{
	Node * head = (Node *)malloc(sizeof(Node));
	
	head = creat_list_end();
	show_list(head);

	search_list_Node(head, 4);

	printf("链表长度:%d\n", len_list(head));
	printf("查找数据所在位置:%d\n", search_list(head, 4) + 1);
	delete_data(head, 4);
	show_list(head);
	return 0;
}


链表系列操作(版本2)

# include<stdio.h>
# include<stdlib.h>
# include<time.h>
using namespace std;
typedef struct node
{
	int data;
	struct node * next;
}Node;
inline Node * creat_NULL_list()
{
	Node * head = (Node*)malloc(sizeof(Node));
	head->next = NULL;
	return head;
}
inline void show_list(Node* head)
{
	head = head->next;
	while (head)
	{
		printf("%d\n", head->data);
		head = head->next;
	}
}
//头插法,只要保证,新来的指针有所指向,即可
inline Node * insert_node_first(Node * head, int data)
{
	Node * cur = (Node*)malloc(sizeof(Node));
	cur->next = NULL;
	cur->data = data;
	cur->next = head->next;
	head->next = cur;
	
	return head;
}

//尾插法:保证找到链表尾结点的位置,就能按位插入
Node * insert_node_end(Node * head, int data)
{
	Node * phead = head;
	while (phead->next != NULL) phead = phead->next;//寻找尾结点的地址
	Node * cur = (Node *)malloc(sizeof(Node));
	cur->next = NULL;
	cur->data = data;
	phead->next = cur;
	phead = cur;
	
	return head;
}
int len_list(Node* head)
{
	Node* p = head->next;
	int len = 0;
	while (p)
	{
		len++;
		p = p->next;
	}

	return len;
}
inline Node* find_data(Node* head, int data)
{
	head = head->next;
	while (head->data != data)
	{
		head = head->next;
	}
	return head;
}

Node * delete_node(Node * head, Node * delet_node)
{
	Node * loc = delet_node;//删除节点
	Node * former = head;
	while (former->next != loc) former = former->next;
	former->next = loc->next;
	free(loc);
	return head;
}

int main()
{
	Node * head = creat_NULL_list();
	for (int i = 0; i < 5; i++)
	{
		int data;
		printf("请输入节点数据:\n");
		scanf("%d", &data);
		head = insert_node_end(head, data);
	}
	printf("链表数据为:\n");
	show_list(head);
	printf("共有数据%d个\n", len_list(head));
	printf("删除节点6后的链表:\n");
	head = delete_node(head, find_data(head,6));
	show_list(head);
	return 0;
 }

inline 是c++中特有的内联函数,好处在于可以弥补宏定义缺少的语法检察和语义错误,并且可以消除普通函数的压栈和出栈的内存开销;但过于复杂的函数使用内联函数,会增加代码段的空间,建议在10行代码一下,可以使用!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链表之头插法,尾插法,显示,长度,查找位置(两种),删除;内联函数小记 的相关文章

  • Debian 9/10快速开启Google BBR的方法,实现TCP高效单边加速

    BBR 是谷歌公司的某个员工研发出来的服务器单边加速算法 xff0c Linux内核从4 9版开始集成BBR算法 相比锐速BBR的加速效果更为温和 xff0c 并且占用内存小对服务器压力也很小 xff0c 当时理想情况下是可以跑满整个服务器
  • 基于机器学习的捡球机器人设计与实现(探索)第4篇——机械设计)

    2019 03 18 by 崔斐然 原以为软件很复杂 机械好搞 结果发现 都难搞 一次次想出办法又一次次被自己否定 我tm想静静
  • 人脸识别之Hog特征+SVM分类器训练与使用

    原文来自 xff1a https juejin im post 5b0e70686fb9a00a1451c8e7 计算机视觉 人脸识别 xff08 Hog特征 43 SVM分类器 xff09 一 SVM支持向量机 1 SVM原理 在机器学习
  • python利用PIL实现对图片截图

    在对图像处理时 xff0c 我们有时候需要对图片某区域进行截图 xff0c 话不多说 xff0c 直接上代码 xff1a from PIL import Image import sys 先将 input image 填充为正方形 def
  • PowerMock介绍和用法

    PowerMock PowerMock简介一 PowerMock xff1f 二 Mock底层原理1 Mockito2 PowerMock原理 三 应用场景1 依赖问题 xff0c 打桩 2 工程质量 PowerMock使用步骤一 添加依赖
  • Windows10 WSL2磁盘迁移

    一 使用 WSL 命令行工具 在 Windows 10 版本 1903 xff08 2019 年 4 月更新 xff09 或更高版本中 xff0c 您可以使用wsl exe命令行工具 1 导出分布 使用要移动的分发创建一个 tar文件wsl
  • linux下搭建confluence

    一 Java环境 java环境 二 mysql 2 1 安装前的检查和准备工作 2 1 1检查 1 是否安装过mysql xff1a rpm qa grep mysql 2 如果有的话 xff0c 就删除 xff08 XXXX是自己的mys
  • 译:SOME/IP 技术细节

    译 xff1a SOME IP 技术细节 原文 SOME IP technical details SOME IP Scalable service Oriented MiddlewarE over IP 基于 IP 可扩展面向服务中间件
  • Python requests_toolbelt的使用

    multipart form data Encoder The main attraction is a streaming multipart form data object MultipartEncoder Its API looks
  • ArchLinux中文安装教程

    以自己的电脑安装为参考 xff0c 已安装win10系统 最后效果为win10和arch双系统 xff01 xff01 xff01 一 准备工作 1 按照实际需要划分出一部分空闲磁盘空间 xff0c 右击想要安装arch的分区点击删除卷 x
  • C++20 范围库:关键优势——算法的组合

    从概念上讲 xff0c 范围 xff08 Range xff09 是一个简单的概念 xff1a 它只是一对迭代器 指向序列的开始和结束 xff08 在某些情况下是一个哨兵 xff09 然而 xff0c 这样的抽象却可以从根本上改变编写算法的
  • Drupal菜鸟笔记之使用Focal Point 模块实现图片压缩与裁剪

    在项目开发中总是有地方需要上传图片 xff0c 因此也常常需要对图片进行压缩与裁剪来达到我们想要的效果 最近项目中刚好要用到 xff0c 我就去搜索了 解了下图片的压缩与裁剪模块 xff0c 最后选择了 Focal Point Focal
  • Linux系统学习——ubuntu16.04开机蓝屏问题

    1 蓝屏原因 由于频繁地强制关机等原因造成 xserver xorg包出现损坏 xff0c 故在开机时屏幕显示出现问题 1 1 顺便提一下 xorg xorg 我们知道 xff0c Linux内核本身是没有图形化界面的 xff0c 其本身是
  • 最小生成树 Kruskal算法 Prim算法 洛谷P3366

    最小生成树 Kruskal算法 Prim算法 洛谷P3366 相较于Prim算法 xff0c 我觉得Kruskal算法更优 xff08 因为一般情况 xff0c 题目给你的边数都是正常的 xff0c Kruskal算法的时间复杂度为O El
  • 13. 罗马数字转整数

    题目 罗马数字包含以下七种字符 xff1a I xff0c V xff0c X xff0c L xff
  • 【转载】重新安装Anaconda卡在Loading applications无法进入

    我出现这个问题的原因是 xff1a 之前安装Anaconda没在系统添加路径 xff0c 虽然可以正常使用Pycharm xff0c 但Visual Studio Code 不能调用python 因此在胡老师帮助下 xff0c 决定卸载原来
  • C++语法(三)string字符串的输入、拼接、删除、查找、截取、比较、遍历

    1 字符串的输入 1 输入不含空格的字符串 string str cin gt gt str 2 输入包含空格的字符串 string str 如果前面有了cin输入 xff0c 则还需添加如下一句 getchar getline cin s
  • Python的坑(4) -- 【if x:】的含义

    原文链接 xff1a http www liaoxuefeng com wiki 0014316089557264a6b348958f449949df42a6d3a2e542c000 001431675624710bb20e9734ef34
  • 交叉编译 acl

    交叉编译 acl 概述 访问控制列表 xff08 Access Control Lists xff0c ACL xff09 是应用在路由器接口的指令列表 在 Linux 系统中 xff0c ACL 用于设定用户针对文件的权限 xff0c 而
  • 使用xrdp实现windows 远程桌面连接linux

    之前一直用mstsc连接windows主机 xff0c 今天想用此来连接linux主机时 xff0c 发现 连接不了 xff01 xff01 与度娘亲热好久之后 xff0c 分享一篇博客给大家 xff1a 传送门 一般情况下我们用ssh客户

随机推荐