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

前言:

在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…

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 上的应用对企业服务的影响 案例分…

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

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

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即可。 气死…

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

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

Nginx 日志输出配置json格式

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

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

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

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

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

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

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

混合现实(MR)开发工具

混合现实&#xff08;MR&#xff09;开发工具是一系列软件和框架&#xff0c;它们使得开发者能够创建和优化能够在虚拟与现实世界之间无缝交互的应用程序。以下是一些在MR领域内广泛使用的开发工具。 1.Microsoft Mixed Reality Toolkit (MRTK) MRTK是一个跨平台的工具包&…

【操作系统】FCFS、SJF、HRRN、RR、EDF、LLF调度算法及python实现代码

文章目录 一、先来先服务调度算法&#xff08;FCFS&#xff09; 二、短作业优先调度算法&#xff08;SJF&#xff09; 三、高响应比优先调度算法&#xff08;HRRN&#xff09; 四、轮转调度算法&#xff08;RR&#xff09; 五、最早截至时间优先算法&#xff08;EDF&#…

Mysql故障解析

目录 一、Mysql单实例故障排查 1.故障一 2.故障二 3.故障三 4.故障四 5.故障五 6.故障六 7.故障七 8.故障八 二、Mysql主从故障排查 1.故障一 2.故障二 3.故障三 三、Mysql优化 1.硬件方面 &#xff08;1&#xff09;关于CPU &#xff08;2&#xff09;关于内…

Autodesk 3DS MAX 2025 (3Dmax2025)激活版

3ds Max 2025 是一款功能强大的3D建模、动画和渲染软件&#xff0c;广泛应用于建筑、游戏开发、影视制作等多个领域。在材质设定和描影、3D彩现以及动画和效果方面&#xff0c;3ds Max 2025也提供了丰富的增强功能&#xff0c;以满足用户在不同制作需求中的要求。 3ds Max 2025…

Linux多进程通信(2)——POSIX信号量使用例程

1.POSIX信号量 1&#xff09;POSIX信号量和System V信号量区别 常用的是POSIX信号量&#xff0c;使用起来更加方便&#xff0c;而POSIX信号量分为有名信号量和无名信号量 POSIX信号量是多线程多进程安全的&#xff0c;而System V标准的信号量并不是&#xff0c;Posix通过sem_…

外包干了25天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

Mysql中的 IFNULL 函数的详解

Mysql中的 IFNULL 函数的详解 概念 在mysql中IFNULL() 函数用于判断第一个表达式是否为 NULL&#xff0c;如果第一个值不为NULL就执行第一个值。第一个值为 NULL 则返回第二个参数的值。 语法 IFNULL(a, b)Demo 举例说明 创建表 create table student_one( sno varchar(20)…

机器学习: 绪论(基础概念)

文章目录 一、机器学习做什么二、机器学习的基本术语2.1、数据相关2.1.1、数据集2.1.2、特征&#xff08;Feature&#xff09;2.1.3、样本空间&#xff08;Sample Space&#xff09; 2.2、任务相关2.2.1、分类2.2.2、回归2.2.3、聚类2.2.4、监督学习和无监督学习 三、机器学习思…