存档-----------

 #include <iostream.h>
typedef char ElemType;
#include "LinkList.h"
void main()
{
LinkList h;
ElemType e;
int i=;
int t=;
cout<<"(1)初始化单链表h\n";
InitList(h);
cout<<"(2)单链表为"<<(ListEmpty(h)?"空":"非空")<<endl;
cout<<"(3)依次输入字母序列,以'#'结束"<<endl;
cin>>e;
i=;
while(e!='#')
{
ListInsert(h,i,e);
i++;
cin>>e;
}
cout<<"(4)输出单链表h:";
PrintList(h);
cout<<"(5)单链表h的长度="<<ListLength(h)<<endl;
cout<<"(5)单链表h为"<<(ListEmpty(h)?"空":"非空")<<endl;
cout<<"(6)测试GetElem(L,i,e)函数,请输入i的值"<<endl;
cin>>i;
t=GetElem(h,i,e);
if(t)
cout<<"(6)单链表h的第"<<i<<"个元素="<<e<<endl;
else
cout<<"(6)单链表h的第"<<i<<"个元素不存在\n";
cout<<"(7)测试LocateElem(L,e)函数,请输入e的值"<<endl;
cin>>e;
t=LocateElem(h,e);
if(t)
cout<<"(7)元素"<<e<<"的位置="<<t<<endl;
else
cout<<"(7)元素"<<e<<"不存在\n";
cout<<"(8)测试ListInsert(L,i,e)函数,请输入i的值和e的值"<<endl;
cout<<"请输入i的值:";
cin>>i;
cout<<"请输入e的值:";
cin>>e;
cout<<"(8)在第"<<i<<"个元素位置上插入"<<e<<"元素:";
t=ListInsert(h,i,e);
if(t)
cout<<"成功!\n";
else
cout<<"失败!\n";
cout<<"(9)输出单链表h:";
PrintList(h);
cout<<"(10)测试ListDelete(L,i,e)函数,请输入i的值"<<endl;
cin>>i;
cout<<"(10)删除h的第"<<i<<"个元素:";
t=ListDelete(h,i,e);
if(t)
cout<<"成功!\n";
else
cout<<"失败!\n";
cout<<"(11)输出单链表h:";
PrintList(h);
cout<<"(12)释放单链表h\n";
DestoryList(h);
}
 typedef struct LNode//定义单链表结点类型
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
int InitList(LinkList &L)
{
//初始化只含有头结点的空的单链表
L=new LNode;//创建头结点
if(L==NULL)
{
cout<<"结点分配失败\n";
return ;
}
L->next=NULL;
return ;
}
void ClearList(LinkList &L)
{
//清空单链表,仅保留头结点
LinkList p;
while(L->next)
{
p=L->next;
L->next=p->next;
delete p;
}
}
int ListLength(LinkList L)
{
//返回单链表的长度
LinkList p=L;
int i=;
while(p->next!=NULL)//数到最后一个结点为止
{
i++;
p=p->next;
}
return i;
}
void PrintList(LinkList L)
{
//顺序输出单链表中的各元素
LinkList p=L->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
bool ListEmpty(LinkList L)
{
//判断是否为空链表
if(L->next==NULL)
return true;
else
return false;
}
int GetElem(LinkList L,int i,ElemType &e)
{
//用e返回单链表L中第i个元素的值
if(i<)
return ;
LinkList p=L->next;
int j=;
while(j<i&&p!=NULL)
{
p=p->next;
j++;
}
if(p==NULL)//j<i,但p为空指针了,即i超出了[1...n]范围了
return ;
else
{
e=p->data;
return ;
}
}
int LocateElem(LinkList L,ElemType e)
{
//返回e元素在单链表L中的位序,若不存在,返回0
LinkList p=L->next;
int n=;
while(p!=NULL&&p->data!=e)
{
p=p->next;
n++;
}
if(p==NULL)//直到最后也没找到等于元素e的结点
return ;
else
return n;
}
int ListInsert(LinkList &L,int i,ElemType e)
{
//在单链表L的第i个数据元素之前插入数据元素e
if(i<)
return ;
int j=;//在1号位置插入时,i-1号位置是0号位置
LinkList p=L,s;
while(j<i-&&p!=NULL)//寻找第i-1个结点
{
p=p->next;
j++;
}
if(p==NULL)//未找到第i-1个结点,即i超出了[1..n+1]时
return ;
else//找到第i-1个结点p
{
s=new LNode;//创建新结点s
if(s==NULL)
{
cout<<"结点分配失败\n";
return ;
}
s->data=e;
s->next=p->next;//将s插入到p之后
p->next=s;
return ;
}
}
int ListDelete(LinkList &L,int i,ElemType &e)
{
//删除单链表L中第i个结点,并用e返回其值
if(i<)
return ;
LinkList p=L,q;
int j=;
while(j<i-&&(p->next)!=NULL)//寻找第i-1个结点,且第i-1号元素不是最后一个元素
{
p=p->next;
j++;
}
if((p->next)==NULL)//未找到第i-1个结点,即i超出了[1..n]
return ;
else//找到第i-1个结点p
{
q=p->next;//q指向要删除的结点
p->next=q->next;//从单链表中删除q结点
e=q->data;
delete q;//释放q结点
return ;
}
}
void DestoryList(LinkList &L)
{
//销毁单链表
LinkList p;
while(L)
{
p=L;
L=L->next;
delete p;
}
L=NULL;
}

运行结果如下:

线性表的链式存储结构的实现及其应用(C/C++实现)的更多相关文章

  1. C++线性表的链式存储结构

    C++实现线性表的链式存储结构: 为了解决顺序存储不足:用线性表另外一种结构-链式存储.在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的,每个元素 ...

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

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

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

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

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

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

  5. typedef struct LNode命名结构指针(线性表的链式存储)

    一.typedef 关键字 1. 简介: typedef工具是一个高级数据特性,利用typedef可以为某一些类型自定义名称. 2. 工作原理: 例如我们定义链表的存储结构时,需要定义结点的存储数据元 ...

  6. 数据结构-线性表的链式存储相关算法(C语言实现)

    链表的简单介绍 为什么需要线性链表 当然是为了克服顺序表的缺点,在顺序表中,做插入和删除操作时,需要大量的移动元素,导致效率下降. 线性链表的分类 按照链接方式: 按照实现角度: 线性链表的创建和简单 ...

  7. 线性表 顺序存储 链式存储 ---java实现

    首先抽象出一个线性表抽象类(包括主要的增删操作) public abstract class MyAbstractList<E> { public abstract void add(E ...

  8. 线性表的链式存储——C语言实现

    SeqList.h #ifndef _WBM_LIST_H_ #define _WBM_LIST_H_ typedef void List; typedef void ListNode; //创建并且 ...

  9. 线性表的链式存储C语言版

    #include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...

随机推荐

  1. LR接口压力测试实战(限量抢红包接口)

    一.业务描述:微信群中,运营人员放出活动链接,用户单击活动链接进入活动页面如下图,用户输入手机号抢红包(红包数量有限) 二.接口测试代码 Action() { lr_rendezvous(" ...

  2. 【ANT】description元素和属性

    <?xml version="1.0" ?> <project default="test"> <description> ...

  3. Ubuntu字符界面输入密码始终提示错误 login incorrect 解决办法

    方法1. 先输入用户名按enter,然后ctrl+alt+f7 切换回图形界面,然后再切换到字符界面输密码 方法2.先输入用户名按enter,然后关闭小键盘上的numlock按键再打开,再输入密码 f ...

  4. du 命令详解

    du : show disk usage  作用:统计目录或文件所占用磁盘空间的大小. 语法:du 参数 选项 参数: -a 为每个制定文件显示磁盘使用情况, 或者为目录中每个文件显示各自磁盘使用情况 ...

  5. vi 和vim 的区别

    它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面.vim的这些优势主要体现在以下几个方面:1.多级撤消我们知道在vi里,按 u只能撤消上次命 ...

  6. 为什么要学ADO.NET。。。什么是ADO.NET。。。

    之前学的 •只能在查询分析器里查看数据,操作数据,我们不能让普通用户去学sql,所以我们搭建一个界面(Web Winform)让用户方便的操作数据库中的数据.   •ADO.NET就是一组类库,这组类 ...

  7. java应用的jar包多合一

    之前开发的java程序由于依赖比较多的jar包,启动命令为" java -classpath .:lib/*.jar 主类名",这种启动方式需要指定类路径.入口类名称,并存在jar ...

  8. Linux发行版 CentOS6.5下的分区操作

    本文地址http://comexchan.cnblogs.com/ ,尊重知识产权,转载请注明出处,谢谢! 查询磁盘信息并作分区规划 执行下述命令查询磁盘信息: fdisk -l 可知.数据盘大小50 ...

  9. [编织消息框架][传输协议]sctp

    OSI(Open System Interconnect),即开放式系统互联. 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互联模型. 该体系结构标准定义了网络互连的七 ...

  10. 前端之 CSS🤖

    css (层叠样式表) : 对html标签的渲染和布局 查找 (选择器) 操作标签 (属性操作) 导入用 link 标签,后面的href就用你的文件路径就好 写css文件,要单独写到一个文件里面去 推 ...