`
jaychang
  • 浏览: 735874 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

单链表实现集合并交差操作

 
阅读更多
#include<iostream>

using namespace std;

typedef struct Node{
  char data;
  Node *next;
}Node,*LinkList;

#define SIZE sizeof(Node)
#define FALSE 0
#define TRUE 1

//初始化集合
void InitLinkList(LinkList Head)
{
  char ch;Node *p=Head;
  Head->next=NULL;
  Head->data='\0';
  cin>>ch;
  while(ch!='#')
  {
     Node *newNode=(Node*)malloc(SIZE);
     newNode->data=ch;
     p->next=newNode;
     p=p->next;
     cin>>ch;
  }
  p->next=NULL;
}

//检查p1或p2所指向数据结点该不该加入到Head为起始的集合中^-^有点拗口,表达不是很好
int Check(char ch,LinkList Head)
{
  Node *temp=Head->next;
  int flag=TRUE;
  while(temp!=NULL)
  {
     if(temp->data==ch){//不需要将数据插入
        flag=FALSE;
        return flag;
     }
     temp=temp->next;
  }
  return flag;
}

//合并两个集合
LinkList Merge(LinkList Head1,LinkList Head2)
{
  LinkList Head=(Node*)malloc(SIZE);
  Head->data='\0';Head->next=NULL; 
  Node *p1=Head1->next;
  Node *p2=Head2->next;
  Node *p=Head;
  while(p1!=NULL&&p2!=NULL)
  {
     if(p1->data==p2->data)
     {
       if(Check(p1->data,Head)==TRUE)
       {
           Node *newNode=(Node*)malloc(SIZE);
           newNode->data=p1->data;
           p->next=newNode;
           p=newNode;
           p->next=NULL;
       }
   }
   else
   {
      if(Check(p1->data,Head)==TRUE)
      {
          Node *newNode=(Node*)malloc(SIZE);
          newNode->data=p1->data;
          p->next=newNode;
          p=newNode;
          p->next=NULL;
      }
      if(Check(p2->data,Head)==TRUE)
      {
          Node *newNode=(Node*)malloc(SIZE);
          newNode->data=p2->data;
          p->next=newNode;
          p=newNode;
          p->next=NULL;
       }
    }
    p1=p1->next;
    p2=p2->next;
  }
  while(p1!=NULL)
  {
      if(Check(p1->data,Head)==TRUE)
      {
         Node *newNode=(Node*)malloc(SIZE);
         newNode->data=p1->data;
         p->next=newNode;
         p=newNode;
         p->next=NULL;
      }
      p1=p1->next;
  }
  while(p2!=NULL)
  {
      if(Check(p2->data,Head)==TRUE)
     {
        Node *newNode=(Node*)malloc(SIZE);
        newNode->data=p2->data;
        p->next=newNode;
        p=newNode;
        p->next=NULL;
      }
      p2=p2->next;
  }
  return Head;
}

//集合A中的元素,B中是否存在
int IsExist(char data,LinkList Head)
{
  Node *p=Head->next;
  int flag=FALSE;
  while(p!=NULL)
  {
     if(p->data==data)
        return flag=TRUE;
     p=p->next;
  }
  return flag;
}

int IsExist2(char data,LinkList Head)
{
  Node *p=Head->next;
  int flag=FALSE;
  while(p!=NULL)
  {
     if(p->data==data)
        return flag;
     p=p->next;
  }
  return flag=TRUE;
}

//两个集合的差集
LinkList Deprive(LinkList Head1,LinkList Head2)
{
  LinkList Head=(Node*)malloc(SIZE);
  Node *p=Head;
  Node *p1=Head1->next;
  while(p1!=NULL)
  {
    if(IsExist2(p1->data,Head2)==1)
    {
        Node *newNode=(Node*)malloc(SIZE);
        newNode->data=p1->data;
        p->next=newNode;
        p=newNode;
        p->next=NULL;
     }
     p1=p1->next;
  }
  return Head;
}

//两个集合交集
LinkList Insection(LinkList Head1,LinkList Head2)
{
  Node *p1=Head1->next;
  //Node *p2=Head2->next;
  LinkList Head=(Node*)malloc(SIZE);
  Head->data='\0';Head->next=NULL;
  Node *p=Head;
  while(p1!=NULL)
  {
    if(IsExist(p1->data,Head2)==1)
    {
       Node *newNode=(Node*)malloc(SIZE);
       newNode->data=p1->data;
       p->next=newNode;
       p=newNode;
       p->next=NULL;
     }
     p1=p1->next;
  }
  return Head;
}

//打印集合元素
void PrintLinkList(LinkList Head)
{
  Node *p=Head->next;
  while(p!=NULL)
  {
     cout<<p->data;
     p=p->next;
  }
  cout<<"\n";
}

int main()
{
  char cmd;
  do{
      cout<<"输入两个集合的元素,输完一个集合的元素,按#结束\n";
      LinkList head1=(Node*)malloc(SIZE);
      LinkList head2=(Node*)malloc(SIZE);
      InitLinkList(head1);InitLinkList(head2);
      Node *Head1=Merge(head1,head2);
      cout<<"两个集合合集为\n";
      PrintLinkList(Head1);
      Node *Head2=Insection(head1,head2);
      cout<<"两个集合交集为\n";
      PrintLinkList(Head2);
      Node *Head3=Deprive(head1,head2);
      cout<<"两个集合差集为\n";
      PrintLinkList(Head3);
      cout<<"按y/Y继续,否则结束\n";
      cin>>cmd;
  }while(cmd=='y'||cmd=='Y');
  return 0;
}
 
分享到:
评论

相关推荐

    基于单链表实现集合的并交差运算实验报告.pdf

    总结来说,这个实验报告涉及了单链表的基础操作,包括创建、插入、输出、查询、删除等,以及使用单链表实现集合的并、交、差运算的概念。在实际应用中,这些基础操作是数据结构和算法学习的重要组成部分,对于理解...

    c语言实现集合并交差

    总之,C语言实现集合并交差是通过自定义单链表数据结构并编写相应的操作函数来完成的。这种方法不仅有助于理解数据结构和算法,还能在实际项目中灵活应用。在进行集合操作时,要特别注意内存管理,确保正确分配和...

    Java集合并交差运算[汇编].pdf

    本文件主要涉及的是如何使用Java语言实现单链表的基础操作以及集合的交、并和差运算。下面将详细阐述这些知识点。 首先,单链表是一种基本的数据结构,由一系列节点组成,每个节点包含数据域和指向下一个节点的引用...

    数据结构实现的集合交并差运算

    该项目通过单链表实现了集合的基本操作和集合运算。单链表作为一种线性数据结构,在处理集合运算时具有较高的灵活性。通过上述的关键技术点分析,我们可以了解到如何使用单链表来有效地实现集合的交集、并集和差集...

    集合的并、交和差运算的程序课程设计报告

    为了实现集合的运算,选择了单链表作为数据结构。单链表是一种线性结构,其中每个元素(节点)包含一个数据域和一个指针域,指针域指向下一个节点的位置。选择单链表的原因在于它的灵活性和效率:在链式存储结构中,...

Global site tag (gtag.js) - Google Analytics