线性表的运算

  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. C# HttpClient请求gzip

    //设置HttpClientHandler的AutomaticDecompression var handler = new HttpClientHandler() { AutomaticDecomp ...

  2. FAQ:zabbix 频繁丢失数据问题分析处理

    问题描述 在grafana上看到历史数据的绘图断断续续. 问题分析 1 性能瓶颈 一开始以为是哪里的性能遇到瓶颈,把服务器和zabbix的监控数据看了一遍,各个指标都没有问题. 2 上网百度 没有找到 ...

  3. 【pandas小技巧】--反转行列顺序

    反转pandas DataFrame的行列顺序是一种非常实用的操作.在实际应用中,当我们需要对数据进行排列或者排序时,通常会使用到Pandas的行列反转功能.这个过程可以帮助我们更好地理解数据集,发现 ...

  4. 从浅入深了解.NET Core MVC 2.x全面教程

    一.基础 1.默认配置 使用Kestrel Web Server ASP.NET Core内置--跨平台 IIS集成 UseIIS() UseIISIntergration() Log IConfig ...

  5. [nginx]日志中记录自定义请求头

    前言 假设在请求中自定义了一个请求头,key为"version",参数值为"1.2.3",需要在日志中捕获这个请求头. nginx日志配置 只需要用变量http ...

  6. css美化

    编辑网页文本 span标签:能让某几个字凸显出来结构:span{color:red:}    <span>123<span> 字体样式:一般设置两个字体.如果浏览器第一个字体不 ...

  7. Log4j疯狂写日志问题排查

    一.问题是怎么发现的 最近有个 Java 系统上线后不久就收到了磁盘使用率告警,磁盘使用率已经超过了 90% 以上,并且磁盘使用率还在不停增长. 二.问题带来的影响 由于服务器磁盘被打满,导致了系统正 ...

  8. HDU 3829 Cat VS Dog 猫和狗(二分图)结题报告

    听学长说这道题很ex,但是思路想到的话还是挺简单的. 可能是受上一道题(放置机器人)的启发,也是找互相冲突的点连线. 但是并不是完全一样(废话)放置机器人那道题是找到冲突点连线后直接求最大匹配即可. ...

  9. WPF-利用装饰器实现控件的自由拖动

    在项目中经常会遇到类似如下要求的需求,创建允许自由拖动的控件,这样的需求可以使用WPF的装饰器Adorner来实现. 一.什么是装饰器? 装饰器是一种特殊类型的FrameworkElement,装饰器 ...

  10. Python 创建或读取 Excel 文件

    Excel是一种常用的电子表格软件,广泛应用于金融.商业和教育等领域.它提供了强大的数据处理和分析功能,可进行各种计算和公式运算,并能创建各种类型的图表和可视化数据.Excel的灵活性使其成为处理和管 ...