一、问题描述

1、题目内容:集合的并、交和差运算

编写一个能演示执行集合的并、交和差运算的程序。

2、基本要求

由用户输入两组整数分别作为两个集合的元素,由程序计算它们的交、并和差集,并将运算结果输出。

3、测试数据

测试数据为两组正整数,范围最好在0~35000之间。

S1={3,5,6,9,12,27,35};

S2={5,8,10,12,27,31,2,51,55,63};

运行结果:

S1ÈS2={3,5,6,8,9,10,12,27,31,35,42,51,55,63},

S1ÇS2={5,12,27}

S1-S2={3,6,9,35}。

实现提示:

以有序链表表示正整数集合。

代码:

 //2013-3-12

 //list头文件

 //合理的设置模式(隔离变化)

 typedef int ElemType;

 //定义结点
struct ListNode
{
ElemType data;
ListNode* next;
}; //定义链表类
//注意接口的粒度的合理性 class List
{
private:
ListNode* m_head;//头指针
ListNode* m_tail;//尾指针
int m_length;//链表的结点数目 public:
//
List();
//在链表的后面追加元素
//重载该函数
//值专递,方便输入
//地址传递,提高效率
void AppendNode(ListNode item);
void AppendNode(ListNode* item);
//清空链表
void ClearList();
//返回链表的长度
int LengthList();
//返回L中第index个元素
//以0开始
ListNode* GetList(int index);
//遍历输出l中所有元素
void TraverseList();
//查找item元素,并在index中保存下标
bool FindList(ListNode* item,int* index);
//更新第index个元素
bool UpdateList(int index,const ListNode item);
//
bool InsertList(ListNode* item,int index);
//
bool DeleteList(ListNode item); //
void CopyList(List* list);
}; //2013-3-13 //list cpp #include<iostream> #include"List.h" using namespace std; //
List::List()
{
m_head=m_tail=NULL;
m_length=;
} //ok
void List::AppendNode(ListNode item)
{
//在堆里分配的内存
ListNode* pitem=new ListNode(item); //如果链表为空
if (m_head==NULL)
{
m_head=pitem;
m_tail=pitem;
++m_length;
}else
{
//如果不为空
m_tail->next=pitem;
pitem->next=NULL;
m_tail=pitem;
++m_length;
} } //ok
void List::AppendNode(ListNode* item)
{
//如果链表为空
if (m_head==NULL)
{
m_head=item;
m_tail=item;
++m_length;
}else
{
//如果不为空
m_tail->next=item;
item->next=NULL;
m_tail=item;//指针往后移
++m_length;
} } void List::ClearList()
{ ListNode* cp;
ListNode* np;
cp=m_head;
while (cp!=NULL)
{
np=cp->next;
delete cp;
cp=np;
}
m_tail=m_head=NULL;
m_length=; } //ok
int List::LengthList()
{
return m_length;
} //0下标开始
ListNode* List::GetList(int index)
{
int readindex=index-;
ListNode* finder; if (readindex>m_length)
{
cout<<"查找失败."<<endl;
return NULL;
} //first node
if (readindex==)
{
return m_head;
} //last node
if (readindex==(m_length-))
{
return m_tail;
} //else
finder=m_head;
for (int i = ; i <= readindex; i++)
{
finder=finder->next;
}
return finder;
} //ok
void List::TraverseList()
{
ListNode* out=m_head; if (m_length!=)
{
while (out!=NULL)
{
cout<<out->data<<" ";
out=out->next;
}
}
} bool List::FindList(ListNode* item,int* index)
{
ListNode* currnode=m_head;
int item_index=; while ((currnode->data!=item->data)&&item_index++<m_length-)
{
currnode=currnode->next;
} if (item_index>=m_length)
{
*index=-;
return false;
}else
{
*index=item_index+;
return true;
}
} //ok
bool List::UpdateList(int index,const ListNode item)
{
ListNode* updatenode=GetList(index);
if (updatenode!=NULL)
{
updatenode->data=item.data;
return true;
}
return false;
} //2013-3-14
//
// 在链表不为空的前提下
//ok
bool List::InsertList(ListNode* item,int index)
{
//找到将要插入的前一项
ListNode* previtem=GetList(index); if (previtem==NULL)
{
cout<<"插入失败。"<<endl;
return false;
} //item指向previtem的下一个元素
item->next=previtem->next; //previtem指向item
previtem->next=item; previtem=item=NULL;
//长度+1
++m_length; return true;
} //
//ok
bool List::DeleteList(ListNode item)
{
//将要删除的元素的前驱变量
ListNode* prevdelenode=m_head; //要删除的元素的指针
ListNode* delenode=m_head; //
while ((delenode->data!=item.data)&&delenode!=NULL)
{
prevdelenode=delenode;
delenode=delenode->next;
} if (delenode==NULL)
{
cout<<"不存在该元素。"<<endl;
return false;
} //如果是删除第一个
if (delenode==m_head)
{
prevdelenode=NULL;
m_head=m_head->next;
delete delenode;
--m_length;
return true;
} //如果是删除最后一个
if (delenode==m_tail)
{
m_tail=prevdelenode;
m_tail->next=NULL; prevdelenode=NULL; delete delenode;
--m_length;
return true;
} //prevdelenode指向delenode的下个元素
prevdelenode->next=delenode->next;
//
delenode->next=NULL;
//
delete delenode;
//
--m_length; return true; } void List::CopyList(List* list)
{
ListNode node={NULL,NULL};
ListNode* datanode=list->m_head;
while (datanode!=NULL)
{
node.data=datanode->data;
AppendNode(node);
datanode=datanode->next;
} } //2013-3-14 #include<iostream> #include"List.h" using namespace std; int main()
{
List set1;
List set2; List add_set;//并集
List same_set;//交集
List cut_set;//差集 ListNode node={NULL,NULL};
cout<<"请输入set1的数值,以-1结束。"<<endl;
while (cin>>(node.data),(node.data)!=-)
{
set1.AppendNode(node);
} cout<<"请输入set2的数值,以-1结束。"<<endl;
while (cin>>(node.data),(node.data)!=-)
{
set2.AppendNode(node);
} //将set1复制到三个集合
add_set.CopyList(&set1);
same_set.CopyList(&set1);
cut_set.CopyList(&set1); ListNode set2_node={NULL,NULL},set1_node={NULL,NULL};
int nothing=;//作为函数参数引用
//遍历set2集合
for (int i = ; i <= set2.LengthList(); i++)
{ set2_node.data=set2.GetList(i)->data; //add_set
if (!add_set.FindList(&set2_node,¬hing))//NULL=worng
{
add_set.AppendNode(set2_node);
} //cut_set
if (cut_set.FindList(&set2_node,¬hing))
{
cut_set.DeleteList(set2_node);
} } //遍历set1集合
for (int i = ; i <=set1.LengthList(); i++)
{
//same_set
set1_node.data=set1.GetList(i)->data; if (!set2.FindList(&set1_node,¬hing))
{
same_set.DeleteList(set1_node);
}
} cout<<endl<<"并集:";
add_set.TraverseList();
cout<<endl<<"交集:";
same_set.TraverseList();
cout<<endl<<"差集:";
cut_set.TraverseList();
cout<<endl; char ch=getchar();
return ;
}

c++实现单向链表的更多相关文章

  1. Reverse Linked List II 单向链表逆序(部分逆序)

    0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...

  2. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

    第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...

  3. 输出单向链表中倒数第k个结点

    描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int       m_nKey; ListNode* ...

  4. Linus:利用二级指针删除单向链表

    Linus大神在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level codi ...

  5. 【转】Linus:利用二级指针删除单向链表

    原文作者:陈皓 原文链接:http://coolshell.cn/articles/8990.html 感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多, ...

  6. C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

    #include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...

  7. 数据结构——Java实现单向链表

    结点类: /** * @author zhengbinMac * 一个OnelinkNode类的对象只表示链表中的一个结点,通过成员变量next的自引用方式实现线性表中各数据元素的逻辑关系. */ p ...

  8. 输入一个单向链表,输出该链表中倒数第K个结点

    输入一个单向链表,输出该链表中倒数第K个结点,具体实现如下: #include <iostream> using namespace std; struct LinkNode { publ ...

  9. 单向链表JAVA代码

        //单向链表类 publicclassLinkList{       //结点类     publicclassNode{         publicObject data;         ...

  10. C++ 单向链表反转

    单向链表反转,一道常见的面试题,动手实现下. #include "stdafx.h" #include <stdlib.h> struct Node{ int data ...

随机推荐

  1. [LeetCode] Remove Duplicates from Sorted List

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  2. Angular JS [Draft]

    AngularJS应用是完全运行在客户端的应用.没有后端的支持,我们只能展示随页面一起加载进来的数据.AngularJS提供了几种方式从服务器端获取数据. $http服务 $http 封装了浏览器原生 ...

  3. wp8 入门到精通 Gallery

    <Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.Resources> ...

  4. WPF ListView展示层叠信息

    通常我们在ListView中展示一列同类数据,例如城市名称.不过可以对ListView的DataTemplate稍作修改,让其显示层叠信息.例如:需要在ListView中显示省份和省份对应的城市名称. ...

  5. SSH Key连接github提示Permission denied (publickey).错误

    root@debian64:/home/xiaoliuzi/.ssh/key_backup# ssh -T git@github.com The authenticity of host 'githu ...

  6. I/O复用模型之epoll学习

    简介: epoll是linux下多路复用I/O接口select/poll的增强版,它能够显著提高程序在大量并发连接中只有少量活跃的情况下的系统cpu利用率,原因是它会复用文件描述符集合来传递结果而不用 ...

  7. AIDL

    在介绍跨程序进程间通信AIDL前,先看一下本程序activity与某个服务是怎么绑定在一起进行交互的. 需求:服务有两个方法.分别是播放音乐与停止播放音乐.该程序的活动要访问这两个方法,在activi ...

  8. MOB 短信验证

    工具/原料   Android Studio mob SDK中的jar 和.so文件 方法/步骤   1 把3个jar 放入libs   并添加依赖 在项目的build.gradle里面   在你的项 ...

  9. 第一个vs2013控制台程序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. Liferay 6.2 改造系列之十五:修改默认可用语言

    在/portal-master/portal-impl/src/portal.properties文件中,有如下配置: # # Specify the locales that are enabled ...