线性表的运算

  1. 求长度GetLength(L),求线性表L的长度
  2. 置空表SetNull(L),将线性表置成空表
  3. 按位查找Get(L,i),查找线性表L第i个元素
  4. 按值查找Location(L,x),查找线性表L值为x的元素
  5. 修改Set(L,i,x),将线性表L第i位置的元素,修改为x
  6. 插入Insert(L,i,x),在线性表L的第i位置插入x
  7. 删除Delete(L,i),删除线性表L的第i位置元素
  8. 排序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[]最后一个元素,然后再一次插入前面的

  1. 创建头结点front
  2. 创建数据结点s
  3. 赋值,将a[i]赋给s->data
  4. 将原先front的直接后继地址赋给s->next;
  5. 更改front直接后继地址

尾插法类似。

(四)析构函数

 template<class T>
LinkList<T>::~LinkList()
{
Node<T>* p = front;
while (p)
{
front = p;
p = p->next;
delete front;
}
}

因为是使用new来创建结点,所以需要使用delete释放每一个结点;所以需要遍历与每一个结点,并逐一释放

  1. 创建一个工作指针p,并将头结点赋给它
  2. 遍历每个结点(while(p),当p不为空的时候)
  3. 移动p,p=p->next;
  4. 将p赋给front,并释放

其他功能与上述类似

数据结构-线性表-单链表(c++)的更多相关文章

  1. C语言 严蔚敏数据结构 线性表之链表实现

    博主最近在考成都大学皇家计算机科学与技术专业,复习专业课数据结构,正好学习到线性结构中的线性表用链表这种存储结构来实现. 首先,数据结构包括1.数据的操作2.逻辑结构3.存储结构(数据结构三要素. 直 ...

  2. 数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)

    数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删 ...

  3. 数据结构之 线性表---单链表操作A (删除链表中的指定元素)

    数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据 ...

  4. Python线性表——单链表

    1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列.线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱 ...

  5. JAVA实现具有迭代器的线性表(单链表)

    一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用 ...

  6. C数据结构 : 线性表 与 链表

    一.线性表 一般表现为数组,使用一组地址连续的存储单元依次存储数据元素,如图: 它具有如下特点: 长度固定,必须在分配内存之前确定数组的长度. 存储空间连续,即允许元素的随机访问. 存储密度大,内存中 ...

  7. [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)

    [数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构)    C#中的链表(源码)    可空类 ...

  8. [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList

    一.线性表 1,什么是线性表 线性表就是零个或多个数据元素的有限序列.线性表中的每个元素只能有零个或一个前驱元素,零个或一个后继元素.在较复杂的线性表中,一个数据元素可以由若干个数据项组成.比如牵手排 ...

  9. Java数据结构-线性表之单链表LinkedList

    线性表的链式存储结构,也称之为链式表,链表:链表的存储单元能够连续也能够不连续. 链表中的节点包括数据域和指针域.数据域为存储数据元素信息的域,指针域为存储直接后继位置(一般称为指针)的域. 注意一个 ...

  10. c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)

    线性表 定义:线性表是具有相同特性的数据元素的一个有限序列 类型: 1:顺序存储结构 定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构 算法: #include <stdio. ...

随机推荐

  1. Hexo博客Next6.0版本主题配置(背景图片加载、侧边栏社交小图标设置、设置网站图标)

    随机背景图片加载 原理 自动更换背景是修改添加背景的css样式实现 图片来源 https://source.unsplash.com/ 修改背景样式 修改themes\next\source\css\ ...

  2. 代码随想录贪心专题-day1

    35. 分发糖果 n 个孩子站成一排.给你一个整数数组 ratings 表示每个孩子的评分. 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻两个孩子评分更高的孩子会获 ...

  3. 公网环境部署zabbix5.0

    实验环境 虚拟机两台,一台公网地址为 1.1.1.1,部署 zabbix server,一台公网地址为 1.1.1.2,部署 zabbix proxy,系统为centos7.2. 1 zabbix s ...

  4. Java与PHP的区别

    1.PHP暂时不支持像Java那样的JIT运行时编译的热点代码,但PHP具有opcache机制,能够将脚本对应的opcode缓存在内存中. 补充:JIT与JVM的三种执行模式:解释模式.编译模式.混合 ...

  5. Kubernets常用命令

    查看所有namespace的pods运行情况 kubectl get pods --all-namespaces kubectl get service -ALL kubectl get deploy ...

  6. Angular:error TS2717: Subsequent property declarations must have the same type. Property 'contentRect' mu st be of type 'DOMRectReadOnly', but here has type 'DOMRectReadOnly'.

    解决方案 在tsconfig.json的compilerOptions选项中添加如下内容"skipLibCheck": true. 如下图所示 之后重新启动项目. 如下图启动成功

  7. 钟表练习 html+css实现

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. JavaScript代码片段精选

    今天,我在职坐标的微信公众号里面看到了关于  JavaScript代码片段精选 的 微信软文.在实际开发中,我们经常会使用的JS来实现某些功能.今天,就在此总结一下. 1.浮点数取整 const x ...

  9. jenkins打包报错的排查思路与解决

    背景 废话少说, 在新建一个jenkins流水线时, 碰到了打包死活无法成功的问题, 相关配置如下图 运行后最后的日志如图 定位问题 通过查看日志, 发现报错的模块是构建后执行shell的时候, 但是 ...

  10. 双URL编码绕过WAF

    一般编码一次是%5c. 但攻击者怕这个会被认出来,所以用二次编码,把%本身编码成%25.再和后边拼成%255c. 如果URL解码器有缺陷,只不断重复"从前边开始解析"这个步骤,就会 ...