表一般不用简单数组来实现,通常将其实现为链表。在链表中要不要使用表头则属于个人兴趣问题。在下面的例程中我们都使用表头。

按照C的约定,作为类型的List(表)和Position(位置)以及函数的原型都列在所谓的.h头文件中。具体的Node(结点)声明则在.c文件中。

如下代码为链表的类型声明:

#ifndef _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 L );

void DeleteList( List L );

Position Header( List L );

Position First( List L );

Position Advance( Position P );

ElementType Retrieve( Position P );

#endif    /*_List_H */

/* Place in the implementation file */

struct Node

{

ElementType     Element;

Position    Next;
};

测试一个链表是否为空的函数:

/* Return true if L is empty */

int

IsEmpty( List L )

{

return L->next == NULL;
}

测试当前位置是否是链表的末尾的函数:

/* 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;
}

Find例程:

/* 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;

}

删除链表L中的元素X的例程:

/* delete first occurrence of X from a list */

/* assume use of a header node */

Void

Delete( ElementTyep X, List L );

{

Position P, TmpCell;

P = FindPrevious( X, L );

if( !IsLast( P, L ) )    /* 如果是最后一个元素,说明X不在链表中*/

{

TmpCell = P->Next;

P->Next = TmpCell->Next;

free( TmpCell );
}

}

与Delete一起使用的FindPrevious例程:

/* Uses a header. If element is not found, then next field */

/* of returned value is NULL 也就是说如果找不到该元素,那么*/

/* 返回该链表的最后一个元素 */

Position

FindPrevious( ElementType X, List L )

{

Position P;

P = L;

while( P->Next != NULL && P->Next->Element != X )

P = P->Next;

return P;

}

链表的插入例程(在指定的位置P后插入):

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;

}

表ADT的更多相关文章

  1. ①泡茶看数据结构-表ADT

    前言     小朽,晚上回到寝室.烧了开水,又泡了一杯下午喝了的小毛尖.耳机听着萨克斯,总结下今天学的数据结构和算法中的表ADT.       表ADT节点: #单链表   #双链表   #循环链表 ...

  2. 3.2 表 ADT -3.3 Java Collection API 中的表

    3.2 表 ADT 处理形如 A0, A1, A2, --, AN-1 的一般的表.我们称这个表大小为N.将大小为0的特殊表称为空表 对于除空表以外的任何表,称 Ai-1 前驱 Ai,Ai 后继 Ai ...

  3. 数据结构:DHU顺序表ADT模板设计及简单应用:找匹配

    顺序表ADT模板设计及简单应用:找匹配 时间限制: 1S类别: DS:线性表->线性表应用 问题描述: 输入范例: 100000100000 99999 99998 99997 99996 99 ...

  4. 基础的表ADT -数据结构(C语言实现)

    读数据结构与算法分析 表的概述 形如A1,A2,A3... 操作合集 PrintList MakeEmpty Find Insert Delete 表的简单数组实现 分析: PrintList和Fin ...

  5. 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes

    表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...

  6. 数据结构之表(C语言实现)

    抽象数据类型 (abstract data type,ADT) 抽象数据类型是一些操作的集合.抽象数据类型是数学中的定义,在ADT中,我们不关心操作是如何被实现的.因此,这可以看做是模块化的扩充.例如 ...

  7. [C++]线性链表之顺序表<一>

    顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 ...

  8. 自己动手实现java数据结构(五)哈希表

    1.哈希表介绍 前面我们已经介绍了许多类型的数据结构.在想要查询容器内特定元素时,有序向量使得我们能使用二分查找法进行精确的查询((O(logN)对数复杂度,很高效). 可人类总是不知满足,依然在寻求 ...

  9. JAVA迭代器学习--在JAVA中实现线性表的迭代器

    1,迭代器是能够对数据结构如集合(ADT的实现)进行遍历的对象.在遍历过程中,可以查看.修改.添加以及删除元素,这是它与一般的采用循环来遍历集合中的元素不同的地方.因为,通常用循环进行的遍历操作一般是 ...

随机推荐

  1. STL源码分析读书笔记--第5章--关联式容器

    1.关联式容器的概念 上一篇文章讲序列式容器,序列式容器的概念与关联式容器相对,不提供按序索引.它分为set和map两大类,这两大类各自有各自的衍生体multiset和multimap,的底层机制都是 ...

  2. mysql执行update报错1175解决方法

    mysql执行update报错 update library set status=true where 1=1 Error Code: 1175. You are using safe update ...

  3. 使用HttpClient实现文件的上传下载

    1 HTTP HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源. 虽然在 JDK 的 java.net ...

  4. 前N个自然数的随机置换

    来自:[数据结构与算法分析——C语言描述]练习2.7 问题描述:假设需要生成前N个自然数的一个随机置换.例如,{4,1,2,5,2}和{3,1,4,2,5}就是合法的置换,但{5,4,1,2,1}却不 ...

  5. mysql基础知识(3)--创建

    创建表: 基本形式 create  table  [if not  exists] 表名(字段列表, [约束或索引列表]) [表选项列表]; 说明:列表都是表示“多个”,相互之间用逗号分开. 字段基本 ...

  6. 第二百零九天 how can I 坚持

    上班感觉好空虚啊. 今天感觉也没有什么,只是感觉上班的时候闲了一天,下班的时候就来事了. 确实没什么,只是上班的时候突然感觉好失落. 不该胡扯,朱镕基,言必行. 还有中国高铁谈判的新闻,中国确实是个比 ...

  7. Apache Spark是什么?

    简单地说, Spark是发源于美国加州大学伯克利分校AMPLab的大数据分析平台,它立足于内存计算,从多迭代批量处理出发,兼顾数据仓库. 流处理和图计算等多种计算范式,是大数据系统领域的全栈计算平台. ...

  8. 为什么数据科学家们选择了Python语言?

    本文由 伯乐在线 - HanSir 翻译,toolate 校稿 英文出处:Quora [伯乐在线导读]:这个问题来自 Quora,题主还补充说,“似乎很多搞数据的程序员都挺擅长 Python 的,这是 ...

  9. Unity2D Keynote

    [Unity2D Keynote] 1.File Format Accepted by Unity 2.By double-clicking an object in Hierachy, you no ...

  10. GPIO 配置之ODR, BSRR, BRR 详解

    STM32 GPIO 配置之ODR, BSRR, BRR 详解 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能 ...