链表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 地址]传送门 链表的定义 ...
随机推荐
- 数据结构-二叉树(Binary Tree)
#include <stdio.h> #include <string.h> #include <stdlib.h> #define LIST_INIT_SIZE ...
- 动态规划:HDU1059-Dividing(多重背包问题的二进制优化)
Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 查找两个链表的第一个交叉结点(Python实现)
题目 给定两个单链表,查找这两个单链表的第一个交叉节点. 例如:链表list_a为:a1→a2→c1→c2→c3,链表list_b为:b1→b2→b3→c1→c2→c3.那么它们第一个交叉结点为c1. ...
- DiyCode开源项目 TopicActivity 分析
1.首先看看TopActivity效果. 2.TopicActivity是一个继承BaseActivity的.前面分析过BaseActivity了.主要有一个标题栏,有返回的图标. 3.贴一下T ...
- Java面向对象---方法递归调用
递归调用是一种特殊的调用形式,即方法自己调用自己 public int method(int num){ if(num==1){ return 1; } else { return num+metho ...
- OpenCV学习笔记(九) 重映射、仿射变换
重映射 通过重映射来表达每个像素的位置 : 这里 是目标图像, 是源图像, 是作用于 的映射方法函数.想象一下我们有一个图像 , 我们想满足下面的条件作重映射:,图像会按照 轴方向发生翻 ...
- android实现前置后置摄像头相互切换
首先自定义一个继承自SurfaceView并且实现了SurfaceHolder.Callback接口的组件: public class CameraView extends SurfaceView i ...
- ValueStack、ActionContext
笔者不知道该用哪个词来形容ValueStack.ActionContext等可以在Struts2中用来存放数据的类.这些类使用的范围不同,得到的方法也不同,下面就来一一介绍. 1. ValueStac ...
- Unity 碰撞检测
武器与怪物的碰撞 目前来说有三种思路,其实前两种算变种了: 1.动画关键帧回调 + 范围检测.http://blog.csdn.net/u013700908/article/details/52888 ...
- Mybatis通过接口的方式实现增删改查
导入jar包 [mybatis] [oracle] 生成数据库 1.添加Mybatis的配置文件mybatis-config.xml 在src目录下创建一个mybatis-config.xml文件,如 ...