【数据结构实验】单链表实验

2023-11-04

实验一 单链表实验

1.实验目的

熟悉单链表的定义,单链表的建立方法及相关基本操作,理解单链表的基本思想,能够根据实际情况选择合适的存储结构。

2.实验内容

1、利用头插法或尾插法建立单链表
2、对已建立的单链表实现插入、删除等基本操作;
3、输出链表所有结点数据
4、编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表并计算表长。

3.正文部分

①什么是链表?

本来结构体之间是没有关系的,结构体指针指向毫不相干的三个数据,但是我们让后一个结构体的首地址与前一个结构体的尾部连接起来,形成的链状结构就是链表。简单来说,链表是结构体变量与结构变量通过指针连接在一起的数据结构。

image-20220401112352500

对应下来就是这样(以静态链表为例):

struct Node {
	int data;          //数据域
	struct Node* next  //指针域
};

int main()
{
	//创建结构体
	struct Node Node1 = { 1,NULL };  //数据为1,传递指针为空
	struct Node Node2 = { 2,NULL };
	struct Node Node3 = { 3,NULL };
	//将结构体连接起来(静态链表)
	Node1.next = &Node2;  //Node1的首地址连接到Node2上
	Node2.next = &Node3;
	return 0;
}
②如何动态创建一个动态链表?

动态内存申请+模块化设计

  • 1.创建链表(创建一个表头表示整个链表)
  • 2.创建结点
  • 3.插入结点
  • 4.删除结点
  • 5.打印遍历链表(测试)

image-20220401115343087

③malloc()函数

malloc函数用来动态地分配内存空间,其原型为void* malloc(size_t size);

它在堆区分配一块指定大小的内存空间以用来存放数据。这一块内存空间在函数执行完成后不会被初始化,他们的值是未知的。若分配成功会返回指向该内存的地址,失败则返回NULL。

函数的返回值类型是void*,所以在使用此函数的时候通常需要进行强制类型转换,将void指针转换成我们希望的类型。

#include<stdio.h>
#include<stdlib.h>
struct Node {
	int data;          //数据域
	struct Node* next  //指针域
};
struct Node* createList()//创建链表
{
	//用指针创建链表表头  让headNode成为结构体变量
	struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
	//变量使用前必须被初始化
	headNode->data = 1;
	headNode->next = 1;
}
struct Node* createNode(int data)//创建结点
{
	struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
	newNode->data = data;
	newNode->next = NULL;

}
int main()
{
	struct Node* list = createList();//创建链表

	system("pause");
	return 0;
}
④建立单链表
头插法:按结点的逆序方法逐渐将结点插入到链表的头部。

image-20220401161150502

//头插法插入结点,
void insertNodeByHead(struct Node* headNode, int data)
{
	//创建插入的结点
	struct Node* newNode = createNode(data);
	newNode->next = headNode->next;//新的结点指向原来表头的下一个
	headNode->next = newNode;//原来表头的下一个指向新的结点
}

尾插法:按结点的顺序逐渐将结点插入到链表的尾部。
//尾插法插入结点
void insertNodeByTail(struct Node* headNode, int data)
{
	struct Node* newNode = createNode(data);
	struct Node* posNode = headNode;
	while (posNode->next != NULL)
	{
		posNode = posNode->next;
	}
	posNode->next = newNode;
}
⑤打印链表

image-20220401131812701

打印链表从表头后的第一个节点开始打印,创建一个pMove指针,每打印完一个结点往下移动一个。

void printList(struct Node* headNode)
{
	struct Node* pMove = headNode->next;
	while (pMove)
	{
		printf("%d", pMove->data);
		pMove = pMove->next;
	}
	printf("\n");
}
⑥链表的删除(指定位置删除)

将问题进行转换,指定结点的删除问题可以转换为指定结点的前一个结点跳过指定节点指向指定结点的下一个结点。

image-20220401164617036

free()函数:用来释放动态分配的内存空间,其原型为

void free(void*ptr);

删除结点的函数如下:

void deleteNodeByAppoin(struct Node* headNode, int posData)//删除指定结点
{
	struct Node* posNode = headNode->next;//指定位置从表头的下一个找
	struct Node* posNodeFront = headNode;//从表头开始找(因为要在指定位置的前一个)
	if (posNode == NULL)
		printf("无法删除空链表\n");
	while (posNode->data != posData)//当指针指向的数据不等于目标数据时
	{
		posNodeFront = posNode;//指针继续往后查找目标数据
		posNode = posNodeFront->next;
		if (posNode == NULL)//找到了表尾都没找到
		{
			printf("没找到相关信息,无法删除\n");
			return;
		}
	}
	posNodeFront->next = posNode->next;//前面结点的next指向后面结点的next
	free(posNode);
}
⑦完整代码

完整源码下载:数据结构——单链表实验

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

【数据结构实验】单链表实验 的相关文章

  • VS2019环境下C++配置环境/创建动态链接库

    文章目录 前言 一 配置环境 0 准备 1 添加项目表 2 include文件与lib文件的配置 include文件设置 lib文件配置 二 使用已有代码生成动态链接库 前言 最近有一个收尾的项目分到了手里 由于基本没有使用过VS2019所
  • linux内核oops错误码说明,Linux Kernel Oops异常分析

    0 linux内核异常常用分析方法 异常地址是否在0附近 确认是否是空指针解引用问题 异常地址是否在iomem映射区 确认是否是设备访问总线异常问题 如PCI异常导致的地址访问异常 异常地址是否在stack附近 如果相邻 要考虑是否被踩 比
  • 验证尼科彻斯定理

    验证尼科彻斯定理 即 任何一个整数的立方都可以写成一串连续奇数的和 问题分析与算法设计 本题是一个定理 我们先来证明它是成立的 对于任一正整数a 不论a是奇数还是偶数 整数 a a a 1 必然为奇数 构造一个等差数列 数列的首项为 a a
  • SVN迁移至GIT,并附带历史提交记录

    文章目录 SVN代码同步至GIT 背景 准备工作 操作步骤 SVN代码同步至GIT 背景 近年随着信息工程的多元化发展 GIT逐渐取代SVN成为主流的版本管理工具 部门的项目代码也决定迁移至git进行管理 所以就调研了一下具体的实现方案 要

随机推荐

  • linux创建git仓库

    1 安装 yum install y git 2 查看 Git 版本 git version 3 查看有没有git用户 id git 没有用户创建 useradd git 设置密码 passwd git 删除密码 passwd d f gi
  • Tomcat配置远程调试端口

    1 Linxu系统 bin startup sh开始处中增加如下内容 Java代码 declare x CATALINA OPTS server Xdebug Xnoagent Djava compiler NONE Xrunjdwp tr
  • JVM系列-第10章-垃圾回收概述和相关算法

    文章目录 toc 垃圾回收概述 大厂面试题 蚂蚁金服 百度 天猫 滴滴 京东 阿里 字节跳动 什么是垃圾 为什么需要GC 早期垃圾回收 Java 垃圾回收机制 自动内存管理 应该关心哪些区域的回收 垃圾回收相关算法 标记阶段 引用计数算法
  • Python实现选择排序

    选择排序简介 选择排序 Selection sort 是一种简单直观的排序算法 简单来说就是从无序队列里面挑选最小的元素 和无序队列头部元素替换 放到有序队列中 最终全部元素形成一个有序的队列 选择排序原理 首先在未排序序列中找到最小 大
  • tomcat的启动流程及原理

    组件介绍 Tomcat 最重要的是两个组件是 Connector 连接器 和 Container 容器 集装箱 Connector 组件是可以被替换 这样可以提供给服务器设计者更多的选择 因为这个组件是如此重要 不仅跟服务器的设计的本身 而
  • 当我遵循了这 16 条规范写代码,同事只对我说了三个字: 666

    作者 涛姐涛哥 链接 cnblogs com taojietaoge p 11575376 html 如何更规范化编写Java 代码 Many of the happiest people are those who own the lea
  • CTFshow 信息收集 web18

    根据提示 不要着急 休息 休息一会儿 玩101分给你flag 打开是一个小游戏 要么玩到101分 要么直接作弊 查看源代码 发现js文件 里面发现有个score 0 只要它为101就应该能得到flag了吧 ctrl F搜索score在最底下
  • vue 报错error: 'ev' is defined but never used (no-unused-vars)

    我要做的是用vue在网页上显示一个button 报错信息 修改 没有在components中调用
  • MyBatis-plus 提示 Data truncation: Out of range value for column ‘id‘ at row 1

    记录一下MyBatis plus 提示的错误信息 Error updating database Cause com mysql cj jdbc exceptions MysqlDataTruncation Data truncation
  • Tcpdump命令详解

    目录 一 tcpdump作用 二 tcpdump命令选项和捕获主机到主机的数据包 2 1 命令选项 2 2 tcpdump表达式 关于数据类型的关键字 数据传输方向的关键字 协议关键字 其他关键字 2 3 tcpdump捕获方式 编辑 一
  • 概率论与数理统计 (二)计算题和应用题

    概率论一些知识 https blog csdn net zuoyonggang123 article details 79110916 utm medium distribute pc relevant none task blog OPE
  • 写函数,判断用户传入的参数(字符串、列表、元组)长度是否大于5

    def estimateLength data if len data gt 5 print 该参数长度大于5 else print 该参数长度不大于5 str xiao ran list 12 34 56 78 90 tuple 小灰灰
  • 【算法】高精度算法:加减乘除(全)

    看的视频在这里 题目 加法 减法 乘法 除法 高 低 加法 思想 用数组模拟高精度 算法核心 c i a i b i c i 1 c i 10 c i c i 10 注意 是c i a i b i 是累加 例题 求a b a b范围都 lt
  • 学前STEM课堂的3个入口

    在STEM活动开始前 教师要以观察性问题来吸引幼儿的注意力 引导幼儿关注 是什么 的问题 进而促使幼儿与教师开始对话和一起探索 格物斯坦小坦克带大家一起看看学前stem课堂的3个入口 是什么 的问题关注的是正发生于幼儿眼前的事情 即幼儿所注
  • 通过GetVersionEx和ntoskrnl.exe获取操作系统版本号

    include
  • selenium启动Chrome配置参数问题

    每次当selenium启动chrome浏览器的时候 chrome浏览器很干净 没有插件 没有收藏 没有历史记录 这是因为selenium在启动chrome时为了保证最快的运行效率 启动了一个裸浏览器 这就是为什么需要配置参数的原因 但是有些
  • PageHelper原理深度剖析(集成+源码)

    相信大家在开发过程中都用到过数据分页吧 那么问题来了 说出你平时用到的几种分页方式吧 而我在平时的工作中用到最多的应该属PageHelper这个分页插件了 此处附上官网地址 https pagehelper github io 首先我们来说
  • 自定义结构-Tab切换

    自定义结构 Tab切换 前言 在搭建页面的时候 可能会需要多块区域进行tab切换 这时候需要规范化封装一个结构 只需要一段js 可重复且多处使用 1 tab样式 2 js代码 function hover change on mouseen
  • 微信、微博、Facebook、Twitter等社交媒体分享方案探索

    一 Web方式 新浪微博 http service weibo com share share php count 表示是否显示当前页面被分享数量 1显示 可选 允许为空 url 将页面地址转成短域名 并显示在内容文字后面 可选 允许为空
  • 【数据结构实验】单链表实验

    实验一 单链表实验 1 实验目的 熟悉单链表的定义 单链表的建立方法及相关基本操作 理解单链表的基本思想 能够根据实际情况选择合适的存储结构 2 实验内容 1 利用头插法或尾插法建立单链表 2 对已建立的单链表实现插入 删除等基本操作 3