数据结构-线性表-单链表(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. ...
随机推荐
- 每日一题:SpringBoot中支持的事务类型
以下是每种事务类型的作用.代码示例和对代码的解释: PROPAGATION_REQUIRED(默认): 作用:如果当前存在事务,则方法将在该事务中运行:如果不存在事务,则创建一个新的事务.适用于大多数 ...
- FireflySoft.LeaderElection增加基于ZooKeeper的Leader选举
FireflySoft.LeaderElection的第一个版本实现了基于Consul的Leader选举,考虑到ZooKeeper的一个常见用途也是选主,所以此类库把ZooKeeper也集成了进来.并 ...
- altas2.1.0编译、安装、集成CDH6.3.2
目录 altas2.1.0编译.安装.集成CDH6.3.2 一: Atlas源码下载 二: Atlas源码编译 1.修改altas项目主pom文件,即需要编译的CDH6.3.2对应版本信息 2.Atl ...
- 统一观测丨使用 Prometheus 监控 Cassandra 数据库最佳实践
作者:元格 本篇内容主要包括四部分:Cassandra 概览介绍.常见关键指标解读.常见告警规则解读.如何通过 Prometheus 建立相应监控体系. Cassandra 简介 Cassandra ...
- sudo:pam_open_session Permission denied 与 Too many open files
sudo:pam_open_session Permission denied 一,验证 sudo 权限失败: /etc/sudoers 文件未给相关用户配置权限. 打开 /etc/sudoers 文 ...
- WebSSH之录屏安全审计(三)
第一篇:Gin+Xterm.js实现WebSSH远程Kubernetes Pod(一) 第二篇:WebSSH远程管理Linux服务器.Web终端窗口自适应(二) 支持用户名密码认证 支持SSH密钥认证 ...
- VSCode:缩进两格空格
在设定中对如图所示两项进行修改: 至此问题解决.
- 《高级程序员 面试攻略 》RocketMQ 如何保证顺序性
RocketMQ 提供了一种称为顺序消息的机制来确保消息的顺序性.下面是一些关键的方法和概念: 1. 顺序消息:顺序消息是指在发送和消费过程中,消息按照特定的顺序进行处理.RocketMQ 通过将消息 ...
- 文心一言 VS 讯飞星火 VS chatgpt (77)-- 算法导论7.3 2题
二.如果用go语言,在 RANDOMIZED-QUICKSORT 的运行过程中,在最坏情况下,随机数生成器 RANDOM 被调用了多少次?在最好情况下呢?以θ符号的形式给出你的答案? 文心一言: 在 ...
- SDP协议理解
目录 SDP协议 协议格式说明 协议格式 常见属性 协议版本号 v= -- Protocol Version 会话发起者: o= -- Origin 会话名 s= 连接数据:c= 媒体描述:m= 附加 ...