数据结构之线性表的静态单链表存储结构(应用求集合(A-B)&&(B-A))

线性表的静态单链表存储结构(应用求集合(A-B)&&(B-A))

运行截图:

这里写图片描述

源代码:

//运行环境:VS2015
//(A-B)&&(B-A)

//头文件
#include "stdafx.h"
#include<stdio.h>

//宏定义
#define MAXSIAZE 100
#define OK 1

//定义结构体
typedef struct
{
    int data;
    int cursor;
}componet, SLinkList[MAXSIAZE];

//查找元素的位序
int locateSListElem(SLinkList S, int e)
{
    //在静态单链线性表S中查找第一个值为e的元素
    //若查找到,则返回其在S中的位序,否则返回0
    int i = S[0].cursor;
    while (i&&S[i].data != 0)
    {
        i = S[i].cursor;
    }
    return  i;
}

//初始化
int initSListSpace(SLinkList &space)
{
    //将一维数组space各个分量链成一个备用链表,space[0].cursor为头指针
    //0表示空指针
    for (int i = 0; i <MAXSIAZE-1; i++)
    {
        space[i].cursor = i + 1;
    }
    space[MAXSIAZE - 1].cursor = 0;
    return OK;
}

//分配空间
int mallocSList(SLinkList &space)
{
    //若备用链表非空,则返回分配的节点下标,否则返回0
    int i = space[0].cursor;
    if (space[0].cursor)
    {
        space[0].cursor = space[i].cursor;
    }
    return i;
}

//回收节点
int freeSList(SLinkList &space, int k)
{
    //将下标为k的空闲节点回收到备用链表中
    space[k].cursor = space[0].cursor;
    space[0].cursor = k;
    return OK;
}

//求集合中的不同元素的并集
int difference(SLinkList &space, int &S)
{
    //依次输入集合A和B的元素,一维数组space中建立表示集合(A-B)&&(B-A)的静态链表,
    //S为其头指针。假设备用空间足够大,space[0].cursor为其头指针
    initSListSpace(space);
    S = mallocSList(space);
    int r = S;//r指向S的最后节点
    int m, n;
    printf("输入集合A和B中元素的个数:");
    scanf_s("%d%d", &m,&n);
    printf("请输入集合A:");
    for (int j = 1; j <= m; j++)
    {
        int i = mallocSList(space);
        scanf_s("%d", &space[i].data);
        space[r].cursor = i;
        r = i;
    }
    space[r].cursor = 0;
    printf("请输入集合B:");
    for ( int j = 1;j <= n;j++)
    {
        int b;
        scanf_s("%d", &b);
        int p = S;
        int k = space[S].cursor;
        while (k!=space[r].cursor&&space[k].data!=b)
        {
            p = k;
            k = space[k].cursor;
        }
        if (k==space[r].cursor)
        {
            int i = mallocSList(space);
            space[i].data=b;
            space[i].cursor = space[r].cursor;
            space[r].cursor = i;
        }
        else
        {
            space[p].cursor = space[k].cursor;
            freeSList(space, k);
            if (r == k)r = p;
        }
    }
    return OK;
}

//测试
int main()
{
    SLinkList S;
    int n;
    initSListSpace(S);
    difference(S, n);
    printf_s("(A-B)&&(B-A)={");
    for(int i=S[n].cursor;;i=S[i].cursor)
    {
        printf_s("%d ", S[i].data);
        if (!S[i].cursor)break;
    }
    printf_s("}\n");
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值