《数据结构与算法分析: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) ...
随机推荐
- JAVA-面向对象--封装
1. 如果一个类中没有定义构造函数,会自动加上一个空参的默认构造函数 如果定义了一个构造函数,默认的空参构造函数就没有了. 2. this 当成员变量与局部变量重名的时候,可以使用this来区分.th ...
- C++调用C#之C# COM控件
C#做界面真的是比C++方便多了,所以尝试了一下,使用C++做核心功能(例如绘图),然后用C#来做节目(例如对话框),考虑到以后可能不能使用.net,使用DLL做一个隔离层,隔离C++和C#,方便以后 ...
- UIImageView 的contentMode属性 浅析
UIImageView 的contentMode这个属性是用来设置图片的显示方式,如居中.居右,是否缩放等,有以下几个常量可供设定:UIViewContentModeScaleToFillUIView ...
- Java成员变量默认值
Java中明确规定:1.如果是引用型的,比如:String,还有类对象,他们的默认值都是:null:2.而如果是值类型:double,int,long,float,char等等,他们都是:0:还有一个 ...
- Jenkins中集成python,支持参数生成Makefile文件
#!/usr/bin/env python import os print os.getenv("BUILD_NUMBER") print os.getenv("uuid ...
- as3 组件定义
package kingBook{ import flash.display.MovieClip; import flash.events.Event; import flash.utils.setT ...
- Effective java -- 4 泛型
第二十三条:请不要在代码中使用原生态类型就是像Set这种待泛型的,就把泛型明确写出来. 第二十四条:消除非受检警告就是Set<String> sets = new HashSet();这种 ...
- L2,breakfast or lunch
express: what a day多么糟糕的天气 I‘m coming to see you我将要来看你 what a lot of trouble he is causing他犯了多少错误啊 w ...
- make -jN
今天又一次尝试编译安卓,想测试一下编译的速度如何? 考虑机器是4核8线程,就用上了 make -j8,感觉上上速度是很快,刷屏就下来了,不过错误了,错误的提示大概是某个文件的规则没找到,想想了多线程并 ...
- ANSI X9.8标准 PIN xor PAN获取PIN BlOCK
ANSI X9.8标准 PIN xor PAN获取PIN BlOCK 之前看到几篇介绍,把ANSI说成16个字节,真心扯淡,各种误人子弟,真正的ANSI算法其实是8个字节,具体格式如下: (1) AN ...