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语言实现的更多相关文章

  1. 读书笔记之:C语言深度剖析

    读书笔记之:C语言深度剖析 <C 语言深度解剖>这本书是一本“解开程序员面试笔试的秘密”的好书.作者陈正冲老师提出“以含金量勇敢挑战国内外同类书籍”,确实,这本书中的知识点都是一些在面试中 ...

  2. 《30天自制操作系统》读书笔记(3) 引入C语言

    这一次的学习相当曲折, 主要是因为粗心, Makefile里面的错误导致了文件生成出现各种奇奇怪怪的问题, 弄得心力交瘁, 因此制作过程还是尽量按着作者的路子来吧. 作者提供的源码的注释在中文系统下是 ...

  3. 《Go程序设计语言》读书笔记-函数

    函数包含连续执行的语句,可以使用代码中通过调用函数来执行他们,函数能够将一个复杂的工作切分成多个更小的模块,使多人写作变得容易.另外,函数对他的使用者隐藏了实现细节.这几方面的特性使得函数成为多数编程 ...

  4. 《时间序列分析及应用:R语言》读书笔记--第二章 基本概念

    本章介绍时间序列中的基本概念.特别地,介绍随机过程.均值.方差.协方差函数.平稳过程和自相关函数等概念. 2.1时间序列与随机过程 关于随机过程的定义,本科上过相关课程,用的是<应用随机过程&g ...

  5. 《R语言实战》读书笔记--第一章 R语言介绍

    1.典型的数据分析过程可以总结为一下图形: 注意,在模型建立和验证的过程中,可能需要重新进行数据清理和模型建立. 2.R语言一般用 <- 作为赋值运算符,一般不用 = ,原因待考证.用-> ...

  6. <编程精粹:编写高质量C语言代码> 读书笔记

    0.规则<The Elements of Programming Style><The Elements of Style> 1.假想的编译程序(1)使用编译器提供的所有的可选 ...

  7. 【读书笔记】《C语言 从入门到精通》(第三版)笔记

    C语言,上学的时候都没学好,没想到现在却靠它吃饭.因为对C语言还是比较熟悉,所以买这本书是用来当"字典"用的.所以下面的笔记不会有很基础的内容. 1.书籍介绍 2.结构体 3.[C ...

  8. <JavaScript语言精粹>--<读书笔记三>之replace()与正则

    今天有人问我repalce(),他那个题目很有意思.我也不会做,于是我就去查,结果发现就是最基础的知识的延伸. 所以啊最基础的知识才是很重要的,千万不能忽略,抓起JS就写代码完全不知到所以然,只知道写 ...

  9. <JavaScript语言精粹>-读书笔记(一)

    用object.hasOwnProperty(variable)来确定这个属性名是否为该对象成员,还是来自于原型链. for(my in obj){ if(obj.hasOwnProperty(my) ...

随机推荐

  1. 包(package)

    防止文件重名,包体现在文件夹上.包必须建立文件夹. 类名的全称是:包名.类名 javac   xx.java 命令编译的时候,不会建立对应的文件夹, 建立包对应的文件夹的命令,要用 javac -d ...

  2. c++内存流

    1.MemoryStream.h文件内容 ifndef _MEM_STREAM_H_ #define _MEM_STREAM_H_ #include <string> class CMem ...

  3. 第三方 XListview 上拉加载、下拉刷新、分页加载和Gson解析

    注意:此Demo用的是第三方的Xlistview.jar,需要复制me文件夹到项目中,两个XML布局文件和一张图片 把下面的复制到String中 <string name="xlist ...

  4. hdu1285 确定比赛名次(拓扑排序)

    确定比赛名次 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  5. Hrbustoj 2266 Legendary Weights(辗转相除求最大公约数)

    题意:这个题目的意思是给出一些砝码,问我们能不能根据这些砝码称量出任意重量的物品,最大公约数并不难求,难的在于如何建立这个模型. 思路:根据数论的基础知识,两个数a,b的最大公约数是a*x + b*y ...

  6. SORT函数的使用方法(转载)

    sort函数的用法(转载出处:http://blog.sina.com.cn/s/blog_6439f26f01012xw3.html) 做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己写 ...

  7. 使用cisco SDM管理路由器

    实验拓扑: 实验目的:掌握如何通过SDM对路由器进行管理 实验需求:设置R1使其能够通过SDM进行管理 实验步骤: 步骤一:配置基本IP地址 步骤二:在R1上进行设置,使其能够通过SDM连接 R1(c ...

  8. iOS原生refresh(UIRefreshControl)

    转载:http://www.2cto.com/kf/201504/392431.html // // ViewController.m // 代码自定义cell // // Created by ma ...

  9. C# 经典入门15章-TextBoxControl

    第一步:设计界面如下:

  10. Shorten Diameter

    Shorten Diameter Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB Score : 600 points P ...