一、问题描述

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. 对Cookie和Session的深入理解

    session对象 session对象用于存储特定的用户会话所需的信息 . Session对象的引入是为了弥补HTTP协议的不足.HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端 ...

  2. wifi 4次握手

    转自:http://zhaoxiaobu.blog.51cto.com/878176/407130/ 不管是用WEP加密,还是用WPA,一般如果我们要和AP建立一个连接,要经过两个阶段认证(Authe ...

  3. Delphi线程同步(临界区、互斥、信号量)

    当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源. 例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件的字符数.当然,在整个文件调入内存之前,统计它的计数是 ...

  4. [LeetCode] Merge Sorted Array

    Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume tha ...

  5. windows7下安装php的imagick和imagemagick扩展教程

    这篇文章主要介绍了windows7下安装php的imagick和imagemagick扩展教程,同样也适应XP操作系统,Win8下就没测试过了,需要的朋友可以参考下 最近的PHP项目中,需要用到切图和 ...

  6. 在Activity和Application中使用SharedPreferences存储数据

    1.在Activity中创建SharedPreferences对象及操作方法 SharedPreferences pre=getSharedPreferences("User", ...

  7. 让用VS2012/VS2013编写的程序在XP中顺利运行

    转自:http://blog.csdn.net/asanscape/article/details/38752655/ 微软为了推销自家平台,默认配置下VS2012和VS2013编写的应用程序只能在V ...

  8. ARM伪指令,王明学learn

    ARM伪指令 在ARM汇编语言程序中里,有一些特殊指令助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作.伪指令在元程序中的作用是为完成汇编 ...

  9. 链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的

    解决方法: 1.打开该项目的"属性页"对话框. 2.单击"链接器"文件夹. 3.单击"命令行"属性页. 4.将 /SAFESEH:NO 键入 ...

  10. Mac系统修改Intellij Idea默认JDK版本

    Intellij IDEA 默认情况下,使用的jdk的版本是1.6,当第一次启动IDEA的时候,如果系统中未安装jdk,则系统会自动到苹果官网下载jdk安装文件.如果你的系统已经安装了jdk1.7或是 ...