静态链表实现(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语言实现
本节继续介绍线性表的另外一种链式表示——静态链表.(前面介绍的链表称为 动态链表 ). 逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成 ...
随机推荐
- ftp服务搭建
文件传输服务 主配置文件目录/etc/vsftpd/vsftpd.conf 首先安装ftp服务器 yum install vsftpd 默认存放文件的目录 /var/ftp/pub 匿名登陆 创建一 ...
- Spring IoC介绍与Bean的使用
1. 介绍 IoC IoC-Inversion of Control,即"控制反转",它不是什么技术,而是一种设计思想.在 Java 开发中, IoC意味着将设计好的对象交给容 ...
- 前端性能监控:window.performance
window.performance 是W3C性能小组引入的新的API,目前IE9以上的浏览器都支持.一个performance对象的完整结构如下图所示: memory字段代表JavaScript对内 ...
- Python 3中字符串可以被改变吗?
Python 3中字符串可以被改变吗? 字符串有改变这个方法的:replace,比如: a = 'lkjhgfdsa' a.replace(') '123kjhgfdsa' #返回结果 从上面这个例子 ...
- 基于Struts自定义MVC-1
自定义MVC 数据库:Oracle表:User(id,uname,upwd)自定义Struts框架一.定义Action接口 1 import javax.servlet.http.*; ...
- Java 注解 入门
这几天在学习Spring3.x,发觉现在许多框架都用上了java注解功能,然后自己就对java注解这方面初步学习了一下. 首先,注解跟注释不是一个意思,也根本不是同一个事物. 注释就是我们平常平常中对 ...
- ThinkPhp模板转Flask模板
Template Converter 网上的PHP资源很多,项目要用Python,所以想起做一个模板转换器,从ThinkPhp转成Flask的Jinja模板. 直接指定两个目录,将目录下的模板文件转换 ...
- 购买的wemall 6.0商城系统源码分享
使用方法 1.解压目录 2.cd wemall6 && npm i 3.配置config下的config.json 4.npm start 摒弃以往的开发框架thinkphp,使用no ...
- C# 使用Process调用外部程序中所遇到的参数问题
在使用Process.Start 调用外部程序时,除了程序的地址之外,是可以传递参数的,Process.Start 也有多个重载: // // 摘要: // 启动由包含进程启动信息(例如,要启动的进程 ...
- 关于web测试收集
页面部分 页面清单是否完整(是否已经将所需要的页面全部都列出来了) 页面是否显示(在不同分辨率下页面是否存在,在不同浏览器版本中页面是是否显示) 页面在窗口中的显示是否正确.美观(在调整浏览器窗口大小 ...