数据结构-线性表-单链表(c++)
线性表的运算
- 求长度GetLength(L),求线性表L的长度
- 置空表SetNull(L),将线性表置成空表
- 按位查找Get(L,i),查找线性表L第i个元素
- 按值查找Location(L,x),查找线性表L值为x的元素
- 修改Set(L,i,x),将线性表L第i位置的元素,修改为x
- 插入Insert(L,i,x),在线性表L的第i位置插入x
- 删除Delete(L,i),删除线性表L的第i位置元素
- 排序Sort
单链表
LinkList.h
#ifndef LINKLIST_H_
#define LINKLIST_H_
#include<iostream>
template<class T>
struct Node
{
T data;
struct Node<T>* next;
};
template<class T>
class LinkList
{
private:
Node<T>* front;
public:
LinkList();
LinkList(T a[], int n);
~LinkList();
int Length();
void PrintList();
Node<T>* Get(int i);
int Location(int x);
void Insert(int i,T x);
T Delete(int i);
};
template<class T>
LinkList<T>::LinkList()
{
front = new Node<T>;
front->next = nullptr;
}
template<class T>
LinkList<T>::LinkList(T a[], int n)
{
front = new Node<T>;
/**头插法**/
//front->next = nullptr;
//for (int i = n-1; i >=0n; i--)
//{
// Node<T>* s = new Node<T>;
// s->data = a[i];
// s->next = font->next;
// fornt->next = s;
//}
/**尾插法**/
Node<T>* r = front;
for (int i = 0; i < n; i++)
{
Node<T>* s = new Node<T>;
s->data = a[i];
r->next = s;
r = s;
}
r->next = nullptr;
}
template<class T>
LinkList<T>::~LinkList()
{
Node<T>* p = front;
while (p)
{
front = p;
p = p->next;
delete front;
}
}
template<class T>
int LinkList<T>::Length()
{
Node<T>* p = front->next;
int len = 0;
while (p)
{
len++;
p = p->next;
}
return len;
}
template<class T>
void LinkList<T>::PrintList()
{
std::cout << "链表内容:" << std::endl;
int i=0;
Node<T>* p = front->next;
while (p)
{
std::cout << p->data<<" ";
if (i % 5 == 4)
std::cout << std::endl;
i++;
p = p->next;
}
if (i % 5 != 0)
std::cout << std::endl;
}
template<class T>
Node<T>* LinkList<T>::Get(int i)
{
int j = 1;
Node<T>* p = front->next;
while (p && j != i)
{
p = p->next;
j++;
}
return p;
}
template<class T>
int LinkList<T>::Location(int x)
{
Node<T>* p = front->next;
int j = 1;
while (p)
{
if (p->data == x)return j;
p = p->next;
j++;
}
return -1;
}
template<class T>
void LinkList<T>::Insert(int i, T x)
{
Node<T>* p = front;
if (i != 1)
p = Get(i-1);
if (p)
{
Node<T>* s = new Node<T>;
s->data = x;
s->next = p->next;
p->next = s;
}
else throw"位置异常";
}
template<class T>
T LinkList<T>::Delete(int i)
{
Node<T>* p = front;
if (i != 1)
p = Get(i - 1);
if (!p && !p->next)throw"位置错误";
Node<T>* q = p->next;
p->next = q->next;
T x = q->data;
delete q;
return x;
}
#endif // !LINKLIST_H_
use.cpp
#include<iostream>
#include"LinkList.h"
int main()
{
using std::cout;
using std::endl;
cout << "Start!" << endl;
int s[10] = { 0,1,2,3,4,5,6,7,8,9 };
LinkList<int> grade(s, 10);
cout << "长度为:" << grade.Length() << endl;
cout << "befor delete: ";
grade.PrintList();
grade.Delete(1);
cout << "after delete: ";
grade.PrintList();
cout << endl;
cout << "befor insert: ";
grade.PrintList();
grade.Insert(3, 5);
cout << "after insert: ";
grade.PrintList();
cout << "第2个元素值:" << grade.Get(2) << endl;
cout << "7的位置:" << grade.Location(7) << endl;
return 0;
}
说明:
因为链表的数据类型不确定,所以使用模板类(模板类的定义和声明必须放在一个文件中编译);模板并未加上所有运算,可自行添加
(一)结点
包含数据域data和指针域next(指向直接后继)
data | next |
---|
template<class T>
struct Node
{
T data;
struct Node<T>* next;
};
(二)无参构造函数
template<class T>
LinkList<T>::LinkList()
{
front = new Node<T>;
front->next = nullptr;
}
建立有个头结点front,front下一个为空(front->next=nullptr;),即空链表
(三)有参构造函数
LinkList<T>::LinkList(T a[], int n)
{
front = new Node<T>;
/**头插法**/
//front->next = nullptr;
//for (int i = n-1; i >=0n; i--)
//{
// Node<T>* s = new Node<T>;
// s->data = a[i];
// s->next = font->next;
// fornt->next = s;
//}
/**尾插法**/
Node<T>* r = front;
for (int i = 0; i < n; i++)
{
Node<T>* s = new Node<T>;
s->data = a[i];
r->next = s;
r = s;
}
r->next = nullptr;
}
将个数为n类型为T的数组元素a[],赋值给链表;分为头插法和尾插法,使用头插法需要注意要想与a[]元素顺序一样,需要先插入a[]最后一个元素,然后再一次插入前面的
- 创建头结点front
- 创建数据结点s
- 赋值,将a[i]赋给s->data
- 将原先front的直接后继地址赋给s->next;
- 更改front直接后继地址
尾插法类似。
(四)析构函数
template<class T>
LinkList<T>::~LinkList()
{
Node<T>* p = front;
while (p)
{
front = p;
p = p->next;
delete front;
}
}
因为是使用new来创建结点,所以需要使用delete释放每一个结点;所以需要遍历与每一个结点,并逐一释放
- 创建一个工作指针p,并将头结点赋给它
- 遍历每个结点(while(p),当p不为空的时候)
- 移动p,p=p->next;
- 将p赋给front,并释放
其他功能与上述类似
数据结构-线性表-单链表(c++)的更多相关文章
- C语言 严蔚敏数据结构 线性表之链表实现
博主最近在考成都大学皇家计算机科学与技术专业,复习专业课数据结构,正好学习到线性结构中的线性表用链表这种存储结构来实现. 首先,数据结构包括1.数据的操作2.逻辑结构3.存储结构(数据结构三要素. 直 ...
- 数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)
数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删 ...
- 数据结构之 线性表---单链表操作A (删除链表中的指定元素)
数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据 ...
- Python线性表——单链表
1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列.线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱 ...
- JAVA实现具有迭代器的线性表(单链表)
一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用 ...
- C数据结构 : 线性表 与 链表
一.线性表 一般表现为数组,使用一组地址连续的存储单元依次存储数据元素,如图: 它具有如下特点: 长度固定,必须在分配内存之前确定数组的长度. 存储空间连续,即允许元素的随机访问. 存储密度大,内存中 ...
- [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)
[数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构) C#中的链表(源码) 可空类 ...
- [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList
一.线性表 1,什么是线性表 线性表就是零个或多个数据元素的有限序列.线性表中的每个元素只能有零个或一个前驱元素,零个或一个后继元素.在较复杂的线性表中,一个数据元素可以由若干个数据项组成.比如牵手排 ...
- Java数据结构-线性表之单链表LinkedList
线性表的链式存储结构,也称之为链式表,链表:链表的存储单元能够连续也能够不连续. 链表中的节点包括数据域和指针域.数据域为存储数据元素信息的域,指针域为存储直接后继位置(一般称为指针)的域. 注意一个 ...
- c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)
线性表 定义:线性表是具有相同特性的数据元素的一个有限序列 类型: 1:顺序存储结构 定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构 算法: #include <stdio. ...
随机推荐
- 解读 --- yield 关键字
引言 yield关键字是 C# 中的一种语言特性,用于在枚举器中简化迭代器的实现.它使得开发人员可以通过定义自己的迭代器来简化代码,而不必手动实现 IEnumerable 和 IEnumerator ...
- Redis的五大数据类型及其使用场景
前言 redis是一个非常快速的非关系数据库解决方案.其简单的键值数据模型使 Redis 能够处理大型数据集,同时保持令人印象深刻的读写速度和可用性.redis提供了五种数据类型,分别是是: ...
- KVM vm time setting
- config file $ grep clock vm02.xml <clock offset='utc'> </clock> - NTP server $ s vm02 ...
- 使用guestmount更改qcow2镜像内容
参考: 使用guestmount更改qcow2镜像内容 guestmount 安装 yum install libguestfs libguestfs-tools -y 使用 guestmount - ...
- Cilium系列-6-从地址伪装从IPtables切换为eBPF
系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...
- Bug_ku source (WEB) wp
在源代码中注释中发现了flag,提交发现是假的. 我们打开kali用dirserch扫描一下网站后台目录吧 发现.git ,这题应该是一个git泄露的题,用wget吧文件下载到本地,-r 选项的作用是 ...
- asp.net core之日志
日志记录在应用程序开发中起着至关重要的作用,它可以帮助开发人员诊断和调试问题,同时也是监控和性能优化的重要工具.ASP.NET Core 提供了强大且灵活的日志记录功能,本文将详细介绍ASP.NET ...
- C#.NET 国密SM3 HASH 哈希 与JAVA互通 ver:20230803
C#.NET 国密SM3 HASH 哈希 与JAVA互通 ver:20230803 .NET 环境:.NET6 控制台程序(.net core). JAVA 环境:JAVA8,带maven 的JAVA ...
- .Net Web API 006 Controller上传大文件
1.上传大文件的方式 上传大文件就需要一段一段的上传,主要是先在客户端获取文件的大小,例如想一次传256kb,那就按照256kb分割.分割后又两种上传方式. (1)逐个数据段读取,然后调用API上传, ...
- CVE-2020-0796 SMB远程代码执行漏洞复现
前言: 这个windows的永恒之黑漏洞,不得不复现一下啦! 这个漏洞诸多大佬都已经复现了,现在跟随大佬的脚步,逐个复现一下: 可参考:https://www.adminxe.com/1220.htm ...