线性表的链式存储结构的实现及其应用(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 ...
随机推荐
- 用过的关于css的知识
1.代码片段 让两个div并排起来显示. <div style="width:1000px; text-align:center;" id="content&quo ...
- awk 字符拼接
i-6gdkkemx 2 2 #cat cpu.txt | awk '{print $1,$2"核"$3"G"}' i-6gdkkemx 2核2G
- oracle初级(续)
有志者.事竟成,破釜沉舟,百二秦关终属楚: 苦心人.天不负,卧薪尝胆,三千越甲可吞吴. oracle基本简单的用法,之前的笔记稍作整理一下,希望对各位有用,如有问题可在下方留言,所有SQL都是经过or ...
- web网站嵌入QQ临时会话代码 ----转载----小技巧
第一种 <img style="CURSOR: pointer" onclick="javascript:window.open('tencent://messag ...
- ES6 Proxy和Reflect (上)
Proxy概述 Proxy用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种"元编程"(meta programming),即对编程语言进行编程. Proxy可以理 ...
- python 中一些关键字的区别
一.raw_input 和input input和raw_input都可以读取控制台的输入,但是input和raw_input在处理数字时是有区别的 1.当输入为纯数字时 input返回的是数值类型, ...
- vue2.0父子组件以及非父子组件如何通信
1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: <parent> <child :child-msg="msg" ...
- Vue 爬坑之路(三)—— 使用 vue-router 跳转页面
使用 Vue.js 做项目的时候,一个页面是由多个组件构成的,所以在跳转页面的时候,并不适合用传统的 href,于是 vue-router 应运而生. 官方文档: https://router.vue ...
- 使用@contextmanager装饰器实现上下文管理器
通常来说,实现上下文管理器,需要编写一个带有__enter__和 __exit__的类,类似这样: class ListTransaction: def __init__(self, orig_lis ...
- SpringMVC 支持使用Servlet原生API作为目标方法的参数
具体支持一下类型: * HttpServletRequest * HttpServletResponse * HttpSession * java.security.Pricipal * Locale ...