《数据结构与算法分析:C语言描述》读书笔记------List的C语言实现
List的简单实现。在GCC下测试通过。
list.h
#ifndef _List_H /*List数据结构的简单实现*/ struct Node; typedef struct Node Node; typedef struct Node * List; typedef struct Node * Position; typedef double ElementType; /* 下面的这些操作可以看做是对List ADT操作的描述。这些操作的描述可以认为和具体的编程语言无关。 */ List MakeEmpty(); int IsEmpty(List L); int IsLast(Position P , List L); Position Find(ElementType X, List L); void Delete(ElementType X,List L); Position FindPrevious(ElementType X, List L); void Insert(ElementType X,List L,Position P); void InsertToFront(ElementType X,List L); void InsertToBack(ElementType X,List L); void DeleteList(List L); Position Header(List L); Position First(List L); Position Tail(List L); Position Advance(Position P); ElementType Retrive(Position P); void PrintList(List L); #endif
list.c
#include "list.h"
#include <stdlib.h>
#include <stdio.h>
struct Node
{
ElementType Element;/*数据*/
Position Next;/*指向下一个节点的指针*/
};
/*初始化一个List,这里的实现是采用了一个“表头节点”,表头节点的存在只是为了方便一些List操作实现上的方便*/
List MakeEmpty()
{
Node * PtrToHeader = (Node *)malloc(sizeof(Node));/*给头结点分配一定的内存空间,PtrToNode是指向这部分空间的指针*/
PtrToHeader -> Next = NULL; /*将头结点的指向下一个节点的指针置为NULL*/
return PtrToHeader;/*返回指向头结点的指针*/
}
/*判断一个List是否为空*/
int IsEmpty(List L)
{
return L->Next == NULL ;
}
/*判断P指向的是不是List中的最后一个元素,参数L在实现中没有用到*/
int IsLast(Position P , List L)
{
return P->Next == NULL;
}
/*找到并返回指定元素的位置,如果找不到,就返回空指针*/
Position Find(ElementType X, List L)
{
Position P = L->Next;
while(P != NULL)
{
if(P->Element == X)
return P;
P = P->Next;
}
return NULL;
}
/*删除指定的元素*/
void Delete(ElementType X,List L)
{
Position P = FindPrevious(X,L);
if(P != NULL)
{
Position temp = P->Next;
P->Next = temp->Next;
free(temp);
}
}
/*返回指定元素的前一个位置,如果List中没有该元素,那么返回NULL*/
Position FindPrevious(ElementType X, List L)
{
Position P = L;
while(P->Next != NULL)
{
if(P->Next->Element == X)
return P;
P = P->Next;
}
return NULL;
}
/*在Position指向的节点的后面插入一个节点*/
void Insert(ElementType X,List L,Position P)
{
Node * PtrToNewNode = (Node *)malloc(sizeof(Node));
PtrToNewNode->Element = X;
PtrToNewNode->Next = P->Next;
P->Next = PtrToNewNode;
}
/*在List前面插入X*/
void InsertToFront(ElementType X,List L)
{
Position P = Header(L);
Insert(X,L,P);
}
/*在List最后插入X*/
void InsertToBack(ElementType X,List L)
{
Position P = Tail(L);
Insert(X,L,P);
}
/*删除List*/
void DeleteList(List L)
{
Position P ,temp ;
P = L->Next;
L->Next = NULL;
while(P != NULL)
{
temp = P->Next;
free(P);
P = temp;
}
}
/*取出P位置上的节点的值*/
ElementType Retrive(Position P)
{
if(P!=NULL)
return P->Element;
}
/*打印一个List*/
void PrintList(List L)
{
Position P = L->Next;
while(P != NULL)
{
printf("%f ",P->Element);
P = P->Next;
}
printf("\n");
}
/*获得头结点的位置*/
Position Header(List L)
{
return L;
}
/*获得第一个节点的位置*/
Position First(List L)
{
return L->Next;/*注意,如果第一个节点不存在那么有可能会返回NULL*/
}
/*获得最后一个节点的位置*/
Position Tail(List L)
{
if(IsEmpty(L))
return NULL;
else
{
Position P = L->Next;
while(P->Next != NULL)
P = P->Next;
return P;
}
}
/*获得P的下一个位置*/
Position Advance(Position P)
{
return P->Next;/*注意,如果P已经是最后一个位置那么有可能会返回NULL*/
}
listTest.c
#include "list.h"
#include <stdio.h>
int main()
{
//生成一个只包含头结点的list
List list = MakeEmpty();
//判断list是否为空
if(IsEmpty(list))
printf("Empty List...");
PrintList(list);
//获得头结点位置(即指向头结点的指针)
Position P = Header(list);
//在头结点之后插入一些数据
Insert(1.0,list,P);
Insert(5.0,list,P);
Insert(6.0,list,P);
PrintList(list);
//获得头结点之后、第一个真正节点的位置
Position Q = First(list);
//在第一个节点之后插入一些数据
Insert(2.0,list,Q);
Insert(3.0,list,Q);
Insert(4.0,list,Q);
PrintList(list);
//删除一些数据
Delete(1.0,list);
Delete(6.0,list);
Delete(3.0,list);
PrintList(list);
//将头结点之后的数据都清空
DeleteList(list);
//在最前面(也就是头结点之后、第一个数据之前)插入数据
InsertToFront(2.0,list);
InsertToFront(1.0,list);
//在list的最后插入数据
InsertToBack(3.0,list);
InsertToBack(4.0,list);
PrintList(list);
//遍历list的方法
Position R = First(list);
while(R!=NULL)
{
printf("%f ", Retrive(R));
//获得R之后的位置
R = Advance(R);
}
printf("\n");
printf("Try to find 3.0...\n");
//查找一个数据
Position S = Find(3.0,list);
if(S!=NULL) printf("%f is finded...\n",Retrive(S));
else printf("Not exists in the list!");
//查找一个数据,然后在该数据之后插入一个数据
Position T = Find(3.0,list);
if(T!=NULL)
Insert(,list,T);
PrintList(list);
}
《数据结构与算法分析:C语言描述》读书笔记------List的C语言实现的更多相关文章
- 读书笔记之:C语言深度剖析
读书笔记之:C语言深度剖析 <C 语言深度解剖>这本书是一本“解开程序员面试笔试的秘密”的好书.作者陈正冲老师提出“以含金量勇敢挑战国内外同类书籍”,确实,这本书中的知识点都是一些在面试中 ...
- 《30天自制操作系统》读书笔记(3) 引入C语言
这一次的学习相当曲折, 主要是因为粗心, Makefile里面的错误导致了文件生成出现各种奇奇怪怪的问题, 弄得心力交瘁, 因此制作过程还是尽量按着作者的路子来吧. 作者提供的源码的注释在中文系统下是 ...
- 《Go程序设计语言》读书笔记-函数
函数包含连续执行的语句,可以使用代码中通过调用函数来执行他们,函数能够将一个复杂的工作切分成多个更小的模块,使多人写作变得容易.另外,函数对他的使用者隐藏了实现细节.这几方面的特性使得函数成为多数编程 ...
- 《时间序列分析及应用:R语言》读书笔记--第二章 基本概念
本章介绍时间序列中的基本概念.特别地,介绍随机过程.均值.方差.协方差函数.平稳过程和自相关函数等概念. 2.1时间序列与随机过程 关于随机过程的定义,本科上过相关课程,用的是<应用随机过程&g ...
- 《R语言实战》读书笔记--第一章 R语言介绍
1.典型的数据分析过程可以总结为一下图形: 注意,在模型建立和验证的过程中,可能需要重新进行数据清理和模型建立. 2.R语言一般用 <- 作为赋值运算符,一般不用 = ,原因待考证.用-> ...
- <编程精粹:编写高质量C语言代码> 读书笔记
0.规则<The Elements of Programming Style><The Elements of Style> 1.假想的编译程序(1)使用编译器提供的所有的可选 ...
- 【读书笔记】《C语言 从入门到精通》(第三版)笔记
C语言,上学的时候都没学好,没想到现在却靠它吃饭.因为对C语言还是比较熟悉,所以买这本书是用来当"字典"用的.所以下面的笔记不会有很基础的内容. 1.书籍介绍 2.结构体 3.[C ...
- <JavaScript语言精粹>--<读书笔记三>之replace()与正则
今天有人问我repalce(),他那个题目很有意思.我也不会做,于是我就去查,结果发现就是最基础的知识的延伸. 所以啊最基础的知识才是很重要的,千万不能忽略,抓起JS就写代码完全不知到所以然,只知道写 ...
- <JavaScript语言精粹>-读书笔记(一)
用object.hasOwnProperty(variable)来确定这个属性名是否为该对象成员,还是来自于原型链. for(my in obj){ if(obj.hasOwnProperty(my) ...
随机推荐
- 字符串编码问题(Ascii、Unicode、UCS-2、GBK、UTF-8)
1.字符编码的发展 第一阶段:ASCII阶段,(American Standard Code for Information Interchange, "美国信息交换标准码),计算机当时只支 ...
- selenium和pythond的区别
selenium和pythond的区别 天宇6169 | 浏览 137 次 2016-03-18 10:25 2016-03-18 12:24 最佳答案 selenium ide是用来录制的!大概 ...
- [转]JSONObject与JSONArray的使用
http://www.cnblogs.com/xwdreamer/archive/2011/12/16/2296904.html 参考文献: http://blog.csdn.net/huangwuy ...
- JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能
主要内容: JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十 ...
- java 子类继承父类成员变量的隐藏、实现方法的重写
成员变量的隐藏和方法的重写 Goods.java public class Goods { public double weight; public void oldSetWeight(double ...
- java 使用对象
class XiyoujiRenwu { float height,weight; String head, ear; void speak(String s) { head="歪着头&qu ...
- Python基础学习6---存储器
Python提供一个标准的模块,称为 pickle .使用它你可以在一个文件中储存任何Python对象,之后你又可以把它完整无缺地取出来.这被称为 持久地 储存对象.还有另一个模块称为 cPickle ...
- robot_framewok自动化测试
robot_framewok自动化测试 http://wenku.baidu.com/view/691abcaa4b73f242336c5fec.html 接口自动化测试框架设计 http://wen ...
- BootStrap详解之(一)
一.BootStrap简介 BootStrap是一个用来构建网站前段框架的一个插件.无论你是想构建应用程序.博客还是CMS网站,Bootstrap都特别的使用,只要你想得到,它就能行.Bootstra ...
- 9、外观模式(Facade)
外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口 ...