1.3链表

链表的物理存储结构是用一组地址任意的存储单元存储数据的。不像顺序表占据连续的一段内存空间,而是将存储单元分散在内存的任意地址上。

 

链表结构中,每个数据元素记录都存放到链表的一个节点(node)中,而每个节点之间由指针将其连接在一起,形成了”链“的结构、

链表每个节点中,都必须有一个专门用来存放指针(地址)的域,用这个指针域来存放后继结点的地址,这样就达成了连接后继结点的目的。

一条链表通常有1个”表头“,是一个指针变量,用来存放第一个节点地址。此外,一条链表的最后一个节点的指针域要置空(NULL),表示该节点为链表的尾节点,因为它之没有后继结点了。

 

链表特征:

1)每个节点包括两部分:数据域和指针域。其中数据域用来存放数据元素本身的信息,指针域用来存放后继结点的地址。

2)链表逻辑上是连续的,而物理上不一定连续存储节点、

3)只要获得链表的头节点,就可以通过指针遍历整条链表。

 

实例:编写一个程序,要求:从终端输入一组整数(大于10个数),以0作为结束标志,将这一组整数存放在一个链表中,(结束标志0不包括在内),打印出该链表中的值。然后删除该链表中的第五个元素,打印出删除后的结果。最后在内存中释放掉该链表。

 

#include"stdio.h"
#include"stdlib.h"
typedef int ElemType;typedef struct node{ElemType data;struct node *next;
}LNode,*LinkList;LinkList GreatLinkList(int n) {	//创建一个长度为n的链表 LinkList p,r,list=NULL;ElemType e;int i;for(i=1;i<=n;i++) {scanf("%d",&e);		//输入结点的内容 p=(LinkList)malloc(sizeof(LNode));//为新建的结点开辟内存空间 p->data=e;			//元素赋值 p->next=NULL;if(!list)list=p;			//赋值链表头指针 elser->next=p;		//将结点连入链表 r=p;}return list;		//返回链表头指针 
}void insertList(LinkList *list,LinkList q,ElemType e) {//向链表中插入结点 e LinkList p;p=(LinkList)malloc(sizeof(LNode));//为新建的结点开辟新的内存空间 ,生成一个新结点,由p指向它 p->data=e;					//向该结点的数据域赋值e if(!*list) {*list=p;			//list内容为NULL时,表示该链表为空,赋值链表头指针 p->next=NULL;}					//当链表为空时q没有意义,只能在头结点后面插入第一个元素 else {p->next=q->next;//当链表不为空时,认为q指向的结点一定存在,将q指向的结点的next域的值赋给p指向结点的next域q->next=p;	}
}void delLink(LinkList *list,LinkList q) {	//删除链表的某结点 LinkList r;if(q==*list) {	//如果删除第一个结点 *list=q->next;free(q);}else {			//删除其他结点 for(r=*list;r->next!=q;r=r->next)if(r->next!=NULL) {r->next=q->next;free(q);}}
}void destroyLinkList(LinkList *list) {	//销毁一个链表 LinkList p,q;p=*list;while(p) {	//循环释放掉每一个链表结点 q=p->next;free(p);p=q;}*list=NULL;//将*list的内容置为NULL,这样主函数中的链表list就为空,防止了list变为野指针,而且链表在内存中也完全被释放掉了。
}int main() {int e,i;LinkList l,q;q=l=GreatLinkList(l);//创建一个链表结点,q和l都指向该结点 scanf("%d",&e);while(e) {			//循环输入数据,同时插入新生成的结点 insertList(&l,q,e);q=q->next;scanf("%d",&e);}q=l;printf("the content of the linklist\n");while(q) {			//输出链表中的内容 printf("%d",q->data);q=q->next;}q=l;printf("\nDelete the fifth element");for(i=0;i<4;i++) { //将指针q指向链表的第五个元素 if(q==NULL) {	//确保此时链表的长度大于等于5,否则将是非法操作 printf("the length of the linklist is  smaller than 5!");}q=q->next;}delLink(&l,q);	//找到链表中第五个元素,用q指向它,再删除q所指的结点 q=l;while(q) {		//打印出删除后的结果 printf("%d",q->data);q=q->next;}destroyLinkList(&l); 	//销毁该链表 return 0;
}

  

创建链表注意:

(1)用malloc()函数在内存的动态存储区(堆内存)中开辟一块大小为sizeof(LNode)的空间,并将其地址赋给LinkList类型变量p,(LinkList为指向LNode变量的类型,LNode为前面定义的链表结点类型)。然后将数据e存入该结点的数据域data,指针域存放NULL。

(2)若指针变量list为空,说明本次生存的结点是第一个结点……

(3)若指针变量list不为空,说明本次生存的结点不是第一个结点,将p赋给r->next。此处的r是一个LinkList类型变量,永远指向原先链表的最后一个结点,也就是要插入结点的前一个结点。

(4)再将p赋值给r,目的是使r再次指向最后的结点,以便生成链表的下一个结点,即保证r永远指向原先链表的最后一个结点。

(5)重复(1)~(4)n次,生成n个结点的链表

(6)最后生成的链表的头指针list返回主调函数,通过list就可以访问到该链表的每一个结点。

 

删除链表注意:

从非空链表删除q所指的结点,考虑3种情况:

(1)q所指向的是链表的第一个结点

(2)q所指向的结点的前驱结点的指针已知

(3)q所指向的结点的前驱结点的指针未知

 

销毁链表注意

链表使用完建议销毁,因为链表本身会占用内存空间。若一个系统中使用很多链表,而使用完又不及时销毁,那么这些垃圾空间积累过多,最终导致内存的泄露甚至程序的崩溃。

 

————————————————————————

————————————————————————

程序运行时候,删除第5个元素,没有显示出预期结果。运行环境在DEV。

转载于:https://www.cnblogs.com/dd2hm/p/6838694.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移植opencv3.20到3556AV100

1.移植环境&#xff1a; Ubuntu14.04 arm-hisiv200-linux-opencv3.20 下载地址 2.移植步骤&#xff1a; 1&#xff09;安装cmake-gui 2&#xff09;新建一个opencv目录存放opencv-3.2.0.zip&#xff0c;并解压 击Browse Source选择~/hisi/opencv/opencv-3.2.0 点击Brow…

ngnix 详解

4 Nginx的rpm软件包安装 4.1 安装包在位置 D:\讲课内容--\新巴巴运动网\nginx高并发解决\nginx安装包 4.2 此种安装方式不用安装gcc等编译工具 4.3 安装命令如下 rpm –ivh nginx 5 配置虚拟主机 5.1 什么是虚拟主机 虚拟主机是一种特殊的软硬件技术&#xff0c;它可以将网络上…

iscroll5制作上下拉刷新 tab出现的问题

1.iscoll5插件刷新后如果想改变现实位置如果向下几px可以用 myScroll.scrollBy(0,0);方法&#xff0c;该值是相对当前位置。 2.iscoll5用到tab的时候&#xff0c;用点击生成iscoll对象出现取消不了之前的对象的绑定事件&#xff0c;点击多次后刷新执行多次的问题&#xff0c;解…

初谈逻辑读、物理读、预读

前言&#xff1a; 该文并不全是本人原创&#xff0c;里面的某些原理来自于CareySon。 SQL SERVER数据存储的形式 要理解逻辑读、物理读、预读这三个概念&#xff0c;先要搞懂SQL Server的数据存储方式。 SQL Server数据库包括数据文件和日志文件&#xff0c;一个数据库可以有一…

Makefile常用万能模板(包括静态链接库、动态链接库、可执行文件)

1、生成可执行文件的makefile2、生成静态链接库的makefile3、生成动态链接库的makefile 本文把makefile 分成了三份&#xff1a;生成可执行文件的makefile&#xff0c;生成静态链接库的makefile&#xff0c;生成动态链接库的makefile。 这些makefile都很简单&#xff0c;一般都…

TSQLDBServerHttpApi使用工作线程池

TSQLDBServerHttpApi使用工作线程池 TSQLDBServerHttpApi创建时&#xff0c;默认是使用单线程模式&#xff0c;且只使用一个数据库连接&#xff0c;服务端要应对众多的客户端只靠一个工作线程&#xff08;主线程&#xff09;和一个数据库连接&#xff0c; 服务端主线程不忙死才…

hibernate

Hibernate是一个开放源代码的对象关系映射框架&#xff0c;他对JDBC进行了轻量级的封装&#xff0c;使Java开发员可以随心所欲的使用对象编程思维操作数据库。 SessionFactory接口负责初始化Hibernate.他充当数据储存源的代理&#xff0c;并负责创建Session对象。 Session&…

Python数据分析之pandas入门

一、pandas库简介 pandas是一个专门用于数据分析的开源Python库&#xff0c;目前很多使用Python分析数据的专业人员都将pandas作为基础工具来使用。pandas是以Numpy作为基础来设计开发的&#xff0c;Numpy是大量Python数据科学计算库的基础&#xff0c;pandas以此为基础&#x…

激光雷达和毫米波雷达的区别

什么是激光雷达 激光雷达&#xff0c;是以发射激光束探测目标的位置、速度等特征量的雷达系统。其工作原理是向目标发射探测信号&#xff08;激光束&#xff09;&#xff0c;然后将接收到的从目标反射回来的信号&#xff08;目标回波&#xff09;与发射信号进行比较&#xff0c…

Git—使用方法

1、:插件的安装&#xff08;eclipse LUNA版本之后已经自动集成&#xff0c;不需要安装插件&#xff09;、 * 先打开该网页提供了对应版本的EGit&#xff0c;自己选择相应的版本。&#xff08;http://wiki.eclipse.org/EGit/FAQ#Where_can_I_find_older_releases_of_EGit.3F&…

激光雷达与毫米波雷达对比

激光雷达是一种采用非接触激光测距技术的扫描式传感器&#xff0c;其工作原理与一般的雷达系统类似&#xff0c;通过发射激光光束来探测目标&#xff0c;并通过搜集反射回来的光束来形成点云和获取数据&#xff0c;这些数据经光电处理后可生成为精确的三维立体图像。采用这项技…

安全可靠国产系统下的应用怎么搭建?

据国家信息安全漏洞共享平台&#xff08;CNVD&#xff09;统计数据&#xff0c;2016年我国共收录通用软硬件漏洞 10822个&#xff0c;漏洞来源涵盖了众多知名的国外厂商。应用软件的不安全性对我国信息技术发展产生了重大威胁&#xff0c;近年来我国频繁发布信息安全相关政策&a…

Win10 + Python + MXNet + VS2015配置

项目需要使用MTCNN来检测、对齐、剪切出人脸&#xff0c;它是使用MXNet作为框架的&#xff0c;但是我自己的Ubuntu里各种框架乱成一团&#xff0c;不想再添乱就铁了心要在windows里配一个。无奈网上的资料不多&#xff0c;挣扎了几天之后决定留下这么一份文档。 首先我们使用的…

bzoj 3224 Tyvj 1728 普通平衡树

题目大意&#xff1a; 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一些数&#xff0c;其中需要提供以下操作&#xff1a; 1. 插入x数 2. 删除x数(若有多个相同的数&#xff0c;因只删除一个) 3. 查询x数的排名(若有多个相同的数&#xff0c…

不懂毫米波雷达?5分钟读懂毫米波雷达的那些事儿

2019年是毫米波风生水起的一年&#xff0c;也是毫米波名声大噪的一年。毫米波应用范围广泛&#xff0c;如毫米波雷达、毫米波天线等。而本文&#xff0c;将向大家介绍毫米波雷达&#xff0c;主要内容包括&#xff1a;毫米波雷达原理、毫米波雷达主要特点、毫米波雷达优势以及毫…

飞鸽传书(IPMSG)协议(翻译稿)

协议声明&#xff1a; 本协议是由日本人Shirouzu Hiroaki &#xff08;白水 启章&#xff09;先生编写。 wanpengcoder翻译于Mr.Kanazawa英文文档&#xff0c;转载请注明出处。 http://www.cnblogs.com/wanpeng/ 如有翻译不当之处望提出&#xff0c;以便改进&#xff0c;衷心感…

redis集群的搭建

########环境######### centos 7.2 , gcch 环境ruby 2.0.0 redis 3.2.8 redis-3.3.3gem 公司要求搭建redis集群, 本来觉得挺好搞的,没想到弄到现在.... 1, 环境准备 gcc , ruby 等环境准备 yum -y install gcc ruby ruby-devel rubygems rpm-build zlib redis-ruby接口安装, 我…

2017-2018-1 20155227 《信息安全系统设计基础》第十三周学习总结

2017-2018-1 20155227 《信息安全系统设计基础》第十三周学习总结 找出全书你认为最重要的一章&#xff0c;深入重新学习一下&#xff0c;要求&#xff08;期末占10分&#xff09;&#xff1a; 完成这一章所有习题详细总结本章要点给你的结对学习搭档讲解你的总结并获取反馈我选…

进程间五种通信方式

进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同进程之间传播或交换信息。 IPC的方式通常有管道&#xff08;包括无名管道和命名管道&#xff09;、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机…

电子书下载:Silverlight 5 in Action

下载&#xff1a;http://www.ctdisk.com/file/8447319