数据结构之表(C语言实现)
抽象数据类型 (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语言实现)的更多相关文章
- 数据结构与算法C语言实现笔记(1)--表
声明:此一系列博客为阅读<数据结构与算法分析--C语言描述>(Mark Allen Weiss)笔记,部分内容参考自网络:转载请注明出处. 1.表 表是最简单的数据结构,是形如A1.A2. ...
- 数据结构与算法之顺序表C语言实现
顺序表等相关概念请自行查阅资料,这里主要是实现. 注: 1.顺序表C语言实现: 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善: 3.提供几个简单函数,可自行添加功能: 4.可用C+ ...
- 数据结构算法集---C++语言实现
//数据结构算法集---C++语言实现 //各种类都使用模版设计,可以对各种数据类型操作(整形,字符,浮点) /////////////////////////// // // // 堆栈数据结构 s ...
- C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载
维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...
- 数据结构与抽象 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. ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)
开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...
- [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)
[数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构) C#中的链表(源码) 可空类 ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
基础数据结构——顺序表(2) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...
- 数据结构——栈(C语言实现)
#include <stdio.h> #include <stdlib.h> #include<string.h> #include<malloc.h> ...
随机推荐
- Oracle解决Ora-01653无法扩展表空间问题
先针对可能性1查看表空间使用情况 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M) & ...
- 电脑不识别U盘
最近遇到这样一个问题,现把具体问题和解决方案给大家分享一下: 系统:win10 症状:插入U盘,系统提示插入U盘的声音提示,磁盘不显示,360 无图标 原因:USB驱动出现问题 对症下药: 插入U盘右 ...
- laravel 请求request 接收参数
获取请求输入 获取所有输入值 你可以使用 all 方法以数组格式获取所有输入值: $input = $request->all(); 获取单个输入值 使用一些简单的方法,就可以从 Illumin ...
- JQuery 将div中的内容替换掉
$("#div2").children().replaceWith($("#userText").val());谷歌没有效果. $("#div2&qu ...
- HTML标题
HTML 标题 在 HTML 文档中,标题很重要. HTML 标题 标题(Heading)是通过 <h1> - <h6> 标签进行定义的. <h1> 定义最大的标题 ...
- 关于CTO角色的认知
从3月份到现在2个月过去了,整个数据平台从0到1,算是有了一个基本的样子,跌跌撞撞的勉强支撑起运营的一些基本业务,当然这仅仅是开始,下一步还要从零打造自己的UBS系统,想想都兴奋呢!接下来总结下自己这 ...
- keras实现简单CNN人脸关键点检测
用keras实现人脸关键点检测 改良版:http://www.cnblogs.com/ansang/p/8583122.html 第一步:准备好需要的库 tensorflow 1.4.0 h5py ...
- 从壹开始 [Admin] 之四 || NetCore + SignalR 实现日志消息推送
缘起 哈喽大家周一好呀,感觉好久没有写文章了,上周出差了一次,感觉还是比坐办公室好的多,平时在读一本书<时生>,感兴趣的可以看看
- 『性能』测试一下 MSSqlHelper 的性能
本文没啥技术含量,就是测试一下 MSSqlHelper 在 使用反射.不使用反射 的性能对比. 之后,不要问为什么不用 ORM 这类的东西 —— 会有另外的文章 介绍 自己这些年 自己的ORM 升级历 ...
- Oracle数据库知识要点
一.卸载安装(来自百度经验) 完全卸载: 1. 停止相关服务 2. 运行Universal Installer,卸载产品 3. 清理注册表 4. 重启电脑,删除目录(Oracle文件夹和app文件夹) ...