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. Unity协程使用经验

    [Unity协程使用经验] 1.协程的好处是,异步操作发起的地方和结束的地方可以统一在一个方法,这样就不用引入额外的成员变量来进行状态同步. 2.在一个协程中,StartCoroutine()和 yi ...

  2. Excel VBA 入门(零)

    本教程所用系统环境: Windows 10 Excel 2013 1. 添加开发工具 打开Excel,依然找到"文件"->"选项"->"自 ...

  3. c# 遍历一个对象里面的全部属性

    比如我现在有一个Student的对象,里面有属性stuName,stuAge,stuGender,我现在该怎么写循环才能遍历这几个属性? Student s=new...... foreach (Sy ...

  4. eclipse导入web项目报错 Cannot find the class file for javax.servlet.ServletContext.

    当eclipse中新导入的Java Project的时候,往往会碰到各种各样的问题,下面是个典型的问题: Cannot find the class file for javax.servlet.Se ...

  5. 深入理解yield-乾颐堂

    yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法. 只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: 1 2 3 def ad ...

  6. AJAX和DHTML

    DHTML: (动态的html)本身不是一门新语言,而是一门新技术,包含以下 html . css . dom . js AJAX  :  也是一门新技术包含    html . css.  dom ...

  7. HUST软件测试1504班: 第0周作业成绩

    说明 本次公布的成绩包含三次作业的结果: 毕博平台课前测试题 第0周作业1:开设博客 第0周作业2:博客阅读和思考 如果同学对作业结果存在异议,可以: 在线平台的第一周在线答疑中创建话题申诉. 或直接 ...

  8. 实践作业3:白盒测试----junit的难点DAY11.

    本次白盒测试 需要独立完成整个项目和工具的配置安装运行操作,并编写.运行测试脚本,并完成实验的一些小细节等等. 首先,导入Junit测试框架所需的Jar包 然后编写测试脚本,为.java运行程序,见打 ...

  9. Spring Boot利用poi导出Excel

    至于poi的用法就不多说了,网上多得很,但是发现spring boot结合poi的就不多了,而且大多也有各种各样的问题. public class ExcelData implements Seria ...

  10. 36 有n个整数,使其前面各数顺序向后移n个位置,最后m个数变成最前面的m个数

    题目:有n个整数,使其前面各数顺序向后移n个位置,最后m个数变成最前面的m个数 public class _036ExchangeSite { public static void main(Stri ...