静态链表实现(A-B)+(B-A)【代码】
-----------------------------------------------第一次发代码,写在前面------------------------------------------------------
思路不完全等同于严师太的课本,所以代码并不是参照课本。
代码参照《大话数据结构》相应章节,并经过了相应修改
注意:链表下标为i的节点和链表中第i个节点在链表初始化后是一样的,但是在经过删除操作后不一样了。
为此本人在这里浪费了很多时间调试。注意细节。
代码可有某些地方有瑕疵,但是通过了C::B跑了几组数据,应该没大问题。
共同学习,共同进步!
-----------------------------------------------以下摘自《大话数据结构》----------------------------------------------------
在静态链表中,每一个结点包含两部分内容,一部分是data(即有意义的数据),另一部分是cur(存储该元素下一个元素所在数组对应的下标)。
有几个特殊的结点:
首先是下标为0的结点中不包含有意义的数据,它的cur存储的是备用链表(即没有存储的数据的那些结点)第一个结点的下标。如上图2所示,数组第一个元素的cur存放的是7。
其次是数组最后一个元素,数组最后一个元素的cur存放的是静态链表的第一个结点的下标(此处的第一个结点,是指有实质意义的数据的结点)。
最后就是链表的最后一个元素(并不一定是数组的最后一个元素),链表最后一个元素的cur一般存放0,表示它后面的结点为空了。
---------------------------------------------代码如下---------------------------------------------------------
#include <iostream> using namespace std; #define MAXSIZE 100 typedef struct
{
int data;
int cur;
}component,SLinkList[MAXSIZE]; int InitSpace_SL(SLinkList& space)
{
for(int i=;i<MAXSIZE-;i++) space[i].cur=i+;
space[MAXSIZE-].cur=;
return ;
} int LocateElem_SL(SLinkList &S,int e)//在静态链表中查找第一个值为e的元素,若找到,则返回它在线性表中的位序,否则返回0;
{
int i=S[MAXSIZE-].cur;
while(i&&S[i].data!=e)
i=S[i].cur;
if(!i) return ;
else return i;
} int ListLength_SL(SLinkList& L)
{
int j=;
int i=L[MAXSIZE-].cur;
while(i)
{
i=L[i].cur;
j++;
}
return j;
} int Malloc_SL(SLinkList &space)
{
int i=space[].cur;
if(space[].cur) space[].cur=space[i].cur;
return i;
} int Free_SL(SLinkList &space,int k)//把下标为k的空闲节点回收到备用链表,该节点成为备用链表中的首节点
{
space[k].cur=space[].cur;
space[].cur=k;
return ;
} int ListInsert_SL(SLinkList &L,int i,int e)//在L中第i个元素之前插入新的元素e
{
int j,k,l;
k=MAXSIZE-;//k为数组最后一个元素的下标
if(i<||i>ListLength_SL(L)+) return ;
j=Malloc_SL(L);
if(j)//L不为空表
{
L[j].data=e;
for(l=;l<=i-;i++)
k=L[k].cur;
L[j].cur=L[k].cur;
L[k].cur=j;
}
return ;
} int ListInsert2_SL(SLinkList &L,int e)//在备用链表表头插入一个元素
{
int i,j=L[MAXSIZE-].cur,k=Malloc_SL(L);
for(i=;i< ListLength_SL(L);i++)
j=L[j].cur;
L[j].cur=k;
L[k].data=e;
L[].cur=L[k].cur;
L[k].cur=;
return ;
} int ListDelete_SL(SLinkList &L,int i)//删除在L中的第i个元素e
{
int j,k;
if(i<||i>ListLength_SL(L)) return ;
k=MAXSIZE-;
for(j=;j<=i-;j++)
k=L[k].cur;
j=L[k].cur;
L[k].cur=L[j].cur;
Free_SL(L,j);
return ;
} int ListDelete2_SL(SLinkList &L,int i)//删除在L中下标为i的元素L[i]
{
int k=L[MAXSIZE-].cur,m=L[k].cur;
int j=L[].cur;
while(m!=i)
{
k=L[k].cur;
m=L[k].cur;
}
L[k].cur=L[m].cur;
L[].cur=i;
L[i].cur=j;
return ;
}
int MergeList_SL(SLinkList &L1,SLinkList &L2)//(A-B)+(B-A)
{
int i=L2[MAXSIZE-].cur;
int m;
while(i)
{
m=;
int j=L1[MAXSIZE-].cur;
while(j)
{
m=LocateElem_SL(L1,L2[i].data);
if(m) {ListDelete2_SL(L1,m);break;}
j=L1[j].cur;
}
if(!m) ListInsert2_SL(L1,L2[i].data);
i=L2[i].cur;
}
return ;
} int main()
{
int m,n,j;
SLinkList L1,L2;
InitSpace_SL(L1);
InitSpace_SL(L2);
cout<<"输入集合A中的元素个数:"<<endl;
cin>>m;
cout<<"输入集合A中各元素的值:"<<endl;
for(int i=;i<=m;i++)
{
cin>>L1[i].data;
L1[].cur=L1[i].cur;
}
L1[m].cur=;
L1[MAXSIZE-].cur=;
cout<<"输入集合B中的元素个数:"<<endl;
cin>>n;
cout<<"输入集合B中各元素的值:"<<endl;
for(int i=;i<=n;i++)
{
cin>>L2[i].data;
L2[].cur=L2[i].cur;L2[MAXSIZE-].cur=;
}
L2[n].cur=;
L2[MAXSIZE-].cur=;
MergeList_SL(L1,L2);
j=L1[MAXSIZE-].cur;
while(j)
{
cout<<L1[j].data<<" ";
j=L1[j].cur;
}
return ;
}
-----XJX
静态链表实现(A-B)+(B-A)【代码】的更多相关文章
- 【数据结构】单链表&&静态链表详解和代码实例
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 单链表(Singly Linked List ) 1.1 什么是单链表? 单链表是一种链式存储的结构.它动态的为节点分配存 ...
- 静态链表过程演示及代码实现(A - B) U (B - A)
静态链表说明 使用数组来实现链式存储结构,目的是方便在不设指针类型的高级程序设计语言中使用链式结构 c语言定义数据结构 #define MAX_SIZE 1000 // 所有的类型都统一定义为Elem ...
- 静态链表 C语言描述
静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4. ...
- 03静态链表_StaticLinkList--(线性表)
#include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...
- 静态链表实现 (A-B)U(B-A)
图中黄色部分为(A-B)U(B-A)的实际意义,用结构数组做静态链表来实现该表达式 大致流程是先建立A链表,接着将挨个输入的B中元素在A链表中遍历.如果没找到,就加到A链表结尾下标为endpointe ...
- C链表之创建简单静态链表
C代码: #include<stdio.h> #include<stdlib.h> #include<malloc.h> //创建简单静态链表 typedef st ...
- 【Java】 大话数据结构(3) 线性表之静态链表
本文根据<大话数据结构>一书,实现了Java版的静态链表. 用数组描述的链表,称为静态链表. 数组元素由两个数据域data和cur组成:data存放数据元素:cur相当于单链表中的next ...
- cf-Round541-Div2-F(并查集+静态链表)
题目链接:http://codeforces.com/contest/1131/problem/F 思路: 很容易看出这是一道并查集的题目,因为要输出每个cage中住的鸟的编号,故采用静态链表.用l[ ...
- 数据结构6: 静态链表及C语言实现
本节继续介绍线性表的另外一种链式表示——静态链表.(前面介绍的链表称为 动态链表 ). 逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成 ...
随机推荐
- excel 下拉级联,重新选第一个,清空后一个已赋值,并且改变后一个下拉的内容。
在前面的部分,设置下拉级联,我们已经可以百度到很多视频,我就不再多说,而我搞了一天解决 的,是在俩菜单都有值的情况下,重新选第一个下拉,后面那个值怎么清除,是一个事件调用.上图. 其中"$H ...
- Tomcat使用Memcached Session Manager管理Session
Tomcat使用Memcached Session Manager管理Session 废话不多说,直接进入主题.项目使用阿里云负载均衡+ECS服务器集群进行部署,Tomcat使用8.5版本.阿里云负载 ...
- python excel操作总结
1.openpyxl包的导入 Dos命令行输入 pip install openpyxl==2.3.3 这里注意一下openpyxl包的版本问题 版本装的太高有很多api不支持了,所以笔者这里用的是2 ...
- RMI原理及简单示例
分布式对象 在学习 RMI 之前,先来分布式对象(Distributed Object):分布式对象是指一个对象可以被远程系统所调用.对于 Java 而言,即对象不仅可以被同一虚拟机中的其他客户程序( ...
- Mac OSX Sierra WiFi connecting problem
吐槽一下,苹果的质量管控越来越差了. Mac OSX Sierra有时突然或升级后会遇到wifi不停重连连不上问题,现象为不停地连接wifi. 网上有人说删除 /Library/Preferences ...
- 手把手教你做个AR涂涂乐
前段时间公司有一个AR涂涂乐的项目,虽然之前接触过AR也写过小Demo,但是没有完整开发过AR项目.不过经过1个多星期的学习,现在已经把项目相关的技术都学会了,在此向互联网上那些乐于分享的程序员前辈们 ...
- 读learning spark lighting chapter1~chapter2
chapter 1 introduction to the analysis with spark the conponents of Sparks spark core(contains the b ...
- POP3是收邮件的协议,SMTP是发邮件的协议,IMAP是一种邮箱通信协议。
我也是第一次接触这种服务,是因为我自己在做一个小小的自动推送天气情况到自己邮箱.所以才碰到这个的/ 看一下标题,我们可以先这样理解. POP3(Post Office Protocol - Versi ...
- JDK中日期和时间的几个常用类浅析(三)
java.text.SimpleDateFormat SimpleDateFormat类是用于把字符串解析成日期时间和把日期时间格式化成字符串的工具类.该类主要和java.util.Date类配合 ...
- CSS -- 练习(待续优化)
啊啊啊 错误百出啊 错点总结: 字符全角半角.清楚浮动.结尾</div>有点乱找不到对应的了.注释要写好. <!DOCTYPE html> <html lang=&qu ...