链表--集合求差集

题目
线性表A和B分别表示两个集合A和B(同集合中的元素值各不相同、无序),用带头结点的单链表存储。

另辟空间构成一个线性表C,编写算法求C=A和B的差集。

结点结构:

typedef struct Node
{
int data;
struct Node *next;
}LNode,*LinkList;

要求:

(1)编写函数,实现输入数据建立集合单链表。

(2)编写函数,实现链表中元素的输出。

(3)如果需要复制链表,编写函数实现。

(4)编写函数,实现求集合A和B的差集C,保存到新的单链表。

调用上述函数,依次输出C中的元素。

Input
第1行输入A的元素个数

第2行输入A中的元素,以空格分隔

第3行输入B的元素个数

第4行输入B中的元素,以空格分隔

Output
依次输出C中的元素,以空格分隔。

(最后一个元素后面也有一个空格)

Sample Input

4

2 8 5 6

6

10 6 9 2 7 3

Sample Output

`8 5

#include "stdio.h"
#include "stdlib.h"
#include "conio.h"

typedef struct Node
{
   int data;
   struct Node *next;
}LNode,*LinkList;    
LinkList createLinkList(int n)
{
   LNode *head,*p,*q;
   int i,info;

   head=(LNode *) malloc(sizeof(LNode));
   if (!head) return NULL;
   head->next =NULL;
   q=head;
  for(i=1;i<=n;i++)
   {
      p=(LNode *) malloc(sizeof(LNode));
	  if (!p) return NULL;

	 // printf("\n Input the %dth element data: ",i);
	  scanf("%d",&info);
	  p->data=info;
	  q->next=p; p->next =NULL;  //p指向的结点插入单链表的表尾
	  q=p;                       //q总是指向当前单链表的最后一个结点(表尾)
   }
   return head;
   }
  
// 复制链表
LinkList copyList(LinkList list)
 {
    LinkList head = (LinkList)malloc(sizeof(LNode));
    head->next = NULL;
    LinkList p = list->next;
    LinkList q = head;
    while (p) {
        LinkList newNode = (LinkList)malloc(sizeof(LNode));
        newNode->data = p->data;
        newNode->next = NULL;
        q->next = newNode;
        q = q->next;
        p = p->next;
    }
    return head;
}

// 求集合A和B的差集C
LinkList difference(LinkList A, LinkList B)
 {
    LinkList C = (LinkList)malloc(sizeof(LNode));
    C->next = NULL;
    LinkList p = A->next;
    while (p) {
        int flag = 1;
        LinkList q = B->next;
        while (q) {
            if (p->data == q->data) {
                flag = 0;
                break;
            }
            q = q->next;
        }
        if (flag) {
            LinkList newNode = (LinkList)malloc(sizeof(LNode));
            newNode->data = p->data;
            newNode->next = NULL;
            LinkList r = C;
            while (r->next)
                r = r->next;
            r->next = newNode;
        }
        p = p->next;
    }
    return C;
}
  void displayLinkList(LinkList head)
{
  LNode *p;

  int i=0;
  p=head->next;
  while(p)
  {
	  printf("%d ",p->data);
      p=p->next;

  }
}
int main()
{
int n,m;
  LinkList A,B,C;
  scanf("%d",&n);
  A=createLinkList(n); 
 scanf("%d",&m);
  B=createLinkList(m);
  C=difference(A,B);
 displayLinkList(C);
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值