线性表的运算

  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. Unity UGUI的LayoutElement(布局元素)组件的介绍及使用

    Unity UGUI的LayoutElement(布局元素)组件的介绍及使用 1. 什么是LayoutElement组件? LayoutElement是Unity UGUI中的一个布局元素组件,用于控 ...

  2. Linux 命令:gpasswd 管理用户组

    工作中经常需要将用户加入docker组,可执行如下操作: sudo gpasswd -a ec2-user docker newgrp # 不用加sudo gpasswd gpasswd -h Usa ...

  3. .Net Core控制台程序读取Json配置文件

    1 添加依赖(可以直接通过nuget包安装 Microsoft.Extensions.Configuration.Json 这个会依赖其他两个会自动安装依赖的) Microsoft.Extension ...

  4. 从0开发属于自己的nestjs框架的mini 版 —— ioc篇

    如今,nodejs的框架也是层出不穷,偏向向底层的有 express.koa. Fastify,偏向于上层有阿里的 Egg.thinkjs .还有国外的 nestjs. 在这里我更喜欢 nestjs, ...

  5. 青少年CTF-Web-帝国CMS1-3通关记录

    0x01说明 本次进通过平台内题目进行,非真实环境. 帝国CMS01 首先下发题目链接 我们首先先找后台看看 后台地址为/e/admin/ 随后,经过dirsearch进行扫描,得到了一个www.zi ...

  6. NFS快速入门(一):简介、原理

    NFS网络文件共享存储 什么是NFS NFS 是 Network File System 的缩写,中文意思是网络文件系统.它的主要功能是通过网络(一般是局域网)让不同主机系统之间可以共享文件或目录.N ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (75)-- 算法导论7.2 4题

    四.如果用go语言,银行一般会按照交易时间来记录某一账户的交易情况.但是,很多人却喜欢收到的银行对账单是按照支票号码的顺序来排列的.这是因为,人们通常都是按照支票号码的顺序来开出支票的,而商人也通常都 ...

  8. dBeaver操作iotdb并实现导入和导出

    1.windows下操作iotdb,现在官网下载相关的iotdb包 官网地址:https://archive.apache.org/dist/iotdb/   一般建议下载 -all的  2.打开db ...

  9. Qt开发思想探幽]QObject、模板继承和多继承

    @ 目录 [Qt开发探幽]QObject.模板继承和多继承 1. QObject为什么不允许模板继承: 2.如果需要使用QObject进行多继承的话,子对象引用的父类链至多只能含有一个QObject ...

  10. 前端Vue仿企查查 天眼查知识产权标准信息列表组件

    ​ 引入Vue仿企查查天眼查知识产权标准信息列表组件 随着技术的不断发展,传统的开发方式使得系统的复杂度越来越高.在传统开发过程中,一个小小的改动或者一个小功能的增加可能会导致整体逻辑的修改,造成牵一 ...