线性表--链式实现方式
清明节感冒了,休息了几天。前面实现了顺序方式的线性表,这篇文章笔者会简单的实现
链式方式的线性表。
在实现之前首先需要对其线性表的链式方式的特点做一个了解:
通俗的讲链式线性表就是元素之间逻辑相邻但是物理位置不一定相邻,那么既然物理位置不相邻
又是如何来体现其逻辑位置的呢?其逻辑关系是上一个元素来维护的。链式线性表的每个元素是
保存在结点中的,结点就是一块内存区域。它包含两个区域数据域、指针域。数据域保存元素值
指针域保存下一个结点指向性。
具体如何呢?看看结点数据结构吧:
typedef struct LNode { ElemType data;//节点数据信息域 struct LNode * next;//指向下一个节点的指针 }LNode ,*LinkList;
之后我们来看看其具体的实现和操作,在对链式线性表做一个总结
/** Author Kiritor 线性表的链式实现*/ #include "stdafx.h" #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<malloc.h> #define OK 1 #define OVERFLOW -1 #define ERROR -1 #define TRUE 1 #define FALSE 0 #define ElemType int //线性表的单链表存储结构 typedef struct LNode { ElemType data;//节点数据信息域 struct LNode * next;//指向下一个节点的指针 }LNode ,*LinkList; //初始化单链表 int init_List(LinkList &l) { printf("初始化线性表\n"); //产生一个头结点,并且使L指向头结点 l = (LinkList)malloc(sizeof(LNode)); if(!l) exit(OVERFLOW);//分配空间失败 l->next=NULL;//头结点的指针域为空表示无元素 l->data= 0;//头结点数据域用于表示链表的长度 return OK; } //销毁链式单向线性表 void destory_List(LinkList &l) { printf("销毁线性表"); LinkList q ; /*循环的释放每一个结点的内存空间*/ while(l) { q=l->next; free(l); l=q; } } //将线性表重新置为空表,并非销毁 int clear_List(LinkList &l) { printf("清空线性表,并非销毁\n"); LinkList p,q; p=l->next;//p指向第一个结点 while(p) { q= p->next; free(p); p=q; } //之后将头指针域的指向性设置为空 l->next = NULL; l->data=0; return OK; } //线性表插入(带头结点的) //在第i个位置之前插入e,i值从1开始 int insert_List(LinkList &l,int i,ElemType e) { printf("在第%d个位置插入%d\n",i,e); //首先寻找第i个结点 LinkList q = l,s; int j=0;//用于循环的计数器 while(q&&j<i-1) { q = q->next; j++; } if(!q||j>i-1) { return ERROR; } s=(LinkList)malloc(sizeof(LNode));//生成一个新的结点 s->data=e; s->next=q->next; q->next =s; l->data++;//线性表的长度加1 return OK; } /*取得线性表的i位置的元素,存在返回ok,并将之存在e中 反之返回ERROR,需要注意的是l是带头结点的单链表 */ int getElem(LinkList l,int i,ElemType &e) { LNode * p = l->next ; int count = 1; //初始化,使p指向第一个结点,count为计数器 while(p&&count < i) { p = p ->next ; count++; } //p指针移动到要取得的元素位置的结点处 if(!p||count >i) return ERROR; e=p->data; return e; } /*判断线性表是否为空*/ int isEmpty(LinkList &l) { if(l->data==0) return FALSE; else return TRUE; } /*删除线性表中的某个位置元素 i是从1开始的**/ int delete_LinkList(LinkList &l,int i) { printf("删除线性表%d位置的元素\n",i); int j=0; LinkList p = l; //首先找到要删除的元素的位置 while (p->next&&i>=1&&j<i-1) { p=p->next; j++; } if(!p->next||j>i-1) return ERROR;//删除的位置不合理 LinkList q = p->next; p->next = q->next; free(q); l->data--; return OK; } int _tmain(int argc, _TCHAR* argv[]) { LinkList l; int e; init_List(l); insert_List(l,1,3); insert_List(l,1,4); insert_List(l,1,5); insert_List(l,1,6); printf("第一个位置的元素为%d\n",getElem(l,1,e)); printf("线性表的元素个数;%d\n",l->data); clear_List(l); destory_List(l); _getch(); return 0; }
看看程序的执行结果:
上述执行最重要的还是插入和删除的操作!
插入操作过程:
删除操作过程:
通过代码的阅读就可以看出,链式方式的线性表和顺序方式的线性表的主要区别
在于物理地址上的不连续,而且顺序方式对于插入删除元素开销比链式方式大,但是
顺序方式取得元素的时候更加方便。因此选取那种线性表的时候需要根据实际情况来定!
转载于:https://blog.51cto.com/kiritor/1226737
线性表--链式实现方式相关推荐
- 线性表-链式存储结构
3.6 线性表的链式存储结构 3.6.1 顺序存储结构不足的解决办法 前面我们讲的线性表的顺序存储结构.它是有缺点的,最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费时间.能不能想办法解决 ...
- 线性表----链式表
定义 线性表的链式存储又称单链表,它是指通过任意的存储单元来存储线性表的数据.注意此时的数据在物理地址上不在连续,内存是动态分配的,而且数据是存放在结点中,结点组成链表,每个节点分为数据域和指针域,所 ...
- 数据结构之线性表-链式存储之单链表(一)
本人文笔较差,语文从来不及格,基础不好,写此类文章仅供自己学习,理解队列及其他知识,高手大神请略过.参考书籍 <数据结构与算法分析-Java语言描述> 1.1 单链表简介 线性表的最大的缺 ...
- c语言建立线性表输入,c语言 建立线性表 链式
1.实验目的及要求 通过本实验,进一不了解线性表的操作,熟悉线性表的运算,了解链式存储结构的实现方法和在链式存储条件下实现线性的相关操作. 2.实验内容 用C 语言设计在链式存储结构下,建立.插入.删 ...
- php数据结构链表代码,数据结构之线性表——链式存储结构之单链表(php代码实现)...
/** * * 1. 类LNode用作创建单链表时,生成新的节点. * 2. 类SingleLinkList用于创建单链表以及对单链表的一些操作方法(实例化此类就相当于创建了一个空链表) * 3. C ...
- 数据结构之线性表——链式存储结构之单链表(php代码实现)
<?php /**** 1. 类LNode用作创建单链表时,生成新的节点.* 2. 类SingleLinkList用于创建单链表以及对单链表的一些操作方法(实例化此类就相当于创建了一个空链表)* ...
- 【数据结构 C描述】有两个整数集合 A 和 B 分别用两个线性表 LA 和 LB 表示,求:一个新的集合A=A∪B,A仍然为纯集合,线性表采用链式存储方式。【单链表】
这是我的作业题,作业写完后再附到博客中,可能代码写得很烂.虽然是C语言写的,但是我在其中加入了C++的写法,例如cout.我懒得写printf的格式控制符,所以用cout来输出内容,这样我感觉简便多了 ...
- 实验项目3——基本线性表运算(顺序存储方式)
实验内容 [问题描述] 基本线性表经常进行的运算操作有创建基本线性表.求基本线性表的长度.在基本线性表中查找某个数据元素.在某个位置插入一个新数据元素.在某个线性表中删除某个数据元素以及基本线性表的输 ...
- 总线的集中式仲裁(讲述计时器定时查询方式,独立请求方式,链式查询方式的优缺点)
一.前言 我们知道,计算机有多个I/O模块,可是当多个I/O都发出总线请求时,CPU先解决哪一个I/O设备呢?这时引出总线判优逻辑电路(即总线的仲裁)的概念,它解决了多个主设备(此处指I/O设备)同时 ...
最新文章
- Spark入门教程(二)Spark2.2源码编译及安装配置
- java httpclient访问webservice_java通过HttpClient方式和HttpURLConnection方式调用WebService接口...
- C++知识点7——函数传参
- linux c daemon 程序后台运行函数
- C#将图像文件压缩为AVI文件播放
- 分享我第一次做项目的感受
- 全国计算机等级考试题库二级C操作题100套(第66套)
- 云漫圈 | 寻找无序数组的第k大元素
- raidrive安装失败_记一次RaiDrive映射OneDrive遇到的问题
- 四元数与复数之间的关系
- printk与日志优先级设置
- jq 两个对象合并_Python 标准库实践之合并字典组成的列表
- PS4在Jetson nano下的配对使用,并用ROS接口来控制
- python对比excel重复数据_python入门之对比两份excel表格数据
- shadow 文件详解
- 写了一个svg七巧板拼图的小东西
- HttpClient 爬取百度图片
- 学习笔记 | 二八定律、ABC分析法
- 愚人节的一天(快乐+2)
- CogColorExtractorTool工具功能
热门文章
- python视图函数是什么意思_Flask初学者:视图函数
- 在mysql怎样查询地址和电话_Mysql数据查询
- springboot 微服务_使用 Docker 部署 Spring Boot微服务
- aes 加密_结合RSA与AES实现前后端加密通信
- 使用 bind 搭建DNS 服务器
- 新能源汽车简史——电动汽车沉浮录
- 公司裁员优先裁掉这类员工
- 晚上八点半,一起来聊聊
- LeetCode刷题——字符串转换整数
- android按键事件响应函数,android 响应按键按下的onKeyDown()函数?