数据结构算法代码实现——静态单链表(四)

来源:互联网 发布:it数据分析师 编辑:程序博客网 时间:2024/05/17 13:44

线性表的静态单链表存储结构

//-------线性表的静态单链表存储结构-------typedef struct{    ElemType data;    int cur;}component,SLinkList[MAXSIZE];

什么是静态链表?

    对于线性链表,也可用一维数组来进行描述。这种描述方法便于在没有指针类型的高级程序设计语言中使用链表结构。    在如上描述的链表中,数组中结构体一个成员存储数据,另一个成员(游标cur)存放下一个结点的位置。     为了和指针型描述的线性表相区别,称这种数组为静态链表。注意:链表的输出不是按数组的位序输出的,     而是由数组中的一个指定位置开始根据游标cur输出。    生成静态链表的方法有两种:一种是在数组中根据需要可以生成多个独立的静态链表,每个链表的头指针在生成的时候在指定。     另一种是一个数组只能生成一个静态链表,这种情况可以固定链表的头指针,也就是说在初始化链表的同时就指定了链表的头指针位置     (如数组最后一个下标为头指针), 在形参上比上一种方法简单,因为不用传入头指针的位置了,     但是缺点是在程序需要使用多个静态链表则要有多个数组,每个数组之间不能相互调剂,空间浪费会较大。注意:    在静态链表中,为了辨别数组中那些分量未被使用,解决的方法是:    将所有空闲结点链接形成一个备用链表,数组下标为 0 的单元为备用链表的头结点(这时,静态链表的头结点就不能再是数组下标为 0 的单元了,     需要另外定义)。在静态数组实际有 2 种链表,一个链表上链接的是线性表的结点,另一个链表(备用链表)上链接的是所有没被使用的结点。当线性表需要新结点时,把备用链表中的首元结点(由L[0].cur 指示)从备用链表中删除,作为新结点,插入线性表。 当删除线性表中的结点时,被删除的结点插入备用链表中,成为备用链表的首元结点。之所以从备用链表删除结点或向备用链表插入结点都在表头进行,是因为这样效率最高。 所以操作备用链时需要用户自定义的Malloc和Free函数。

静态链表的基本操作

我们只以第一种方法为例:

  1. 头文件请参考顺序表文章

  2. 自定义的Malloc和Free函数,从备用链申请空间、释放空间备用链回收结点。

//   申请结点和删除结点  都是在备用链的表头后操作//--------算法2.15  申请结点int Malloc(SLinkList L){     int i;     i =L[0].cur;     if(i){        L[0].cur =L[i].cur;//把备用链的第一个结点做申请的结点,在把第二个结点和备用链连接起来。     }     return i; } //-------算法2.15 删除结点(回收到备用备用链中) void Free(SLinkList L,int n){    L[n].cur =L[0].cur; //把备链表的第一个结点位序 接到删除的结点后。     L[0].cur =n; //在把删除的结点位序 接到备用链的头结点后 }

3,基本操作

4,测试上述操作代码

5,测试结果图:

这里写图片描述

较复杂的操作算法实现

教材算法2.17求集合运算(A-B)∪(B-A)。

假设由终端输入集合元素,先建立表示集合A的静态链表S,而后在输入集合B的元素的同时查找S表,若存在和B相同的元素,则从S表中删除之, 否则将此元素插入S表。

代码实现:

测试结果图:
这里写图片描述

注意:用scanf输入字符时要注意不要使用空格,还需要用%*c来吃掉输入完成时的回车键(百度学习)。

0 0
原创粉丝点击