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

 #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. linux定时器crontab

    linux定时器crontab用法: 1.基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示 ...

  2. iOS UIWebView 加载进度条的使用-WKWebView的使用,更新2017.6.26

    1.由于项目中加载网络插件,直接使用了webview加载.使用了三方NJKWebViewProgress进度条的使用,近期在测试时发现,网络缓慢时出现白屏,有卡顿现象. 于是采用了WKWebView进 ...

  3. 【NOIP模拟】从我背后出现

    Description 给定n个点m条边的无向连通图,对于每条边求出强制选这条边后的最⼩⽣成树⼤⼩. \(n\leq 10^5,m\leq 2*10^5\) Input Format 第 1 行包含两 ...

  4. ListView用法总结C#

    ListView是个较为复杂的控件     网上教程写的很乱,C#中文资料太匮乏了,小白叔叔觉得有必要自己出一份了. http://blog.sina.com.cn/s/blog_43eb83b901 ...

  5. geoserver集成以及部署arcgis server瓦片数据

    关注重点: 一般来说,geoserver是不支持arcgis server格式瓦片数据部署的,至少我本机的geoserver版本(2.8.5)以及之前的版本并没有集成进来,不知道目前官网的最新版是否支 ...

  6. mysql创建新用户及新用户不能本地登陆的问题

    最近在搭建hadoop集群,主节点上面安装的MySQL数据库,对着方面不熟悉,为hive.Ooize等服务统一使用的root账号和密码,为了安全一些库对于某些用户是不可见的,所以需要针对不同的服务设置 ...

  7. 基于Vue的SPA动态修改页面title的方法

    最近基于VUE做个SPA手机端web发现动态修改页面标题通过document.title=xxxx 来修改着实蛋疼,而且在IOS的微信端据说没效果.百度发现要针对IOS的微信做点额外的操作,即:创建一 ...

  8. [编织消息框架][JAVA核心技术]动态代理应用1

    前面几篇介绍,终于到了应用阶段啦,我们来做一个RPC来加强学过的知识 做基础核心时先确定解决什么问题,提供什么服务,同将来扩展等 rpc 分两部份,一个是调用者,另一方是服务提供者 调用者只关心那个服 ...

  9. 深入理解 Python 异步编程(上)

    http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...

  10. mysql 编写存储过程

    先看例子: 1.delimiter $$2.drop procedure if exists`test_procedure` $$3.create procedure test_procedure(I ...