list.h文件

         /*链表的类型声明*/

         typedef int ElementType;

 /* START: fig3_6.txt */
#ifndef _List_H
#define _List_H struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position; List MakeEmpty( List L );
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 DeleteList( List L );
Position Header( List L );
Position First( List L );
Position Advance( Position P );
ElementType Retrieve( Position P ); #endif /* _List_H */
/* END */

list.c文件

         #include "list.h"
#include <stdlib.h>
#include "fatal.h" /* Place in the interface file */
struct Node
{
ElementType Element;
Position Next;
}; /*创建空链表*/
List
MakeEmpty( List L )
{
if( L != NULL )
DeleteList( L );
L = malloc( sizeof( struct Node ) );
if( L == NULL )
FatalError( "Out of memory!" );
L->Next = NULL;
return L;
} /* START: fig3_8.txt */
/* Return true if L is empty */ /*判断链表是否为空*/
int
IsEmpty( List L )
{
return L->Next == NULL;
}
/* END */ /* START: fig3_9.txt */
/* Return true if P is the last position in list L */
/* Parameter L is unused in this implementation */ /*判断是否为链表的最后元素*/
int IsLast( Position P, List L )
{
return P->Next == NULL;
}
/* END */ /* START: fig3_10.txt */
/* Return Position of X in L; NULL if not found */ /*找某元素的位置*/
Position
Find( ElementType X, List L )
{
Position P; /**/ P = L->Next;
/**/ while( P != NULL && P->Element != X )
/**/ P = P->Next; /**/ return P;
}
/* END */ /* START: fig3_11.txt */
/* Delete from a list */
/* Cell pointed to by P->Next is wiped out */
/* Assume that the position is legal */
/* Assume use of a header node */ /*删除链表某个元素*/
void
Delete( ElementType X, List L )
{
Position P, TmpCell; P = FindPrevious( X, L ); if( !IsLast( P, L ) ) /* Assumption of header use */
{ /* X is found; delete it */
TmpCell = P->Next;
P->Next = TmpCell->Next; /* Bypass deleted cell */
free( TmpCell );
}
}
/* END */ /* START: fig3_12.txt */
/* If X is not found, then Next field of returned value is NULL */
/* Assumes a header */ /*找某个元素的前一个元素*/
Position
FindPrevious( ElementType X, List L )
{
Position P; /**/ P = L;
/**/ while( P->Next != NULL && P->Next->Element != X )
/**/ P = P->Next; /**/ return P;
}
/* END */ /* START: fig3_13.txt */
/* Insert (after legal position P) */
/* Header implementation assumed */
/* Parameter L is unused in this implementation */ /*在某个位置后面插入一个元素*/
void
Insert( ElementType X, List L, Position P )
{
Position TmpCell; /**/ TmpCell = malloc( sizeof( struct Node ) );
/**/ if( TmpCell == NULL )
/**/ FatalError( "Out of space!!!" ); /**/ TmpCell->Element = X;
/**/ TmpCell->Next = P->Next;
/**/ P->Next = TmpCell;
}
/* END */ #if 0
/* START: fig3_14.txt */
/* Incorrect DeleteList algorithm */ void
DeleteList( List L )
{
Position P; /**/ P = L->Next; /* Header assumed */
/**/ L->Next = NULL;
/**/ while( P != NULL )
{
/**/ free( P );
/**/ P = P->Next;
}
}
/* END */
#endif /* START: fig3_15.txt */
/* Correct DeleteList algorithm */ /*删除链表*/
void
DeleteList( List L )
{
Position P, Tmp; /**/ P = L->Next; /* Header assumed */
/**/ L->Next = NULL;
/**/ while( P != NULL )
{
/**/ Tmp = P->Next;
/**/ free( P );
/**/ P = Tmp;
}
}
/* END */ /*返回头结点*/
Position
Header( List L )
{
return L;
} /*返回第一个节点*/
Position
First( List L )
{
return L->Next;
}
/*返回某节点的下一个节点*/
Position
Advance( Position P )
{
return P->Next;
} /*返回某节点的值*/
ElementType
Retrieve( Position P )
{
return P->Element;
}

链表ADT的实现的更多相关文章

  1. 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)

    单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...

  2. 单链表ADT

    本博客第一篇学术性博客,所以还是写点什么东西: 首先这篇博客以及以后的博客中的代码尽量百分之90是自己写过的: 可能有部分图片和代码是我认为别人更好的故摘抄下来, 本人三观正确,所以一定会表明来源: ...

  3. 数据结构---链表ADT C++实现

    最近在学习数据结构,刚开始一直在看书,但是总是感觉似懂非懂,心想还不如自己操练一波,势必有所收获.现将实现代码发表此地,以备日后复习,若有错误或者建议,欢迎告知本人! 1. 节点类 class Nod ...

  4. 《数据结构与算法分析》学习笔记(三)——链表ADT

    今天简单学习了下链表,待后续,会附上一些简单经典的题目的解析作为学习的巩固 首先要了解链表,链表其实就是由一个个结点构成的,然后每一个结点含有一个数据域和一个指针域,数据域用来存放数据,而指针域则用来 ...

  5. 自己动手实现java数据结构(二) 链表

    1.链表介绍 前面我们已经介绍了向量,向量是基于数组进行数据存储的线性表.今天,要介绍的是线性表的另一种实现方式---链表. 链表和向量都是线性表,从使用者的角度上依然被视为一个线性的列表结构.但是, ...

  6. [C++]线性链表之顺序表<二>

    /*   @content 线性链表之顺序表   @date 2017-3-21 1:06   @author Johnny Zen  */ /* 线性表     顺序表     链式表[带头指针/不 ...

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

    这篇文章主要是根据<数据结构与算法分析--C语言描述>一书的链表章节内容所写,该书作者给出了链表ADT的一些方法,但是并没有给出所有方法的实现.在学习的过程中将练习的代码记录在文章中,并添 ...

  8. 用Python实现的数据结构与算法:链表

    一.概述 链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接(参考 <算法:C语言实现>). 根据结构的不同,链表可以 ...

  9. 【WIP_S3】链表

    创建: 2017/12/26 完成: 2018/01/14   [TODO]     S4, S5, S14来处理动态数组   CAF8A81B790F [github 地址]传送门  链表的定义   ...

随机推荐

  1. yii2初步讲解 验证规则

    http://www.yii-china.com/post/detail/9.html

  2. 使用python实现滑动验证码

    首先安装一个需要用到的模块 pip install social-auth-app-django 安装完后在终端输入pip list会看到 social-auth-app-django social- ...

  3. Insertion Sort Gym - 101955C 思路+推公式

    题目:题目链接 题意:对长为n的1到n的数列的前k个数排序后数列的最长上升子序列长度不小于n-1的数列的种数,训练赛时怎么都读不明白这个题意,最后还是赛后问了旁队才算看懂,英语水平急需拯救55555 ...

  4. PTA 数据结构——是否完全二叉搜索树

    7-2 是否完全二叉搜索树 (30 分) 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格 ...

  5. datatime来计算代码段运行时长

    小知识点:编程中一般都是先乘后除,这样结果更为精确 先定义 DataTime startTime = DataTime.Now; 中间是运行代码 最后TimeSpan ts = DataTime.No ...

  6. 快速从mysqldump文件中恢复一个表

    快速从较大的mysqldump文件中恢复一个表到数据库中: 1.先获取目标表(md_gas_check_record)在文件中的位置 [publish@LF-PRO-DB-01 ~]$ cat dby ...

  7. Androd安全——反编译技术完全解析

    )第二步成功后我们会发现在当前目录下多了一个<APKName>文件夹,这个文件夹中存放的就是反编译的结果了.我们可以打开AndroidManifest.xml.res/layout即可查看 ...

  8. spoj 104 Highways(Matrix-tree定理)

    spoj 104 Highways 生成树计数,matrix-tree定理的应用. Matrix-tree定理: D为无向图G的度数矩阵(D[i][i]是i的度数,其他的为0),A为G的邻接矩阵(若u ...

  9. 1 - smart(Maven:Package,Install,&,Log4j2)

    mvn package 时,增加如下命令-Dmaven.test.skip=true 则表示package打包时,不执行也不编译测试用例,mvn package -Dmaven.test.skip=t ...

  10. Django基础之数据库与ORM

    一.数据库配置 1.django默认支持sqlite,mysql, oracle,postgresql数据库. django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 , 引擎名称 ...