数据结构中集合的交集并集差集的实验报告

(一)具体实验报告如下

(一)  问题描述

编制一个能用顺序表实现求集合的交、并和差集的程序。

(二)  基本要求

1.集合元素限定为小写字母字符[‘a’..’z’]。

2.用顺序表存储结构实现。

3.自己设计菜单界面,可用最简单的DOS菜单(黑屏上各种功能各占一行,前有序号,可选)

4.各模块进入前应实现刷屏(用clrscr()函数即可)

(三)  测试数据

1.Set1=”magazine”,Set2=”paper”,Set1ỤSet2=”magzinepr”,

Set1∩Set2=”ae”,Set1-Set2=”mgzin”。

2.Set1=”012oper4a6tion89”,Set2=”error data”,

Set1ỤSet2=”operatind”,Set1∩Set2=”oerat”,Set1-Set2=”pin”。

(四)  实现提示

用顺序表表示集合,注意在C语言中引用的使用。

 (五)实验思路

1.定义结构体

2.创建链表初始化

void InitList(LinkList *head)

3.尾插法获取键盘输入

void InsertList(LinkList*head)

4.去掉集合中重复的元素

void deleteList(LinkList la)

5.设置链表的遍历函数

void printList(LNode*head1)

6.递归的方法去复制链表

LinkList fuzhi(LNode *Lista)

7.定义取交集函数

void jiaoji(LNode *head1,LNode*head2,LNode*head3)

8.定义取全集函数

void bingji(LNode*head1,LNode*head2)

9.定义取差集函数

void chaji(LNode*head1,LNode*head2)

(六)C代码实现

#include <stdio.h>

#include <stdlib.h>

typedef struct stu

{

char data;

struct stu *next;

}LNode,*LinkList;

void initlist(LNode**head)//初始化

{

*head=(LinkList)malloc(sizeof(LNode));

(*head)->next=NULL;

}

void InsertList(LNode**head)//尾插法

{   char e;

LNode*p=*head;

scanf("%c",&e);

while(e!='0')

{LNode*s=(LNode*)malloc(sizeof(LNode));

s->data=e;

s->next=p->next;

p->next=s;

p=s;

scanf("%c",&e);

}

}

void printList(LNode*head1)//遍历

{

LNode*p=head1->next;

while(p!=NULL)

{

    printf("%c",p->data);

    p=p->next;

}

}

void deleteList(LinkList la)//元素的去重

{

LinkList pre=la->next;

LinkList p,q,u;

int m;

while(pre!=NULL)

{

    m=pre->data ;

    q=pre;

    p=pre->next;

    while(p!=NULL)

    {

        if(p->data==m)

        {

           u=p;

           p=p->next ;

           q->next =p;

           free(u);

        }

        else

        {q->next =p;

        q=p;

        p=p->next ;

        }

   }

    q->next=p;

pre=pre->next;

}

}

void jiaoji(LNode *head1,LNode*head2,LNode*head3)//取交集

{LNode*p1=head1->next;

LNode*p2=head2->next;

LNode*p3=head3;

while(p1!=NULL)

  {p2=head2->next;

     while(p2!=NULL)

     { 

        if(p1->data==p2->data)

        {LNode*s=(LNode*)malloc(sizeof(LNode));

         s->data=p1->data;

         s->next=p3->next;

         p3->next=s;

         p3=s;

        }

      p2=p2->next;

     }

p1=p1->next;

  }

}

void bingji(LNode*head1,LNode*head2)

{LNode*p=head1;

  while(p->next!=NULL)//找到尾结点

   {p=p->next;

   }

p->next=head2->next;//此时head1为并集

deleteList(head1); //head1去重

}

LinkList fuzhi(LNode *Lista)

{LinkList Listb;

if(Lista==NULL)

 return NULL;

 else

 {Listb=(LinkList)malloc(sizeof(LNode));

   Listb->data=Lista->data;

   Listb->next =fuzhi(Lista->next);

   return Listb;

   

 }

}

void chaji(LNode*head1,LNode*head2)//去掉head1中head2的部分

{ LNode*p1;

  p1=head1->next;

  LNode*p2;

  p2=head2->next;

  LNode*q,*pf=head1;

 while(p1!=NULL)

 {  p2=head2->next;

    while(p2!=NULL)

    {if(p1->data==p2->data)

       {

           q=p1->next;

           pf->next=q;

           free(p1);

       p1=q;

       //break;     

   }

   p2=p2->next;

}

if(p1!=NULL)

{pf=p1;

p1=p1->next;

}

else

p1=pf->next;

 }

}

int main() {

   int a;

   while(1)

{LNode*head1;

    LNode*head4;

    initlist(&head4);

    printf("请输入第一个集合(0为结束标志)");

    initlist(&head1);

    InsertList(&head1);

    deleteList(head1);

 //printList(head1);

 head4=fuzhi(head1);     //保留head1的集合给head4;

LNode*head2;

     printf("请输入第二个集合(0为结束标志)");

    initlist(&head2);

    InsertList(&head2);

    deleteList(head2);

//printList(head2);

LNode*head3;

initlist(&head3);

jiaoji(head1,head2,head3);

printf("交集为:");

printList(head3);

printf("\n");

if(head3->next==NULL)

printf("交集为空\n");

bingji(head1,head2);

printf("并集为") ;

printList(head1);//head1为并集

//printf("\n");

    chaji(head4,head3);//head4为head1,head3为交集

    printf("差集为");

    printList(head4);

   printf("\n");

   printf("是否继续\n");

   printf("1.退出\n");

    printf("2.继续\n");

   scanf("%d",&a);

   if(a==1)

   break;

   if(a==2)

   continue;

  

}

return 0;

} (七)运行结果

(二)具体代码

#include <stdio.h>
#include <stdlib.h>

typedef struct stu
{
	char data;
	struct stu *next;
	
}LNode,*LinkList; 
void initlist(LNode**head)//初始化 
{
	*head=(LinkList)malloc(sizeof(LNode));
	(*head)->next=NULL;
}

void InsertList(LNode**head)//尾插法 
{   char e;
	LNode*p=*head;
	scanf("%c",&e);
	while(e!='0')
	{LNode*s=(LNode*)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	p=s;
	scanf("%c",&e);
	}
	
	
}
void printList(LNode*head1)//遍历 
{
	LNode*p=head1->next;
	while(p!=NULL)
	{
		printf("%c",p->data);
		p=p->next;
	}
}
void deleteList(LinkList la)//元素的去重 
{
	LinkList pre=la->next;
	LinkList p,q,u;
	int m;
	while(pre!=NULL)
	{
		m=pre->data ;
		q=pre;
		p=pre->next;
		while(p!=NULL)
		{
			if(p->data==m)
			{
				u=p;
				p=p->next ;
				q->next =p;
				free(u);
			}
			else
			{q->next =p;
			q=p;
			p=p->next ;
			}
	   }
    q->next=p;
	pre=pre->next;
	}
	
}
void jiaoji(LNode *head1,LNode*head2,LNode*head3)//取交集 
{LNode*p1=head1->next;
LNode*p2=head2->next;
LNode*p3=head3;
while(p1!=NULL)
  {p2=head2->next;
     while(p2!=NULL)
     {  
     	if(p1->data==p2->data)
     	{LNode*s=(LNode*)malloc(sizeof(LNode));
     	 s->data=p1->data;
     	 s->next=p3->next;
     	 p3->next=s;
     	 p3=s;
        }
  	  p2=p2->next;
     }
	p1=p1->next;
  }
	
}
void bingji(LNode*head1,LNode*head2)
{LNode*p=head1;
  while(p->next!=NULL)//找到尾结点 
   {p=p->next;
   }
	p->next=head2->next;//此时head1为并集 
	deleteList(head1); //head1去重 
}
LinkList fuzhi(LNode *Lista)
{LinkList Listb;
if(Lista==NULL)
 return NULL;
 else
 {Listb=(LinkList)malloc(sizeof(LNode));
   Listb->data=Lista->data;
   Listb->next =fuzhi(Lista->next);
   return Listb;
 	
 }
	
}
void chaji(LNode*head1,LNode*head2)//去掉head1中head2的部分 
{ LNode*p1;
  p1=head1->next;
  LNode*p2;
  p2=head2->next;
  LNode*q,*pf=head1;
 while(p1!=NULL)
 {  p2=head2->next;
    while(p2!=NULL)
 	{if(p1->data==p2->data)
 	   {
  	       q=p1->next;
           pf->next=q;
 	       free(p1);
	       p1=q; 
		   //break;      
	   } 
	 
	   p2=p2->next;
	} 
	if(p1!=NULL)
	{pf=p1;
	p1=p1->next;
	}
	else
	p1=pf->next;
	
	
 }
	
} 
int main() { 
   int a;
   while(1) 
	{LNode*head1;
    LNode*head4;
    initlist(&head4);
    printf("请输入第一个集合(0为结束标志)");
    initlist(&head1);
    InsertList(&head1);
    deleteList(head1);
	 //printList(head1);
	 head4=fuzhi(head1);     //保留head1的集合给head4; 
	LNode*head2;
     printf("请输入第二个集合(0为结束标志)");
    initlist(&head2);
    InsertList(&head2);
    deleteList(head2);
	//printList(head2);
	LNode*head3;
	initlist(&head3); 
	jiaoji(head1,head2,head3);
	printf("交集为:");
	printList(head3);
	printf("\n");
	if(head3->next==NULL)
	printf("交集为空\n"); 
	bingji(head1,head2);
	printf("并集为") ;
	printList(head1);//head1为并集 
	//printf("\n"); 
    chaji(head4,head3);//head4为head1,head3为交集 
    printf("差集为");
    printList(head4);
   	printf("\n");
   	printf("是否继续\n");
   	printf("1.退出\n");
    printf("2.继续\n");
   	scanf("%d",&a); 
   	if(a==1)
   	break;
   	if(a==2)
   	continue;
   	
	}
	return 0;
}

  • 33
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值