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

本文介绍了一种使用链表实现集合的操作方法,包括初始化、合并、求交集及差集等功能,并通过C++代码实现了这些功能。文章通过具体实例展示了如何进行集合运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值