博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构之表(C语言实现)
阅读量:6103 次
发布时间:2019-06-20

本文共 3423 字,大约阅读时间需要 11 分钟。

数据结构之表(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 + 1 ];    int HighPower;}* Polynomial;//多项式初始化为0void ZeroPolynomial(Polynomial Poly){    int i;    for( i=0; i <= MakDegree; i++){        Poly->CoeffArray[i] = 0;    }    Poly->HighPower = 0;}//两个多项式相加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>=0; 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=0; i <= poly1->HighPower; i++ ){            for( j=0; poly2->HighPower; j++){                polysum->CoeffArray[i+j] = poly1->CoeffArray[i] * poly2->CoeffArray[i];            }        }    }}

转载地址:http://shiza.baihongyu.com/

你可能感兴趣的文章
MS SQLSERVER通用存储过程分页
查看>>
60.使用Azure AI 自定义视觉服务实现物品识别Demo
查看>>
Oracle 冷备份
查看>>
jq漂亮实用的select,select选中后,显示对应内容
查看>>
C 函数sscanf()的用法
查看>>
python模块之hashlib: md5和sha算法
查看>>
linux系统安装的引导镜像制作流程分享
查看>>
解决ros建***能登录不能访问内网远程桌面的问题
查看>>
pfsense锁住自己
查看>>
vsftpd 相关总结
查看>>
bash complete -C command
查看>>
解决zabbix 3.0中1151端口不能运行问题
查看>>
售前工程师的成长---一个老员工的经验之谈
查看>>
Get到的优秀博客网址
查看>>
dubbo
查看>>
【Git入门之四】操作项目
查看>>
老男孩教育每日一题-第107天-简述你对***的理解,常见的有哪几种?
查看>>
Python学习--time
查看>>
在OSCHINA上的第一篇博文,以后好好学习吧
查看>>
高利率时代的结局,任重道远,前途叵测
查看>>