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. 前端生成二维码 - Javascript生成二维码(QR)

    前段时间项目中需要动态的生成二维码,经过评估,前后端生成都可以.但后端生成会有两个问题: 没有找到正规发布出来的后端开源库. 二维码图片,会随着商品的增加而不断变多. 基于以上两个问题,决定在前端生成 ...

  2. 分别用js和css实现瀑布流

    下午查找了瀑布流的相关原理,找了一些css3实现的还有js实现的,最后总结了一些比较简单的,易懂的整理起来 1.css3实现 只要运用到    column-count分列 column-width固 ...

  3. Callable接口使用以及计算斐波那契数字的数值总和

    一.简单使用 Runnable是执行工作的独立任务,但是它不返回任何值.如果你希望任务完成的时能够返回一个值,那么可以实现一个Callable接口.在Java SE5中引入的Callable是一种具有 ...

  4. 第一个MFC实例:计算圆周长和圆面积

    一.基于Microsoft MFC的编程方法 MFC是微软基础类库(Microsoft Foundation Class)的缩写.与API不同,MFC不是Windows操作系统的组成部分,而是微软公司 ...

  5. [poj2104]kth-number(归并树求区间第k大)

    复杂度:$O(nlog^3n)$ #include<cstdio> #include<cstring> #include<algorithm> #include&l ...

  6. 使用CocoaPods卡在了"pod setup"界面的解决办法

      http://blog.csdn.net/samoy/article/details/51956799   有时候,我们在执行pod install或pod search命令时,会在终端偶现卡在’ ...

  7. MySQL 时间函数加减计算

    一.MySQL 获得当前日期时间 函数 1.1 获得当前日期 + 时间(date + time) 函数:now() mysql> select now();+———————+| now() |+ ...

  8. tensorflow学习笔记----tensorflow在windows的安装及TensorBoard中mnist样例

    前言:                                                                                                 ...

  9. [C++] c language 23 keywords

       c language keywords

  10. chrome crx下载路径

    chrome crx下载后会被删除,可在检查时粘贴出来,下载路径在: %localappdata%\Google\Chrome\User Data\Webstore Downloads 参考:http ...