数据结构入门之链表(C语言实现)

  这篇文章主要是根据《数据结构与算法分析--C语言描述》一书的链表章节内容所写,该书作者给出了链表ADT的一些方法,但是并没有给出所有方法的实现。在学习的过程中将练习的代码记录在文章中,并添加了一些在测试中需要的函数,因此可能看起来会有点乱。。。

  首先,链表作为一种简单的线性数据结构,主要特征就是“节点”,每个节点包含两个信息,一个是数据域,另外一个是指针域。数据是我们在程序中需要用到的数据,数据类型可以变化,根据需要设定即可,但是指针域就是一个指针,主要作用是指向下一个节点,就是依靠这些指针才将一个一个的节点串起来,就像串辣椒一样,只要提起一串辣椒的头部,那么这一串辣椒中的每一个就都可以按照顺序找到。理解链表的最好的方式就是用图形的方式,其实大部分数据结构教材都是利用图形的方法来讲解大部分数据结构的,人的大脑对图形的理解明显比文字要更好一些。啥都不说了,打开AUTOCAD,画个图。

上图就是一个链表结构,其中A1到A5 是我们要用到的数据,Ptr是指针的名字,箭头指向被指针指向的节点。最左边有一个被称之为头节点的节点,这是一个没有数据,只有指向第一个真正存储数据的节点的节点,有的人在链表中不使用头节点。

下面看看链表的一些操作,首先分析一下,链表需要 一个创建程序,就是创建一个链表,可以叫做CreateList(),还需要判断链表是否为空的,叫做IsEmpty(),还有需要向链表中插入元素,可以叫做Insert(),同样需要删除元素 Delete()。这是最主要的几个操作。

上面提到的书的作者给出了几种方法:

 1 #ifndef _LIST_H_
 2 #define _LIST_H_
 3 
 4 typedef int ElementType;
 5 struct Node;
 6 typedef struct Node *PtrToNode;
 7 typedef PtrToNode List;
 8 typedef PtrToNode Position;
 9 
10 List CreateList();
11 List Makeempty(List L);
12 
13 int IsEmpty(List L);
14 int IsLast(Position P, List L);
15 Position Find(ElementType X,List L);
16 void Delete(ElementType X,List L);
17 Position FindPrevious(ElementType X,List L);
18 void Insert(ElementType X,List L,Position P);
19 void DeleteList(List L);
20 Position Header(List L);
21 Position First(List L);
22 Position Advance(Position P);
23 ElementType Retrieve(Position P);
24 
25 #endif

比较多,但是都比较简单,来看看作者的实现

  1 #include"linkedlist.h"
  2 #include<stdlib.h>
  3 
  4 typedef int ElementType;
  5 struct Node
  6 {
  7     ElementType Element;
  8     Position Next;
  9 };
 10 
 11 void PrintList(List L)
 12 {
 13     Position P;
 14     P = L->Next;
 15     while(P != NULL)
 16     {
 17         printf("%d ",P->Element);
 18         P = P->Next;
 19     }
 20 }
 21 
 22 List CreateList()
 23 {
 24     List L ;
 25     L = malloc(sizeof(struct Node));
 26     L->Next = NULL;
 27     return L;
 28 }
 29 
 30 
 31 
 32 List MakeEmpty(List L)
 33 {
 34     Position P,Tmp;
 35     P = L->Next;
 36     L->Next = NULL;
 37     while(P != NULL)
 38     {
 39         Tmp = P->Next;
 40         free(P);
 41         P = Tmp;
 42     }
 43     return L;
 44 }
 45 void Printlist(List L)
 46 {
 47     Position P;
 48     P = L->Next;
 49     while(P != NULL)
 50     {
 51         printf("%d",P->Element);
 52         P = P->Next;
 53     }
 54 }
 55 
 56 int IsEmpty(List L)
 57 {
 58     return  L->Next == NULL;
 59 }
 60 
 61 int IsLast(Position P,List L)
 62 {
 63     return P->Next == NULL;
 64 }
 65 
 66 Position Find(ElementType X,List L)
 67 {
 68     Position P;
 69     P = L->Next;
 70     while(P != NULL && P->Element != X)
 71         P = P->Next;
 72     return P;
 73 }
 74 
 75 void Delete(ElementType X,List L)
 76 {
 77     Position P, TemCell;
 78     P = FindPrevious(X,L);
 79     if(!IsLast(P,L))
 80     {
 81         TemCell = P->Next;
 82         P->Next = TemCell->Next;
 83         free(TemCell);
 84     }
 85 }
 86 
 87 Position FindPrevious(ElementType X,List L)
 88 {
 89     Position P;
 90     P = L;
 91     while(P->Next != NULL && P->Next->Element != X)
 92         P = P->Next;
 93     return P;
 94 }
 95 
 96 
 97 void Insert(ElementType X ,List L,Position P)
 98 {
 99     Position TmpCell ;
100     TmpCell = malloc (sizeof(struct Node));
101     
102     TmpCell->Element = X;
103     TmpCell->Next = P->Next;
104     P->Next = TmpCell;
105 }

 

转载于:https://www.cnblogs.com/wangxiaoyong/p/6789155.html

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

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

相关文章

centos radius mysql_centos6.5下安装freeradius2.2.9+mysql

平台centos6.5 x86_641&#xff0c;安装源并更新rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpmyum update -y2&#xff0c;安装相关库yum -y install wget expat-devel gcc make gmp-devel gmp pkgconfig perl libpcap gcc-c logrotate…

二手书城开发步骤

请点击进入 1、二手书城设计 2、搭建页面框架 3、构建bass服务及model 4、淘书页详细 5、购物车页详细 6、订单页详细 7、我的页详细 8、发布页详细转载于:https://www.cnblogs.com/xiaoxiaohabi/p/6789349.html

mongoose mysql_mongoose入门

mongoose入门MongoDB是一个开源的NoSQL数据库&#xff0c;相比MySQL那样的关系型数据库&#xff0c;它更显得轻巧、灵活&#xff0c;非常适合在数据规模很大、事务性不强的场合下使用。同时它也是一个对象数据库&#xff0c;没有表、行等概念&#xff0c;也没有固定的模式和结构…

php 验证码需开启gd2

转载于:https://www.cnblogs.com/zhangj391/p/6794555.html

pcm 降采样_Android_android downsample降低音频采样频率代码,使用Android AudioRecord 录制PCM文 - phpStudy...

android downsample降低音频采样频率代码使用Android AudioRecord 录制PCM文件&#xff0c;android SDK保证在所有设备上都支持的采样频率只有44100HZ&#xff0c;所以如果想得到其他采样频率的PCM数据&#xff0c;有几种方式&#xff1a;1.在设备上尝试可用的采样频率&#xf…

C++中没有定义类的引用。

在有时候由于类太大。须要在类在后面定义&#xff1b; 比如&#xff1a; class Y{void f(X); }; class X{ //一些成员数据和函数};//error由于c要求不论什么一个变量在引用之前必须声明。。在上述定义中我们能够调换两者的顺序来实现。 可是假设形成了循环&#xff1f; class X…

python中不能使用下标运算的有哪些_Python中最常见的10个问题(列表)

列表是Python中使用最多的一种数据结果&#xff0c;如何高效操作列表是提高代码运行效率的关键&#xff0c;这篇文章列出了10个常用的列表操作&#xff0c;希望对你有帮助。注意&#xff1a;很多人学Python过程中会遇到各种烦恼问题&#xff0c;没有人帮答疑。为此小编建了个Py…

Spring:与Redis的集成

一个月没写过博客了&#xff0c;一直想记录一下之前学习的Redis的有关知识&#xff0c;但是因为四月太过于慵懒和忙碌&#xff0c;所以一直没有什么机会&#xff0c;今天就来讲讲&#xff0c;如何使用Spring当中的Spring-data-redis去与Redis这个Nosql数据库集成吧。 首先先简单…

python中如何将字典直接变成二维数组_python基础知识(列表、字典、二维数组)...

记得改参数&#xff01;&#xff01;&#xff01;(1)简述列表(list)结构的特点。List(列表)List的元素以线性方式存储&#xff0c;可以存放重复对象&#xff0c;List主要有以下两个实现类&#xff1a;ArrayList : 长度可变的数组&#xff0c;可以对元素进行随机的访问&#xff…

内置对象和自定义对象的原型链

内置对象的原型链 新增属性 Object.prototype.mytest function() {alert("123");}var o new Object();o.mytest();重写属性 Object.prototype.toString function(){alert("破话之王");}o.toString();转载于:https://www.cnblogs.com/Abner5/p/6798630.h…

mysql将不同行数结果合并成多列_将多行合并到mysql中的一行和多列

我正在MYSQL工作,需要将用户数据提取到一个视图中.我将使用电子邮件客户端中的数据,因此我无法在应用程序层中执行此操作.问题是用户的每个数据字段都包含在单独的行中(这是Wordpress如何设置数据结构).例如,wp_usermeta为每个用户提供了多行数据,如下所示&#xff1a;user_id …

一些JavaScript基本函数

1.document.write(”");为 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5.得到表单中元素的名称和值:document.getElementById(”表单…

mysql动态代理_超全MyBatis动态代理详解(绝对干货)

前言假如有人问你这么几个问题&#xff0c;看能不能答上来Mybatis Mapper 接口没有实现类&#xff0c;怎么实现的动态代理JDK 动态代理为什么不能对类进行代理(充话费送的问题)抽象类可不可以进行 JDK 动态代理(附加问题)答不上来的铁汁&#xff0c;证明 Proxy、Mybatis 源码还…

Linux学习之SAMBA共享(无密码)

一、服务器配置 安装&#xff1a;yum install -y samba 更改要共享的path权限&#xff1a;chmod 777 /mnt/samba/ 先备份smb.conf配置文件&#xff1a;cp /etc/samba/smb.conf /etc/samba/smb.conf.bak 更改配置&#xff1a;vim /etc/samba/smb.conf security sha…

getline()函数

本文转自&#xff1a;http://blog.sina.com.cn/s/blog_60263c1c0101ck25.html学习C的同学可能都会遇到一个getline()函数&#xff0c;譬如在Cpremer中&#xff0c;标准string类型第二小节就是“用getline读取整行文本”。书上给的程序如下&#xff1a;int main(){string line:w…

廖雪峰讲python高阶函数求导公式_高阶函数 - 廖雪峰 Python 2.7 中文教程

高阶函数英文叫Higher-order function。什么是高阶函数&#xff1f;我们以实际代码为例子&#xff0c;一步一步深入概念。变量可以指向函数以Python内置的求绝对值的函数abs()为例&#xff0c;调用该函数用以下代码&#xff1a;>>> abs(-10)10但是&#xff0c;如果只写…

.ai域名注册已经极具投资价值进入火爆期

最近G.ai以六位数的天价被国内域名收藏家收入囊中&#xff0c;间接说明了.ai域名的价值不断攀升&#xff0c;自从2016年AlphaGo胜利以来&#xff0c;人工智能几乎成为人人谈资&#xff0c;而由于.com域名被挖掘待尽&#xff0c;一些聪明的人工智能创业者&#xff0c;避开了com域…

软件工程概论---典型用户和用户场景描述

二手书交易平台典型用户——在校学生 名字&#xff1a;小张 年龄&#xff1a;19 收入&#xff1a;学生 代表的用户在市场上的比例和重要性&#xff1a;主要代表广大的大学生&#xff0c;大学生应该是我们产品的最主要用户。 使用这个软件的典型场景&#xff1a;大学生苦于自己的…

python pygame鼠标点击_Python中pygame的mouse鼠标事件用法实例

本文实例讲述了Python中pygame的mouse鼠标事件用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;pygame.mouse提供了一些方法获取鼠标设备当前的状态pygame.mouse.get_pressed - get the state of the mouse buttons get the state of the mouse buttonspygame.mous…

题目1089:数字反转(简单数字转换)

题目链接&#xff1a;http://ac.jobdu.com/problem.php?pid1089 详解链接&#xff1a;https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码&#xff1a; // // 1089 数字反转.cpp // Jobdu // // Created by PengFei_Zheng on 04/05/2017. // Copyright © 2017 Pe…