SDUTOJ 2116 数据结构实验之链表一:顺序建立链表

2024-08-24 23:18

本文主要是介绍SDUTOJ 2116 数据结构实验之链表一:顺序建立链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近数据结构和c++相结合的实训正在进行,鉴于一些同学还不是太懂链表,写一篇博客讲解一下,若是哪里有问题,请不吝支出,在此谢过,若是过路的大神看见了,求轻喷。。。。

说白了,链表就是个特殊的结构体数组,只不过数组是用下标找到某个节点的后继节点,而链表使用一个指向他身类型的指针来记录下一个节点的地址,就比如你进入了一个村庄,你发现这里住的楼的楼号(1,2,3,4,等)都是连着的,这就是结构体数组,而链表就是你从第一楼开始,看到的是本楼的标号,然后标号下面还有一行字:下一个楼是XXX,他在某某某地方,当你找到XXX后,XXX的楼的标号下面也有一行字:下一个楼是YYY,他在另一个某某某地方,你每次都能从这个楼的标号上找到下一个楼在哪,直到最后一栋楼上标号下面没有下一个楼的信息,只有一个NULL,那么,你走到楼的最后了。。。链表遍历完了。。。。。


这里以SDUTOJ的2116题为例,讲解一下链表,另外,链表是写出来的,练出来的,不写,不编译运行,不调试,永远学不会链表,所以不要光看,要用编译器写,然后提交到OJ上去判,才能学会,这是这个题的链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2116

数据结构实验之链表一:顺序建立链表

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据。

输入

第一行输入整数的个数N;
第二行依次输入每个整数。

输出

输出这组整数。

示例输入

8
12 56 4 6 55 15 33 62

示例输出

12 56 4 6 55 15 33 62

提示

不得使用数组!

来源

示例程序

#include <iostream>using namespace std;class List
{public:int data;//数据域,用来记录数据List *next;//指着域,用来记录它下一个节点的地址//访问这个变量能找到它的下一个节点
};void del(List *p)//递归释放内存
{if(p == NULL)//p为NULL说明p访问到链表结尾了return ;//访问到结尾返回del(p->next);//如果没访问到结尾,会在这里一直调用函数本身递归,直到遇见NULLdelete p;//遇到NULL返回到head的时候,从后向前删除节点,释放内存//如果从前面删除的话就会把本节点的next值也给删除了,就没办法访问到下一个节点了//如果定义一个临时变量先记录下一个节点地址然后再删除本节点也是可以解决这个问题的
}
//void del(List *head)
//{
//    List *p = head,*q;
//    while(p)
//    {
//        q = p;
//        p = p->next;
//        delete q;
//    }
//}//这样释放内存也是可以的
int main()
{List *head = new List;//new开辟内存,地址赋给head,head代表这个//链表的头,访问head能找到这个链表head->next = NULL;//初始状态下只有head链节,他没有后继结点,所以他的next值为NULL(空)List *p,*q;//p是游动指针,建立链表的时候永远指向最后一个链节//q是开新内存用的,也就是增加一个新的链节int n;//输入数的个数cin>>n;p = head;//初始状态下只有head一个链节,那么最后一个链节也是head,让p指向headfor(int i = 0;i < n;i++){q = new List;//增加新的链节qcin>>q->data;//给新链节的data赋值p->next = q;//把q挂在p(初始值是head)的后面q->next = NULL;//新链节是链表的最后一个链节,后面没有后继,那么,就把他的next值设为NULL(空)p = q;//q成为p的后继之后,q就是最后一个节点,我们规定p指向最后一个节点,这里就把q赋给p}//循环完成后,链表就建立完了,head是他们的头p = head->next;//p在上面是指向最后一个元素,以便于增加新的链节后能很快的放在它的后面,达到添加链节的目的//现在我们就发动他的游动特点,来访问整个链表,从上面看来,我们输入的第一个整数放在q->data//里面了,并没有放在head里面,那么,我们访问的话,head的下一个节点才是第一个存储节点,用p//访问head的next,判就指向了链表中的第一个存储输入数的节点(真正第一个节点是head,因为head//因为head的data没有值,所以,我们说head的后面第一个节点为有效节点)while(p != NULL)//当p访问不到NULL的时候,就会一直循环,NULL是链表结束的标志{cout<<p->data;//输出p访问到的每个节点的data值if(p->next != NULL)cout<<" ";//这两行是调格式的,为了能在最后不多输出空格,其实只是为了在OJ上ACp = p->next;//p访问把本节点的next值,p就指向下一个节点,相当于向后移动一个节点}cout<<endl;del(head);//释放内存return 0;
}




这篇关于SDUTOJ 2116 数据结构实验之链表一:顺序建立链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103886

相关文章

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD