链表ADT的实现
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的实现的更多相关文章
- 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)
单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...
- 单链表ADT
本博客第一篇学术性博客,所以还是写点什么东西: 首先这篇博客以及以后的博客中的代码尽量百分之90是自己写过的: 可能有部分图片和代码是我认为别人更好的故摘抄下来, 本人三观正确,所以一定会表明来源: ...
- 数据结构---链表ADT C++实现
最近在学习数据结构,刚开始一直在看书,但是总是感觉似懂非懂,心想还不如自己操练一波,势必有所收获.现将实现代码发表此地,以备日后复习,若有错误或者建议,欢迎告知本人! 1. 节点类 class Nod ...
- 《数据结构与算法分析》学习笔记(三)——链表ADT
今天简单学习了下链表,待后续,会附上一些简单经典的题目的解析作为学习的巩固 首先要了解链表,链表其实就是由一个个结点构成的,然后每一个结点含有一个数据域和一个指针域,数据域用来存放数据,而指针域则用来 ...
- 自己动手实现java数据结构(二) 链表
1.链表介绍 前面我们已经介绍了向量,向量是基于数组进行数据存储的线性表.今天,要介绍的是线性表的另一种实现方式---链表. 链表和向量都是线性表,从使用者的角度上依然被视为一个线性的列表结构.但是, ...
- [C++]线性链表之顺序表<二>
/* @content 线性链表之顺序表 @date 2017-3-21 1:06 @author Johnny Zen */ /* 线性表 顺序表 链式表[带头指针/不 ...
- 数据结构入门之链表(C语言实现)
这篇文章主要是根据<数据结构与算法分析--C语言描述>一书的链表章节内容所写,该书作者给出了链表ADT的一些方法,但是并没有给出所有方法的实现.在学习的过程中将练习的代码记录在文章中,并添 ...
- 用Python实现的数据结构与算法:链表
一.概述 链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接(参考 <算法:C语言实现>). 根据结构的不同,链表可以 ...
- 【WIP_S3】链表
创建: 2017/12/26 完成: 2018/01/14 [TODO] S4, S5, S14来处理动态数组 CAF8A81B790F [github 地址]传送门 链表的定义 ...
随机推荐
- PSTR、LPSTR等宏原型
1.首先介绍char.wchar_t ,宽字符wchar_t和窄字符char. 窄字符char了,大家都很清楚,就是8bit表示的byte,长度固定.char字符只能表示ASII码表中的256个字符, ...
- 问题 B: 分组统计
分组统计 问题 B: 分组统计时间限制: 1 Sec 内存限制: 32 MB 提交: 416 解决: 107 [提交][状态][讨论版][命题人:外部导入] 题目描述 先输入一组数,然后输入其分组,按 ...
- 拓扑排序+不是字典序的优先级排列(POJ3687+HDU4857)
一.前言 在过去的一周里结束了CCSP的比赛,其中有一道题卡了我9个小时,各种调错都没法完整的调处来这题,于是痛下决心开始补题,这个是计划的一部分.事实上,基于错误的理解我写了若干发拓扑排序+字典序的 ...
- Hive将SQL转化为MapReduce的过程
Hive将SQL转化为MapReduce的过程: Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree 遍历AST Tree,抽象出查询的基本组成单元Qu ...
- openpyxl模块介绍
openpyxl模块是一个读写Excel 2010文档的Python库,如果要处理更早格式的Excel文档,需要用到额外的库,openpyxl是一个比较综合的工具,能够同时读取和修改Excel文档.其 ...
- 安装的 Python 版本太多互相干扰?pyenv 建议了解一下。
写在之前 我们都知道现在的 Python 有 Python2 和 Python3,但是由于各种乱七八糟的原因导致这俩哥们要长期共存,荣辱与共,尴尬的是这哥俩的差异还比较大,在很多时候我们可能要同时用到 ...
- [oldboy-django][2深入django]django 官方中文文档 --扩展User
https://docs.djangoproject.com/en/2.0/topics/auth/customizing/#extending-the-existing-user-model # 另 ...
- Mysql实战之索引
author:JevonWei 版权声明:原创作品 索引基础: 索引:提取索引的创建在的表上字段中的数据,构建出一个独特的数据结构: 索引的作用:加速查询操作:副作用:降低写操作性能: 表中数据子集: ...
- hihoCoder #1783 又一个重复计数
题目大意 给定一个长度为 $n$ 的字符串 $S$,定义函数 $f(S)$ 表示 $S$ 的不同回文子串的个数.对于 $1\le l \le r \le n$,定义 $S[l,r]$ 为字符串 $S$ ...
- JZOJ 5281 钦点
样例输入: 4 4 2 a a b b a a b b c c d d c c d d 1 1 3 3 2 2 3 1 1 3 2 2 样例输出: d d c c d d c c b b a a ...