线性表的链式存储结构的实现及其应用(C/C++实现)
存档-----------
#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++实现)的更多相关文章
- C++线性表的链式存储结构
C++实现线性表的链式存储结构: 为了解决顺序存储不足:用线性表另外一种结构-链式存储.在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的,每个元素 ...
- C++编程练习(2)----“实现简单的线性表的链式存储结构“
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 对于查找操作,单链表的时间复杂度为O(n). 对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1). 单链表不需要分配存储 ...
- javascript实现数据结构:线性表--线性链表(链式存储结构)
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...
- C 线性表的链式存储实现及插入、删除等操作示例
一.链式存储的优势 线性表的存储可以通过顺序存储或链式存储实现,其中顺序存储基于数组实现(见本人上一篇博客),在进行插入删除等操作时,需对表内某一部分元素逐个移动,效率较低.而链式结构不依赖于地址连续 ...
- typedef struct LNode命名结构指针(线性表的链式存储)
一.typedef 关键字 1. 简介: typedef工具是一个高级数据特性,利用typedef可以为某一些类型自定义名称. 2. 工作原理: 例如我们定义链表的存储结构时,需要定义结点的存储数据元 ...
- 数据结构-线性表的链式存储相关算法(C语言实现)
链表的简单介绍 为什么需要线性链表 当然是为了克服顺序表的缺点,在顺序表中,做插入和删除操作时,需要大量的移动元素,导致效率下降. 线性链表的分类 按照链接方式: 按照实现角度: 线性链表的创建和简单 ...
- 线性表 顺序存储 链式存储 ---java实现
首先抽象出一个线性表抽象类(包括主要的增删操作) public abstract class MyAbstractList<E> { public abstract void add(E ...
- 线性表的链式存储——C语言实现
SeqList.h #ifndef _WBM_LIST_H_ #define _WBM_LIST_H_ typedef void List; typedef void ListNode; //创建并且 ...
- 线性表的链式存储C语言版
#include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...
随机推荐
- 【批处理】shift用法举例
@echo off set sum=0 call :sub sum 1 2 3 4 echo sum=%sum% pause :sub set /a %1=%1+%2 shift /2 if not ...
- ES6中Promise对象个人理解
Promise是ES6原生提供的一个用来传递异步消息的对象.它减少了传统ajax金字塔回调,可以将异步操作以同步操作的流程表达出来使得代码维护和可读性方面好很多. Promise的状态: 既然是用来传 ...
- 【bzoj3809】Gty的二逼妹子序列
Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们 ...
- bzoj 2727: [HNOI2012]双十字
Description 在C 部落,双十字是非常重要的一个部落标志.所谓双十字,如下面两个例子,由两条水平的和一条竖直的"1"线段组成,要求满足以下几个限制: 我们可以找到 5 个 ...
- Python学习(四):模块入门
1.模块介绍 模块:代码实现的某个功能的集合 模块分类: 自定义模块 内置标准模块 开源模块 模块的常用方法: 是否为主文件:__name__ == '__main__' 如果是直接执行的某程序,那么 ...
- SpringMVC配置双数据源,一个java项目同时连接两个数据库
数据源在配置文件中的配置 请点击---> java架构师项目实战,高并发集群分布式,大数据高可用,视频教程 <pre name="code" class=" ...
- Spring Error : No unique bean of type [org.apache.ibatis.session.SqlSessionFactory] is defined
报错信息: Injection of autowired dependencies failed; nested exception is org.springframework.beans.fa ...
- Error in .Call.graphics(C_palette2, .Call(C_palette2, NULL)) : invalid graphics state
在调用ggplpt2包画图时,出现错误 Error in .Call.graphics(C_palette2, .Call(C_palette2, NULL)) : invalid graphics ...
- Git详解之九:Git内部原理
Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式.我个人发现学习这些内容对于理解 Git 的用处和强大是非常重要的, ...
- 关于md5的使用方法
本周工作,学习中用到了,md5. 在我们需要用到md5密码的时候,可以使用: System.Web.Security.FormsAuthentication.HashPasswordForStorin ...