静态链表实现(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语言实现
本节继续介绍线性表的另外一种链式表示——静态链表.(前面介绍的链表称为 动态链表 ). 逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成 ...
随机推荐
- 了解 : angular $rootScope 在 ui-view
在view 的element 可以直接调用 <p>{{$stateParams.xx}}</p> 要让xx有资料必须注入 app.run["$rootScope&qu ...
- 每天一个linux命令(52)--wc命令
Linux 系统中的 wc(word count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出 1.命令格式: wc [选项] 文件 2.命令功能: 统计指定文件中的字节数.字 ...
- Android业务组件化之Gradle和Sonatype Nexus搭建私有maven仓库
前言: 公司的业务组件化推进的已经差不多三四个月的时间了,各个业务组件之间的解耦工作已经基本完成,各个业务组件以module的形式存在项目中,然后项目依赖本地的module,多少有点不太利于项目的并行 ...
- JavaScript中的文档模式和严格模式
JavaScript中的文档模式和严格模式 语法模式有普通模式和严格模式两种 普通模式:正常的JavaScript语法拼写以及代码编写(相对于严格模式存在着语法上的不严谨),尽可能的识别错误以及不规范 ...
- 转:关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
1. JSON.parse(jsonString): 在一个字符串中解析出JSON对象 ? 1 2 3 var str = '[{"href":"baidu.com&qu ...
- Kali linux learning note
from:http://blog.sina.com.cn/s/blog_40983e5e0101dhz0.html 因为kali linux基于debian 7,当然要把这台Acer 4736 ...
- POJ 2182 解题报告
Lost Cows Time Limit: 1000 MS Memory Limit: 65536 KB Description N (2 <= N <= 8,000) cows have ...
- mac 下 wget 安装
1.下载 wget 压缩包,wget 下载地址:ftp://ftp.gnu.org/gnu/wget/ 2.make && make install 3.如果提示 permission ...
- salesforce 零基础学习(六十七)SingleEmailMessage 那点事
在salesforce开发中,发送邮件是一个很常见的功能.比如在进入审批流以后的通过和拒绝的操作需要发送邮件给记录的owner,和其他系统交互以后更改了某些状态通知相关的User或者Contact等等 ...
- centos mail使用外部SMTP发送邮件
1.安装mailx yum install mailx -y 安装好后,编辑配置文件 mailx -V 12.4 7/29/08 <<mailx的版本号 rpm -qc mailx /e ...