一、问题描述

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. 菜鸟学Linux命令:tar命令 压缩与解压缩

    tar命令可以为linux的文件和目录创建档案.利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件. tar最初被用来在磁带上创建档案,现在,用户可以 ...

  2. 【openGL】画直线

    #include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> #include <math ...

  3. Visual Studio Code 1.0发布:100+语言,300+pull请求,1000+扩展

    在第一个预览版发布一年后,微软发表了Visual Studio Code 1.0. 在//BUILD 2015大会上,微软宣布,他们的一个团队需要几个月来创建Visual Studio Code的第一 ...

  4. MicroService/web Service/webAPI/RPC

    [TOC] 微服务 服务拆分,利用轻量化机制(通常为HTTP源API)实现通信,复杂度可控,独立部署,技术选型灵活,容错,扩展. 康威定律的实际体现 微服务架构模式深刻影响了应用和数据库之间的关系,不 ...

  5. hdu 5833 Zhu and 772002 高斯消元

    Zhu and 772002 Problem Description Zhu and 772002 are both good at math. One day, Zhu wants to test ...

  6. Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA/(树链剖分+数据结构) + MST

    E. Minimum spanning tree for each edge   Connected undirected weighted graph without self-loops and ...

  7. hdu1059 多重背包(转换为01背包二进制优化)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1059 之前写过一个多重背包二进制优化的博客,不懂请参考:http://www.cnblog ...

  8. hdu1114 完全背包

    题意:给出钱罐的重量,然后是每种钱的价值和重量,问钱罐里最少可能有多少钱. 完全背包. 代码: #include<iostream> #include<cstdio> #inc ...

  9. 浩瀚PDA无线POS盘点机(安装盘点程序):盘点结果实时上传到PC电脑端

    手持终端机的盘点部分改进, 1可以通过wifi联网到后台, 2也可以暂存在手持终端机上,盘点完后一次性上传到电脑上.

  10. 【CRL in c#】常量与字段

    1.常量(constant) 1,  常量是一个从不变化的值.只有在确定一个符号的值从不变化时使用. 2,  只能为基元类型定义常量(Boolean,Char,Byte,Int32……),非基元类型定 ...