求集合(用单链表表示)的并、交和差运算

目的:

掌握单链表的应用和有序单链表的二路归并算法设计。

内容:

编写程序,采用单链表表示集合(假设同一个结合中不存在重复的元素),将其按递增方式排序,构成有序单链表,并求这样的两个集合的并、交和差。

这里一定要建新表,不要在原来的表上改,不然后面全错了,血的教训,浪费了我贼多时间。

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;	//元素的数据类型

typedef struct LNode {
	ElemType data;		//结点的数据域
	struct LNode *next;	//指向后继结点
} LinkNode;		 		//单链表结点类型

//尾插法建立单链表,细节不表
void CreateListR(LinkNode *&L, ElemType a[], int n);

//输出线性表,细节不表
void DispList(LinkNode *L);

//求两个有序集合的并
void Union(LinkNode *A, LinkNode *B, LinkNode *&C);

//求两个有序集合的交
void InterSect(LinkNode *A, LinkNode *B, LinkNode *&C);

//求两个有序集合的差
void Subs(LinkNode *A, LinkNode *B, LinkNode *&C);

int main()
{
	LinkNode *A, *B, *C;
	int n, m;

	scanf("%d", &n);
	ElemType a[n];
	for (int i = 0; i < n; i++)
		scanf("%d", &a[i]);

	scanf("%d", &m);
	ElemType b[m];
	for (int i = 0; i < m; i++)
		scanf("%d", &b[i]);

	CreateListR(A, a, n);
	CreateListR(B, b, m);

	Union(A, B, C);
	printf("集合A与B的并: ");
	DispList(C);

	InterSect(A, B, C);
	printf("集合A与B的交: ");
	DispList(C);

	//DispList(A);
	//DispList(B);
	Subs(A, B, C);
	printf("集合A与B的差: ");
	DispList(C);

	return 1;
}

/* 请在下面填写答案 */

void CreateListR(LinkNode *&L, ElemType a[], int n)
{
    L=(LinkNode *)malloc(sizeof(LinkNode));
    L->next=NULL;
    LinkNode *p,*r=L;
    for(int i=0;i<n;i++)
    {
        p=(LinkNode *)malloc(sizeof(LinkNode));
        p->data=a[i];
        r->next=p;
        r=p;
    }
    r->next=NULL;
}

void DispList(LinkNode *L)
{
    if(L->next==NULL) printf("NULL");
    else{
        LinkNode *p=L->next;
        while(p)
        {
            printf("%d ",p->data);
            p=p->next;
        }
    }
    printf("\n");
}

///这里千万要建立新表
///否则A,B表就会改变,影响下面的操作
void Union(LinkNode *A, LinkNode *B, LinkNode *&C)
{
    C=(LinkNode *)malloc(sizeof(LinkNode));
    LinkNode *i=A->next,*j=B->next,*r=C,*p;
    while(i&&j)
    {
        if(i->data<j->data)
        {
            p=(LinkNode *)malloc(sizeof(LinkNode));
            p->data=i->data;
            r->next=p;
            r=p;
            i=i->next;
        }
        else if(i->data>j->data)
        {
            p=(LinkNode *)malloc(sizeof(LinkNode));
            p->data=j->data;
            r->next=p;
            r=p;
            j=j->next;
        }
        else{
            p=(LinkNode *)malloc(sizeof(LinkNode));
            p->data=j->data;
            r->next=p;
            r=p;
            i=i->next;
            j=j->next;
        }
    }
    if(j) r->next=j;
    if(i) r->next=i;
}


///这里也必须建立新表
///否则A,B表就会改变,影响下面的操作
void InterSect(LinkNode *A, LinkNode *B, LinkNode *&C)
{
    C=(LinkNode *)malloc(sizeof(LinkNode));
    LinkNode *i=A->next,*j=B->next,*r=C,*p;
    while(i&&j)
    {
        if(i->data<j->data) i=i->next;
        else if(i->data>j->data) j=j->next;
        else{
            p=(LinkNode *)malloc(sizeof(LinkNode));
            p->data=i->data;
            r->next=p;
            r=p;
            i=i->next;
            j=j->next;
        }
    }
    r->next=NULL;
}

void Subs(LinkNode *A, LinkNode *B, LinkNode *&C)
{
    C=(LinkNode *)malloc(sizeof(LinkNode));
    LinkNode *i=A->next,*j=B->next,*r=C,*p;
    while(i&&j)
    {
        if(i->data<j->data)
        {
            p=(LinkNode *)malloc(sizeof(LinkNode));
            p->data=i->data;
            r->next=p;
            r=p;
            i=i->next;
        }
        else if(i->data>j->data)
        {
            j=j->next;
        }
        else{
            i=i->next;
            j=j->next;
        }
    }
    if(i) r->next=i;  ///如果A有剩余
    else r->next=NULL;
}

猜你喜欢

转载自blog.csdn.net/armerzu/article/details/82954003
今日推荐