1、线性表链式存储结构及基本操作算法实现

(1)单链表存储结构类的定义:

#include <iostream>
using namespace std;
template <class T>
class LinList
{ private:
ListNode <T> *head; //头指针
int size; //当前的数据元素个数
ListNode <T> *Index(int i); //定位
public:
LinList(void); //构造函数
LinList(T a[],int i)
~LinList(void); //析构函数
int Size(void) const; //取当前数据元素
void Insert(const T& e,int i); //插入
T Delete(int i,T& e); //删除
T GetData(int i); //取数据元素
void GetAll(); //取得所有数据
int countnum(); //元素个数
bool isnull(); //判断列表是否为空
void deleteall(); //删除所有节点
};

(2)初始化带头结点空单链表构造函数实现

template <class T>
LinList <T>::LinList() //构造函数
{
head=new ListNode <T>(); //头指针指向头结点
size=; //size的初值为0
}

(3)利用数组初始化带头结点的单链表构造函数实现

template <class T>
LinList <T>::LinList(T a[],int i)
{
head=new ListNode<T>();
size=;
if(int j=;j<i;j++)
{
ListNode<T>*p;
p=new ListNode<T>(a[i],head->next);
head->next=p;
size++;
}
}

(4)在带头结点单链表的第i个位置前插入元素e算法

template <class T>
void LinList<T>::Insert(const T& e,int i); //插入
{
if(i<||i>size-)
{
cout<<"参数i越界出错!"<<endl;
exit();
}
ListNode <T> *p=Index(i-); //p为指向第i-1个结点的指针
//构造新结点q的data域值为item,next域值为p->next
ListNode <T> *q=new ListNode <T> (e,p->next);
p->next=q; //新结点插入第i个结点前
size++; //元素个数加1 }

(5)在带头结点单链表中删除第i个元素算法

template <class T>
T LinList<T>::Delete(int I,T& e); //删除
{
if(size==)
{
cout<<"链表已空无可删"<<endl; }
if(i<||i>size-)
{
cout<<"参数i越界出错!"<<endl;
exit();
}
ListNode <T> *s,*p=Index(i-); //p为指向第i-1个结点指针
s=p->next; //s指向第i个结点
p->next=p->next->next; //第i个结点脱链
T x=s->data;
e=x;
delete s; //释放第i个结点空间
size--; //结点个数减1
return e; //返回第i个结点的data域值
}

(6)遍历单链表元素算法

template <class T>
void LinList<T>::GetAll()
{
for(int i=;i<=size-;i++)
{
cout<<GetData(i)<<" ";
}
cout<<endl;
}

(7)求单链表表长算法。

template <class T>
int LinList<T>::Size(void) const
{
return size;
}

(8)判单链表表空算法

template <class T>
bool LinList<T>::isnull()
{
if(size==)
{
cout<<"为空"<<endl;
return ;
}
else
{
cout<<"非空"<<endl;
return ;
}
}

(9)获得单链表中第i个结点的值算法

template <class T>
T LinList<T>::GetData(int i)
{
if(i<||i>size-)
{
cout<<"参数i越界出错!"<<endl;
exit();
}
ListNode<T>*p=Index(i)
return p->data;
}

主函数调用

#include <iostream>
#include"LinList.h"
using namespace std;
int main()
{
LinList<int>li1335;
int s[]={,,,,,,,,,};
int e;
for(int i=;i<;i++)
li1335.Insert(s[i],i);
li1335.Delete(,e);
li1335.GetAll();
li1335.isnull();
li1335.deleteall();
li1335.isnull();
return ;
}

===========================================================

2、参考单链表操作定义与实现,自行完成单循环链表的类的定义与相操作操作算法。

(1)利用数组初始化带头结点的单循环链表构造函数实现

template <class T>
CircleList::CircleList(T a[],int n) //创建方式大同小异,唯一的区别就是创建的最后将尾结点指向头结点
{
if(n<)
cout << "你输入的长度不正确 " << endl;
else
{
length = n;
ListNode<T>*p,*q; //定义头尾节点
p = head;
for(int i=;i<n;i++)
{
q = new ListNode<T>();
q->data=a[i];
q->next = head;
p->next = q;
p = q;
}
}
}

(2)在带头结点单循环链表的第i个位置前插入元素e算法

template <class T>
void CircleList::insertNode(int n,T data)
{
Node *q,*p = new Node();
p->data = data;
q = head;
for(int i = ;i<n;i++)
q = q->next;
p->next = q->next;
q->next = p;
length++;
}

(3)在带头结点单循环链表中删除第i个元素算法

template <class T>
void CircleList<T>::deleteNode(int i) //删除i位置的结点
{
if(i<||i>length)
{
cout<<"参数i越界错误\n";
exit();
}
else
{
ListNode<T> *p,*q;
p = head;
for(int j=;j<i;j++)
p=p->next;
q = p->next;
p->next = q->next;
delete q;
q = NULL;
length--;
}
}

3、采用链式存储方式,并利用单链表类及类中所定义的算法加以实现线性表La,Lb为非递减的有序线性表,将其归并为新线性表Lc,该线性表仍有序(未考虑相同时删除一重复值)的算法。

template<class T>
void sort1(int c,int d,T a[],T b[],LinList<T>li)
{
int amin=,bmin=;
for(int i=;i<c+d;i++)
{
if(amin==c)
{
for(int j=bmin;j<d;j++,i++)
li.Insert(b[j],i);
break;
}
if(bmin==d)
{
for(int j=amin;j<c;j++,i++)
li.Insert(a[j],i);
break;
}
if(a[amin]>b[bmin])
{
li.Insert(b[bmin],i);
bmin++;
}
else if(a[amin]<b[bmin])
{
li.Insert(a[amin],i);
amin++;
}
else
{
li.Insert(a[amin],i);
amin++;
bmin++;
} }
li.GetAll();
}

c++实验3 链式存储线性表的更多相关文章

  1. C 线性表的链式存储实现及插入、删除等操作示例

    一.链式存储的优势 线性表的存储可以通过顺序存储或链式存储实现,其中顺序存储基于数组实现(见本人上一篇博客),在进行插入删除等操作时,需对表内某一部分元素逐个移动,效率较低.而链式结构不依赖于地址连续 ...

  2. 队列链式存储 - 设计与实现 - API函数

    队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - API函数 队列也是一种特殊的线性表:可以用线性表链式存储来模拟队列的链式存储. 主要代码: // linkqueue.h // 队列链式 ...

  3. javascript实现数据结构:线性表--线性链表(链式存储结构)

    上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...

  4. [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)

    优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...

  5. C++编程练习(2)----“实现简单的线性表的链式存储结构“

    单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 对于查找操作,单链表的时间复杂度为O(n). 对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1). 单链表不需要分配存储 ...

  6. 线性表->链式存储->双向链表

    文字描述 之前的链表(单链表.循环链表)的链式存储结构中只有一个指示直接后继的指针域.由此,从某个结点出发只能顺指针往后寻查其他结点.若要寻查结点的直接前驱,则需从表头指针出发.即单链表中,NextE ...

  7. 线性表->链式存储->循环链表

    文字描述 循环链表是另一种形式的链式存储结构.它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环.由此,从表中任一结点出发均可找到表中其他结点. 示意图 算法分析 插入.删除.查找等同单 ...

  8. 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)

    温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift ...

  9. 线性表的Java实现--链式存储(单向链表)

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在 ...

随机推荐

  1. KVM镜像image 转换 调整

    qemu-img create -f raw test.raw 8G 创建一个raw格式,大小为8G的镜像. qemu-img info disk1.qcow2     #查看镜像大小及实际占用多少空 ...

  2. springMVC环境搭建(1)

    工作一年以来,写的都是.net,最近比较闲,想把之前学过的java相关的东西捡起来,也学点新的东西.以前做过SSH架构,一直好奇spring mvc是怎么样的,所以今天试试看. 总体的代码结构 手动输 ...

  3. 手动为 Team Foundation Server 安装 SQL Server

    本主题中的步骤适用于安装 SQL Server 2012 企业版,你也可以使用安装标准版的相同步骤. 适用于 SQL 2014 的步骤与以上步骤也非常相似. 我们将在 TFS 所在的同一服务器上安装 ...

  4. redis centos7

    官网下载tar包 make 修改conf 修改 启动脚本 utils/redis_init_script 开放端口6379

  5. 【转】H5+css布局+js+前端和移动端ui+其他汇总

    无意间发现一个博客比较好,由于内容比较多,就把链接转过来,先保存着方便看的时候看. 感谢博主“张果” +++++++++++++++++++++++++++++++++++++++++++++++++ ...

  6. windows系统mysql-5.7.19官方绿色版zip包安装教程

    环境: 系统环境 Windows 10 64位 mysql版本 5.7.19 一.万变不离的下载 下载页面:https://dev.mysql.com/downloads/mysql/ 点击 Down ...

  7. git使用报错: fatal: Couldn't find remote ref master的解决方法

    fatal: Couldn't find remote ref master 翻译过来就是:致命的:无法找到远程参考主,也就是报错的意思.错误的提示内容意思是找不到需要连接的对象. 解决方法有以下几种 ...

  8. -other linker flags - 详解

    • 值:-objC,-all_load,-force_load

 • -objC: 在iOS 中,使用-all_load时,如果静态库中有类别时会出问题,使用其他两个值则不会有问题.

 • -al ...

  9. 搭建自己的MQTT服务器

    搭建自己的MQTT服务器 物联网电子世界 百家号08-2903:04 MQTT协议是广泛应用的物联网协议,使用测试MQTT协议需要MQTT的代理.有两种方法使用MQTT服务,一是租用现成的MQTT服务 ...

  10. ASP.NET MVC 跨controller函数调用

    var controller = DependencyResolver.Current.GetService<ControllerClassName>(); controller.User ...