抽象数据类型 (abstract data type,ADT)

抽象数据类型是一些操作的集合。抽象数据类型是数学中的定义,在ADT中,我们不关心操作是如何被实现的。因此,这可以看做是模块化的扩充。
例如表,树,图和它们的操作一起可以看做是抽象数据类型,就想整数,实数和布尔变量是数据类型一样。整数,实数和布尔变量有它们的操作,抽象数据类型也有它们自己的操作。

表 ADT

我们将形如A1,A2,A3,...,An的一列数称为表。
表的大小:表中的元素的个数称为表的大小,大小为0的表称为空表。
对于除空表外,我们称Ai+1是Ai的后继,Ai-1是Ai的前驱,其中表的第一个元素A1不定义前驱,最后一个元素An不定义后继。

表的数组实现

对于表的所有操作都可以通过数组来实现,数组使得PrintList和Find以线性的时间执行,而FindIndex则花费常数的执行时间。然而,插入和删除的代价是昂贵的,例如在第一个元素位置插入,需要将后面的所有元素往后移一个位置出来,同理删除也是如此。因此这两种操作的最坏情况是O(N)。平均来看,这两种运算都要移动表的一半的元素,仍然需要线性时间。
因为插入和删除的运行时间是如此的慢,而且表的大小还需要事先知道,所以简单数组一般不用来实现表的结构。

链表

为了避免插入和删除的线性开销,我们需要运行表可以不连续存储,否则表的部分或全部需要整体移动,而如图表达了链表的一般想法。
在链表中,每个结构均包含有表元素和指向包含包含该元素后继元素的结构的指针,我们称之为next指针,最后一个元素的next指针指向null,ANSI C规定NULL为0。

程序设计细节

为了更方便的实现链表中的操作,我们通常会增加一个头结点,并将它指向第一个元素。

 //链表的结构
struct Node;
typedef struct Node *ptrToNode ;
typedef ptrToNode List ;
typedef ptrToNode Position; struct Node{
ElementType Element;
Position Next;
}; //判断表是否为空
int IsEmpty(List L){
return L->Next == NULL;
} //判断当前是否为链表的末尾
int IsLast(Position P,List L){
return P->Next == Null;
} //查找函数
Position Find(Element X,List L){
Position P;
P = L->Next;
while(P != NULL && P->Element != X){
P = P->Next;
}
return P;
} //删除元素
void Delet(ElementType X,List L){
Position P, TempNode;
P = FindPrevious(X, L);
if(!IsLast(P,L)){
TempNode = P->Next;
P->Next = TempNode->Next;
free(TmpNode);
}
} //查找某元素的前一个元素
Position FindPrevious(ElementType X,List L){
Position P;
P = L;
while(P->Next != NULL && P->Next->Element != X){
P = P->Next;
}
return P;
} //插入元素
void Insert(ElementType X,List L,Position P){
Position TempNode ;
TempNode = malloc(sizeof(struct Node));
if(TempNode == NULL){
printf("malloc error");
return ;
}
TempNode->Element = x;
TempNode->Next = P->Next;
p->Next = TempNode;
} //删除链表
void DeleteList(List L){
Position P,Tmp;
p = L->Next;
L->Next = NULL;\
while(p != NULL){
Tmp = P->Next;
free(p);
p = Tmp;
}
}

双链表

当涉及到倒序扫描链表时,双链表就非常方便了。双链表和单链表的区别就是:双链表中存在两个指针域,一个指向当前元素的前驱,另一个指向当前元素的后继。有了双向链表,可以不用在访问当前元素的前一个元素了,不过,双链表方便的同时,增加了空间的开销。

循环链表

让最后的单元指向第一个单元构成循环,这样的链表被称为循环链表。它既可以有表头,也可以没有表头(若有表头,则最后一个元素指针指向表头)。

案例实战

一元多项式
我们可以用表来定义模拟一元多项式的抽象数据类型。对于大多数系数非零的多项式,我们可以采用一个简单的数组来进行存储,数组的下标表示多项式的次幂,下标的值表示多项式的系数。但是对于系数相差较大,大部分的系数为0的多项式,采用数组将会浪费极大的空间。下面我们就采用数组的方法来定义多项式的抽象数据类型。

 typddef struct{
int CoeffArray[ MaxDegree + ];
int HighPower;
}* Polynomial; //多项式初始化为0
void ZeroPolynomial(Polynomial Poly){
int i;
for( i=; i <= MakDegree; i++){
Poly->CoeffArray[i] = ;
}
Poly->HighPower = ;
} //两个多项式相加
void AddPolynomial(const Polynomial poly1, const Polynomial poly2, Polynomial polysum){
int i;
ZeroPolynomial(polysum);
polysum->HighPower = Max(poly1->HighPower,poly2->HighPower);
for( i = polysum->HighPower; i>=; i--){
polysum->CoeffArray[i] = poly1->CoeffArray[i] + poly2->CoeffArray[i];
}
} //两个多项式的乘法
void MultPolynomial(const Polynomial poly1, const Polynomial poly2, Polynomial polymult){
int i,j;
ZeroPolynomial(polymult);
polymult->HighPower = poly1->HighPower + poly2->HighPower;
if(polymult->HighPower > MaxDegree){
printf("MaxDegree ERROR");
}else{
for( i=; i <= poly1->HighPower; i++ ){
for( j=; poly2->HighPower; j++){
polysum->CoeffArray[i+j] = poly1->CoeffArray[i] * poly2->CoeffArray[i];
}
}
}
}

数据结构之表(C语言实现)的更多相关文章

  1. 数据结构与算法C语言实现笔记(1)--表

    声明:此一系列博客为阅读<数据结构与算法分析--C语言描述>(Mark Allen Weiss)笔记,部分内容参考自网络:转载请注明出处. 1.表 表是最简单的数据结构,是形如A1.A2. ...

  2. 数据结构与算法之顺序表C语言实现

    顺序表等相关概念请自行查阅资料,这里主要是实现. 注: 1.顺序表C语言实现: 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善: 3.提供几个简单函数,可自行添加功能: 4.可用C+ ...

  3. 数据结构算法集---C++语言实现

    //数据结构算法集---C++语言实现 //各种类都使用模版设计,可以对各种数据类型操作(整形,字符,浮点) /////////////////////////// // // // 堆栈数据结构 s ...

  4. C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载

    维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...

  5. 数据结构与抽象 Java语言描述 第4版 pdf (内含标签)

    数据结构与抽象 Java语言描述 第4版 目录 前言引言组织数据序言设计类P.1封装P.2说明方法P.2.1注释P.2.2前置条件和后置条件P.2.3断言P.3Java接口P.3.1写一个接口P.3. ...

  6. 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)

    开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...

  7. [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)

    [数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构)    C#中的链表(源码)    可空类 ...

  8. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  9. hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)

    基础数据结构——顺序表(2) Time Limit: 1000 MS    Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...

  10. 数据结构——栈(C语言实现)

    #include <stdio.h> #include <stdlib.h> #include<string.h> #include<malloc.h> ...

随机推荐

  1. React从入门到放弃之前奏(4):Redux中间件

    redux 提供了类似后端 Express 的中间件概念. 最适合扩展的是redux中的 store.dispatch 方法,中间件实际就是通过 override redux的store.dispat ...

  2. vector作为函数返回类型

    在实际的操作中,我们经常会碰到需要返回一序列字符串或者一列数字的时候,以前会用到数组来保存这列的字符串或者数字,现在我们可以用vector来保存这些数据.但是当数据量很大的时候使用vector效率就比 ...

  3. 构建apache web 服务器

    一.Apache服务器工作模式 1.Prefork模式:Prefork MPM使用多个子进程,每个子进程只有一个线程,每个进程在某个确定的时间只能维护一个连接 2.Worker模式: Worker M ...

  4. CentOS DesktopEntry

    IBM Developer  :  https://www.ibm.com/developerworks/cn/linux/l-cn-dtef/index.html [Desktop Entry] N ...

  5. java基于BasicPlayer调用 播放音乐

    无聊中想想用java调用下听音乐的api.晚上很多文章用的比较老大方法了,都是用原生的代码写,而且不支持mp3格式,BasicPlayer第三方包提供了很好的api调用,简单的3行代码就可以调用mp3 ...

  6. 干货!分享一款windows下的磁盘分析神器。

    作为开发人员的你,肯定遇到过这样的情况,120G SSD系统盘居然满载了,到底是被哪些程序占用了,包含哪些大文件,这个时候脑袋里就开始回忆了.....这对平时没有养成规范化记录安装软件好习惯的同学而言 ...

  7. 使用github pages搭建个人博客

    一.环境准备 使用Github Pages搭建个人博客,一劳永逸,可以让我们更加专注于博客的撰写.博客的更新是通过将新建或改动的博客放在指定文件夹并推送到远程Github仓库来完成的,所以我们本地需要 ...

  8. Python中的那些“坑”

    1.哪个是True,哪个是False? 这里要看三组代码: # 第一组: >>>a=256 >>>b = 256 >>>a is b # 第二组: ...

  9. Python3|ddt|unittest|浅议数据驱动测试

    目录 1.DDT简介 2.data装饰器 3.unpack装饰器 4.file_data装饰器 5.总结 1.DDT简介 Data-Driven Tests(DDT)即数据驱动测试.它允许您通过不同的 ...

  10. 直观理解神经网络最后一层全连接+Softmax

    目录 写在前面 全连接层与Softmax回顾 加权角度 模板匹配 几何角度 Softmax的作用 总结 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 这篇文章将从3 ...