IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 线性表的链接存储结构 -> 正文阅读

[数据结构与算法]线性表的链接存储结构

LinkList.h:

#ifndef LINKLIST_H
#define LINKLIST_
#include<iostream>
using namespace std;
//定义
template<class DataType>
struct Node
{
      DataType data;
      Node<DataType> *next;
};

template <class DataType>
class LinkList
{
public:
	LinkList();                     //无参构造函数,建立只有头结点的空链表
	LinkList(DataType a[], int n);  //有参构造函数,建立有n个元素的单链表
	~LinkList();                    //析构函数
	int Length();                   //获取当前长度
	int Empty();			//判断单链表是否为空
	DataType Get(int i);       //按位查找
	int Locate(DataType x);           //按值查找。在单链表中查找值为x的元素序号
	void Insert(int i, DataType x);      //插入操作,第i个位置插入元素值为x的结点
	DataType Delete(int i);           //删除操作,在单链表中删除第i个结点
	void PrintList();                 //遍历操作,按序号依次输出各元素
private:
	Node<DataType> *first;                     //单链表的头指针
};


#endif // LINKLIST_H

LinkList.cpp:

#include "LinkList.h"

template<class DataType>
LinkList<DataType>::LinkList(){
    first = new Node<DataType>;
    first->next = nullptr;
}
/*
    创建单链表(头插法和尾插法)
*/
template<class DataType>
LinkList<DataType>::LinkList(DataType a[], int n){
    first = new Node<DataType>;
    first->next = nullptr;  //初始化一个空链表

    //头插法
   /* Node<DataType> *p;
    for(int i;i < n;++i){
        p = new Node<DataType>;
        p->data = a[i];
        p->next = first->next;  //将结点s插入到头结点之后
        first->next = p;
        p->next = first->next;
    }*/

    //尾插法
    Node<DataType> *p,*r; //p为工作指针,r为尾指针
    r = first;  //尾指针初始化
    for(int i = 0;i < n;++i){
        p = new Node<DataType>;
        p->data = a[i];
        r->next = p;
        r = p;
    }
    r->next = nullptr;//单链表建立完毕,将终端结点的指针域置空

}
//析构函数
template<class DataType>
LinkList<DataType>::~LinkList(){
    Node<DataType> *p;
    while(first != nullptr){
        p = first;
        first = first->next;
        delete p;
    }
}

template<class DataType>
int LinkList<DataType>::Length(){
    Node<DataType> *p = first->next;
    int count = 0;
    while(p != nullptr){
        count++;
        p = p->next;
    }
    return count;//长度为count
}

template<class DataType>
int LinkList<DataType>::Empty(){
    if(first->next == nullptr)
        return 1;
    else
        return 0;
}

template<class DataType>
DataType LinkList<DataType>::Get(int i){
    Node<DataType> *p = first->next;
    int count = 0;
    while(p != nullptr && count < i - 1){
        p = p->next;
        count++;
    }
    if(p = nullptr) throw"查找位置非法";
    else return p->data;
}

template<class DataType>
int LinkList<DataType>::Locate(DataType x){
    Node<DataType> *p = first->next;
    int count = 0;  //对应第一位
    while(p != nullptr){
        if(p->data == x)
            return count + 1; //对应第count位
        count ++;
        p = p->next;
    }
    return 0;
}

template<class DataType>
void LinkList<DataType>::Insert(int i,DataType x){
    Node<DataType> *s,*p = first;
    int count = 0;
    while(p != nullptr && count < i-1){ //令p指向第i-1个结点
        p = p->next;
        count++;
    }
    if(p == nullptr) throw"插入位置错误";
    //在p后插入结点
    else{
        s = new Node<DataType>;
        s->data = x;
        s->next = p->next;
        p->next = s;
    }
}

template<class DataType>
DataType LinkList<DataType>::Delete(int i){
    Node<DataType> *s,*p = first;
    int count = 0;
    DataType x;
    while(p != nullptr && count < i-1){//令p指向第i-1个结点
        p = p->next;
        count++;
    }
    if(p == nullptr) throw"删除位置错误";
    //删除第i个结点
    else{
        s = new Node<DataType>;
        s= p->next;
        x = s->data;
        p->next = s->next;
        delete s;
        return x;
    }
}

template<class DataType>
void LinkList<DataType>::PrintList(){
    Node<DataType> *p = first->next;
    while(p != nullptr){
        cout<<p->data<<" ";
        p = p->next;
    }
    cout<<endl;
}

main.cpp:

#include"LinkList.cpp"

int main()
{
  int len;
  double r[5]={1, 2, 3, 4, 5};
  LinkList<double> L(r, 5);
  cout<<"执行插入操作前数据为:"<<endl;
  L.PrintList( );                  //显示链表中所有元素
  cout<<"当前长度为:"<<endl;
  len = L.Length();
  cout<<len<<endl;
  try
  {
    L.Insert(2, 3);
  }
  catch (char *s)
  {
    cout<<s<<endl;
  }
  cout<<"执行插入操作后数据为:"<<endl;
  L.PrintList( );                  //显示链表中所有元素
  cout<<"值为5的元素位置为:";
  cout<<L.Locate(5)<<endl;        //查找元素5,并返回在单链表中位置
  cout<<"执行删除操作前数据为:"<<endl;
  L.PrintList( );                  //显示链表中所有元素
  try
  {
    L.Delete(1);                    //删除元素4
  }
  catch (char *s)
  {
    cout<<s<<endl;
  }
  cout<<"执行删除操作后数据为:"<<endl;
  L.PrintList( );                  //显示链表中所有元
    return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 12:12:08  更:2021-07-17 12:13:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 16:52:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码