数据结构-链表的基本操作

前言:

在dotcpp上碰到了一道题,链接放这了,这道题就是让你自己构建一遍链表的创建,插入节点,删除节点,获取节点,输出链表,题目给了几张代码图,不过不用管那些图,按自己的思路写一遍
也是这道题,让我第一次自己完整的去实现了一遍链表,通过题目来学,我一直都觉得效果是非常明显的
在学校老师教的数据结构,那本书是一本黄色外壳的书,不是说这书不好,书里代码采用的C和C++的混用,有的地方他用C实现,有地方他用C++实现,就感觉这对像我这种菜鸟很不友好,这让我自已写时,很容易出现错误,看半天看不出来

题目描述:

链表是数据结构中一种最基本的数据结构,它是用链式存储结构实现的线性表。它较顺序表而言在插入和删除时不必移动其后的元素。现在给你一些整数,然后会频繁地插入和删除其中的某些元素,会在其中某些时候让你查找某个元素或者输出当前链表中所有的元素。
下面给你基本的算法描述:
请添加图片描述
图1:链表类型的定义以及获得链表元素的算法描述
请添加图片描述
图2:链表的插入算法描述
请添加图片描述
图3:链表的删除算法描述
请添加图片描述
图4:链表的创建算法描述

输入格式:

输入数据只有一组,第一行有n+1个整数,第一个整数是这行余下的整数数目n,后面是n个整数。这一行整数是用来初始化列表的,并且输入的顺序与列表中的顺序相反,也就是说如果列表中是1、2、3那么输入的顺序是3、2、1。
第二行有一个整数m,代表下面还有m行。每行有一个字符串,字符串是“get”,“insert”,“delete”,“show”中的一种。如果是“get”或者“delete”,则其后跟着一个整数a,代表获得或者删除第a个元素;如果是“insert”,则其后跟着两个整数a和e,代表在第a个位置前面插入e;“show”之后没有整数。

输出格式

如果获取成功,则输出该元素;如果删除成功则输出“delete OK”;如果获取失败或者删除失败,则输出“get fail”以及“delete fail”。如果插入成功则输出“insert OK”,否则输出“insert fail”。如果是“show”则输出列表中的所有元素,如果列表是空的,则输出“Link list is empty”。注:所有的双引号均不输出。

样例输入:

3 3 2 1
21
show
delete 1
show
delete 2
show
delete 1
show
delete 2
insert 2 5
show
insert 1 5
show
insert 1 7
show
insert 2 5
show
insert 3 6
show
insert 1 8
show
get 2

样例输出:

1 2 3
delete OK
2 3
delete OK
2
delete OK
Link list is empty
delete fail
insert fail
Link list is empty
insert OK
5
insert OK
7 5
insert OK
7 5 5
insert OK
7 5 6 5
insert OK
8 7 5 6 5
7

解题思路:
不必去看那几张图,就依自己的思路写,链表就是结构体变量连起来,也就是结构体变量的成员多了一个指向下一个结构体变量的指针,

  • 题目要求输入的整数,在存入链表时是倒着存入的,也就是要用头插法,头插法也就是一直在头节点h后插入新节点q,主要代码为q->next=h->next; h->next=q;,拓展下,正着存入也就是尾插法,需要增加一个尾指针p,使其始终指向当前链表的尾结点,每插入一个新节点后让p指向这个新节点,主要代码为p->next=q; p=q;
  • 头节点只有指针域,没有数据域, 别看输入输出的规矩这么一大串,写4个if用strcmp函数比对字符串,看调用那个函数,

参考代码:

部分函数我用的是bool类型的,要加上#include<stdbool.h>,也可以用int类型,只要返回值有正确和错误的性质就好

先拆分开解释:

  1. 链表的定义:
typedef struct LNode{int data;//数据域struct LNode *next;//指针域
}LinkList;//定义结构体变量的别称,加个解引符*,*LinkList就是定义结构体指针的别称
  1. 创建链表:
void createList(LinkList *L,int n)//依照题目使用的是头插法
{LinkList *p,*q;p=L;//使p指向头节点//如果在main函数里已经L->next=NULL,就不用在这p->next=NULL,因为是头插法,所以赋空的操作应该在创建节点前,因为头插法没有指向尾节点的指针,尾插法的赋空操作在创建节点后for(int i=0;i<n;i++)//创建n个节点{q=(LinkList*)malloc(sizeof(LinkList));scanf("%d",&q->data);q->next=p->next;//把p节点后续的节点接在q节点后p->next=q;//再把q节点接在p节点后}
}
  1. 在第a个位置前面插入e:
bool insertList(LinkList *L,int a,int e)
{LinkList *p=L,*q;q=(LinkList*)malloc(sizeof(LinkList));q->data=e;//创建一节点存储e,该节点为要插入的节点while(a>1)//a>1是保证p在循环结束后指向第a-1个位置的节点{p=p->next;if(p==NULL)return false;a--;}q->next=p->next;//与头插法原理一样,把p节点后续的节点接在q节点后p->next=q;//把q节点接在p节点后return true;
}
  1. 获得第a个位置的元素,获取成功输出该位置上的元素
bool getList(LinkList *L,int a)
{LinkList *p=L->next;//此时p指向第一个节点,也就是如果a=1的话,即输出p节点的数据域while(a>1)//使p指向第a个位置的节点{p=p->next;if(p==NULL){printf("get fail\n");return false;}a--;}printf("%d\n",p->data);return true;
}
  1. 删除第a个元素
bool deleteList(LinkList *L, int a)
{LinkList *p = L,*q=L->next;//p指向头节点,q指向第一个节点if(q==NULL)//判断链表是否为空return false;while(a>1)//p指向被删除节点的前一个结点,q指向要被删除节点{p=p->next;q=q->next;if(q==NULL)return false;a--;}p->next=q->next;//使p节点跳过q节点指向q节点的下一个节点free(q);//释放q节点占用的空间,也就是删除了return true;
}
  1. 输出链表中所有元素
bool displayList(LinkList *L)
{LinkList *p;p=L->next;if(p==NULL)//判断链表是否为空{printf("Link list is empty\n");return false;}while(p)//输出链表所有元素{printf("%d ",p->data);p=p->next;}printf("\n");return true;
}

以上就为题目用得上的功能函数了

整体代码:
为了main函数看得更美观点,做了些改动

#include<stdio.h>
#include<stdlib.h>//需要这个才能用malloc
#include<string.h>
#include<stdbool.h>//bool
typedef struct LNode{int data;struct LNode *next;
}LinkList;
void createList(LinkList *L,int n)
{LinkList *p,*q;p=L;for(int i=0;i<n;i++){q=(LinkList*)malloc(sizeof(LinkList));scanf("%d",&q->data);q->next=p->next;p->next=q;}}
bool getList(LinkList *L,int a)
{LinkList *p=L->next;while(a>1){p=p->next;if(p==NULL)return false;a--;}printf("%d\n",p->data);return true;
}
bool insertList(LinkList *L,int a,int e)
{LinkList *p=L,*q;q=(LinkList*)malloc(sizeof(LinkList));q->data=e;while(a>1){p=p->next;if(p==NULL)return false;a--;}q->next=p->next;p->next=q;return true;
}
bool deleteList(LinkList *L, int a)
{LinkList *p = L,*q=L->next;if(q==NULL)return false;while(a>1){p=p->next;q=q->next;if(q==NULL)return false;a--;}p->next=q->next;free(q);return true;
}bool displayList(LinkList *L)
{LinkList *p;p=L->next;if(p==NULL)return false;while(p){printf("%d ",p->data);p=p->next;}printf("\n");return true;
}
int main()
{int n;scanf("%d",&n);LinkList *L;L=(LinkList*)malloc(sizeof(LinkList));L->next=NULL;createList(L,n);int m,a,e;char str[10];scanf("%d",&m);for(int i=0;i<m;i++){scanf("%s",str);if(strcmp(str,"show")==0)//将所有操作失败时会输出的信息,放在这些if分支里{if(!displayList(L))printf("Link list is empty\n");}else if(strcmp(str,"delete")==0){scanf("%d",&a);if(deleteList(L,a))printf("delete OK\n");elseprintf("delete fail\n");}else if(strcmp(str,"get")==0){scanf("%d",&a);if(!getList(L,a))printf("get fail\n");}else if(strcmp(str,"insert")==0){scanf("%d%d",&a,&e);if(insertList(L,a,e))printf("insert OK\n");elseprintf("insert fail\n");}}return 0;
}

由于自己对于链表的学习也只是刚刚起步,有错的地方希望大家能够指正(。・ω・。)

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

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

相关文章

STM32一个地址未对齐引起的 HardFault 异常

1. 概述 客户在使用 STM32G070 的时候&#xff0c;KEIL MDK 为编译工具&#xff0c;当编译优化选项设置为Level0 的时候&#xff0c;程序会出现 Hard Fault 异常&#xff0c;而当编译优化选项设置为 Level1 的时候&#xff0c;则程序运行正常。表面上看&#xff0c;这似乎是 K…

ansible-tower安装

特别注意&#xff1a;不需要提前安装ansible&#xff0c;因为ansible tower中的setup.sh脚本会下载对应的ansible版本 ansible tower不支持Ubuntu系统,对cenos系统版本也有一定的限制&#xff0c;建议使用centos7.9。 准备一台全新的机器安装&#xff0c;因为ansible tower需要…

ARMv8-A架构下的外部debug模型(external debug)简介

Armv8-A external debug Armv8-A debug模型一&#xff0c;外部调试 External debug 简介二&#xff0c;Debug state2.1 Debug state的进入与退出 三&#xff0c;DAP&#xff0c;Debug Access Port3.1 EDSCR, External Debug Status and Control Register调试状态标识&#xff0…

Java比较器(comparable) (comparator)

1.前言 我们经常使用&#xff1e;,&#xff1c;,&#xff1d;等运算符来比较数与数之间的大小关系&#xff0c;但显然这些运算符并不同样适用于对象.但如果需要比较对象&#xff0c;那么我们应该怎么办呢&#xff1f; 我们可以考虑两种方法 : (1) 自然排序 (2). 定制排序. 2.自…

Docker搭建LNMP环境实战(07):安装nginx

1、模拟应用场景描述 假设我要搭建一个站点&#xff0c;假设虚拟的域名为&#xff1a;api.test.site&#xff0c;利用docker实现nginxphp-fpmmariadb部署。 2、目录结构 2.1、dockers根目录 由于目前的安装是基于Win10VMWareCentOS虚拟机&#xff0c;同时已经安装了VMWareT…

《2023腾讯云容器和函数计算技术实践精选集》--在 K8s 上跑腾讯云 Serverless 函数,打破传统方式造就新变革

目录 目录 前言 《2023腾讯云容器和函数计算技术实践精选集》带来的思考 1、特色亮点 2、阅读体验 3、实用建议 4、整体评价 Serverless 和 K8s 的优势 1、关于Serverless 函数的特点 2、K8s 的特点 腾讯云 Serverless 函数在 K8s 上的应用对企业服务的影响 案例分…

如何将 JavaScript 添加到 HTML 页面

介绍 JavaScript&#xff0c;简称 JS&#xff0c;是一种用于网页开发的编程语言。作为 Web 的核心技术之一&#xff0c;JavaScript 与 HTML 和 CSS 一起用于使网页具有交互性并构建 Web 应用程序。现代 Web 浏览器遵循通用的显示标准&#xff0c;通过内置引擎支持 JavaScript&…

vue3 记录页面滚动条的位置,并在切换路由时存储或者取消

需求&#xff0c;当页面内容超出了浏览器可是屏幕的高度时&#xff0c;页面会出现滚动条。当我们滚动到某个位置时&#xff0c;操作了其他事件或者跳转了路由&#xff0c;再次回来时&#xff0c;希望还在当时滚动的位置。那我们就进行一下操作。 我是利用了会话存储 sessionSto…

工业互联网和云计算有关联吗

工业互联网和云计算有关联吗&#xff1f;是的&#xff0c;工业互联网和云计算之间存在紧密的关联。工业互联网是指利用物联网、云计算、大数据分析等技术手段&#xff0c;将传统工业领域与互联网技术相结合&#xff0c;实现设备、工厂和企业之间的连接和数据交互。 工业互联网…

Linux华为云Hadoop配置环境

手工搭建Hadoop环境&#xff08;Linux&#xff09;_弹性云服务器 ECS_最佳实践 (huaweicloud.com)https://support.huaweicloud.com/bestpractice-ecs/zh-cn_topic_0000001698668477.html?localezh-cn#ZH-CN_TOPIC_0000001698668477__li49001945163110跟着傻瓜式CV即可。 气死…

SSH常见运维总结

1 -bash: ssh: command not found 解决办法&#xff1a;"yum install &#xff0d;y openssh-server openssh-clinets" 2 ssh登录时提示&#xff1a;Read from socket failed: Connection reset by peer. 原因&#xff1a;/etc/ssh/下没有ssh*key*文件 解决&…

目标检测:数据集划分 XML数据集转YOLO标签

文章目录 1、前言&#xff1a;2、生成对应的类名3、xml转为yolo的label形式4、优化代码5、划分数据集6、画目录树7、目标检测系列文章 1、前言&#xff1a; 本文演示如何划分数据集&#xff0c;以及将VOC标注的xml数据转为YOLO标注的txt格式&#xff0c;且生成classes的txt文件…

Ubuntu 大压缩文件解压工具

Ubuntu 大压缩文件解压工具 任务解决 任务 需要解压一个百度网盘上下载的压缩文件&#xff0c;zip格式。 直接右键’提取到此处’&#xff0c;会报错&#xff1a;empty archive 用unzip指令&#xff0c;会报错&#xff1a; Archive: 实验.zip warning [实验.zip]: 12540984…

李笑来-财富自由之路【边读边记】2

2024-04-01 23:50 处理完杂事&#xff0c;已经快12点了&#xff0c;但还是想读完这本书。 昨天晚上看完前8章&#xff0c;对李笑来这个同志有了初步的判断&#xff0c;然后不由得去抖音搜了下这个人的资料&#xff0c;果然关于炒币狂转上百亿一下子就出来了&#xff0c;还有就是…

Nginx 日志输出配置json格式

nginx日志输出配置json格式 nginx服务器日志相关指令主要有两条&#xff1a; (1) 一条是log_format&#xff0c;用来设置日志格式 (2) 另外一条是access_log&#xff0c;用来指定日志文件的存放路径、格式和缓存大小。 log_format指令用来设置日志的记录格式&#xff0c;它的语…

Javaweb的学习22_JavaScript简介

JavaScript 简介&#xff1a; 概念&#xff1a;一门客户端脚本语言 运行在客户端浏览器中&#xff1b;每一个浏览器都有JavaScript的解析引擎 脚本语言&#xff1a;不需要编译&#xff0c;直接就可以被浏览器解析执行 功能&#xff1a; 可以来增强用户和html页面的交互过程&…

iOS移动应用实时查看运行日志的最佳实践

目录 一、设备连接 二、使用克魔助手查看日志 三、过滤我们自己App的日志 &#x1f4dd; 摘要&#xff1a; 本文介绍了如何在iOS iPhone设备上实时查看输出在console控制台的日志。通过克魔助手工具&#xff0c;我们可以连接手机并方便地筛选我们自己App的日志。 &#x1f4…

目标检测——工业安全生产环境违规使用手机的识别

一、重要性及意义 首先&#xff0c;工业安全生产环境涉及到许多复杂的工艺和设备&#xff0c;这些设备和工艺往往需要高精度的操作和严格的监管。如果员工在生产过程中违规使用手机&#xff0c;不仅可能分散其注意力&#xff0c;降低工作效率&#xff0c;更可能因操作失误导致…

云原生技术赋能AI绘图:Stable Diffusion在腾讯云的部署与应用新篇章

摘要 随着信息技术的飞速发展和数字化转型的深入推进&#xff0c;云原生架构已成为企业数字化转型的重要基石。Docker容器、Serverless和微服务等技术作为云原生的核心组成部分&#xff0c;正在不断推动着企业应用架构的革新与升级。本文旨在总结近期在云原生实践、容器技术、…

linux三件客之awk全解

01.awk awk:编程语言 GNU/awk 作用&#xff1a;1.取行2.取列3.模糊过滤4.数据统计&#xff0c;数据运算5.支持for循环 if判断 数组……6.格式化输出 sed后向引用 语法结构&#xff1a;awk 模式 file # 模式是找谁 指定行 指定列 模糊查找 不加任何动作awk 模式&#xff08…