数据结构之表(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> ...
随机推荐
- MySQL 8 新特性之降序索引
MySQL 8.0终于支持降序索引了.其实,从语法上,MySQL 4就支持了,但正如官方文档所言,"they are parsed but ignored",实际创建的还是升序索引 ...
- 【毕业原版】-《贝德福特大学毕业证书》Bedfordhire一模一样原件
☞贝德福特大学毕业证书[微/Q:865121257◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归& ...
- 一副美丽而庞大的SQL TUNING计划美图
最近因为很忙,一直忙着开发公司的产品和客户的事情,杂七杂八,忙的不亦乐乎,所以,好久没有来这里写东西,这两天为客户优化了一个系统,优化前CPU持续冲顶爆满,导致系统卡死,应用系统不能正常使用,其中有个 ...
- MIP 移动网页加速器视频教程全新发布
MIP (Mobile Instant Pages - 移动网页加速器) 是百度推出的开源项目,用于移动端页面加速.MIP 技术通过优化浏览器资源加载,前端代码执行及 CDN 缓存加速来加速页面,打造 ...
- 入门级 JAVA反射机制
1.什么是反射? Java中的反射机制是Java语言的一个很重要的特性,是Java “动态性” 的重要体现.Java反射机制让我们在程序运行状态中,对于任意一个类,都能知道这个类的所有属性和方法:对于 ...
- [小技巧]ASP.NET Core中如何预压缩静态文件
原文地址:Pre-compressed static files with ASP.NET Core 作者:Gunnar Peipman 译者:Lamond Lu 译文:https://www.cnb ...
- Python爬虫入门教程 56-100 python爬虫高级技术之验证码篇2-开放平台OCR技术
今日的验证码之旅 今天你要学习的验证码采用通过第三方AI平台开放的OCR接口实现,OCR文字识别技术目前已经比较成熟了,而且第三方比较多,今天采用的是百度的. 注册百度AI平台 官方网址:http:/ ...
- EFCore动态切换Schema
最近做个分库分表项目,用到schema的切换感觉还是有些坑的,在此分享下. 先简要说下我们的分库分表 分库分表规则 我定的规则是,订单号(数字)除以16,得出的结果为这个订单所在的数据库,然后他的余数 ...
- 如何使用JS来开发室内地图商场停车场车位管理系统
在线体验到室内地图的功能后,手机对室内地图加载一个字,要显示“快”,目前微信和电脑都可以打开室内地图的要求是3秒内打开,能有定位导航的功能最好,这样方便找到要去的地方. 对于经常逛商场的MM来说,哪里 ...
- DSAPI 调用串口选择界面
在DSAPI中,可以通过简单的代码调用串口选择界面,当用户选择了其中一个串口时,将返回选择的串口名称(或序号). Dim 串口名称 As String = DSAPI.串口通讯.显示串口选择界面.选择 ...