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

按照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. python用法笔记(数组(list、touple、dict)、字符串)

    1.产生n个全为1的数组a=[1]*n2.字符数字转化int('12')float('12.5')str(123.45)ASCII码转为相应的字符:chr(97)字符转化为相应的ASCII码:ord( ...

  2. 《Java数据结构与算法》笔记-CH4-6优先级队列

    /** * 优先级队列 * 效率:插入O(n),删除O(1).第12章介绍如何通过堆来改进insert时间 */ class PriorityQueue { private int maxSize; ...

  3. cocos2d-html5将js编译为jsc

    在d:\DevTool\cocos2d-x-2.2.2\cocos2d-x-2.2.2\tools\cocos2d-console\console 有 cocos2d_jscompile.py coc ...

  4. Make the “Check out” function available in the office document opened with Document ID link

    I found a solution to make the “Check out” function available in the office document opened with Doc ...

  5. SpringMVC处理Date类型的成员变量方法

    原文链接:http://www.tuicool.com/articles/aYfaqa 在使用 SpringMVC 的时候,我们可能需要将一个对象从 View 传递给 Controller .而当这个 ...

  6. HTML5每日一练之OL列表的改良

    在HTML5中的OL被改良了,为它增加了两个新属性. start属性:start属性用来定义列表编号的起始位置,比如下面的代码,列表将从50开始51...55以此类推 <ol start=&qu ...

  7. plutil工具

    作用: 检查元素文件语法: 转换格式.支持xml binary json: 插入key-value: 打印内部信息: 详细解释: -lint                         check ...

  8. LOTUS 迁移到Exchange 2010 POC 之在Exchange 2007 安装Lotus Admin!

    双击Setup安装:

  9. C:指针

    指针 指针数组   参考1   参考2  参考3  参考4 1.指针 也是一种变量.指针内部存的是一块内存的地址. //指针: 通常我们说的指针其实是指针变量,相比于其他基本数据类型的变量不同,它存储 ...

  10. wchar_t 和 char 之间转换

    vc++2005以后,Visual studio 编译器默认的字符集为Unicode.VC中很多字符处理默认为宽字符wchar_t,如CString的getBuffer(),而一些具体操作函数的输入却 ...