数据结构课程设计-集合的并交补差

  • 格式:doc
  • 大小:56.00 KB
  • 文档页数:5

课程设计1 线性表课程设计
一、组长:
二、组员:
三、实验日期:2010/4/10
四、实验任务:
集合操作(2分)
基本功能要求:
(1)从文件中读入集合数据建立单链表。

(2)分别求出集合的交、并、差。

五、实验原理:。

(具体思路看注释)
(1)定义单链表结点类型;
(2)建立函数,将数组元素以尾插法的方法插入到单链表中;
(3)建立函数以指针移动的方式将单链表显示出来;
(4)建立求并集的函数,以指针移动的方式将L1和L2中的元素放入L3中;(5)建立求交集的函数,以指针移动的方式将L1和L2中相同的元素放到L4中;(6)建立求差集的函数,以指针移动的方式将L1有而L2中无的元素放到L5中;(7)建立主函数,实现以上功能;
六、实验源程序:
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode //定义单链表结点类型
{
char data;
struct LNode *next;
} LinkList;
LinkList *CreatList(LinkList *L,char a[],int n) /*尾插法插入元素*/
{
LinkList *p,*r;
int i;
L=(LinkList*)malloc(sizeof(LinkList));
L->next=NULL;
r=L;
for(i=0;i<n;i++)
{
p=(LinkList*)malloc(sizeof(LinkList));
p->data=a[i];
r->next=p;
r=p;
}
r->next=NULL;
return (L);
}
void DispList(LinkList *L) /*显示链表*/
{
int i=0;
LinkList *p;
p=L->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
LinkList *BingJi(LinkList *L1,LinkList *L2,LinkList *L3) /*求两个集合的并集*/
{
LinkList *p1=L1->next,*p2=L2->next,*s,*t;
L3=(LinkList *)malloc(sizeof(LinkList));
t=L3;
while (p1!=NULL && p2!=NULL) /*当L1和L2都不为空的情况下比较各自数值的大小*/
{
if (p1->data<p2->data) /*先记录较小的数值,并移动其指针*/
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=p1->data;
t->next=s;
t=s;
p1=p1->next;
}
else if (p1->data>p2->data)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=p2->data;
t->next=s;
t=s;
p2=p2->next;
}
else /*当两个数值相同时仅记录一个,并移动各自的指针*/
{
s->data=p1->data;
t->next=s;
t=s;
p1=p1->next;
p2=p2->next;
}
}
while(p1==NULL&&p2!=NULL) /*当有一个单链表已经比较完毕时,将另外一个单链表的剩余数值全部记录下来*/
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=p2->data;
t->next=s;
t=s;
p2=p2->next;
}
while (p2==NULL&&p1!=NULL)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=p1->data;
t->next=s;
t=s;
p1=p1->next;
}
t->next=NULL;
return(L3);
}
LinkList *JiaoJi(LinkList *L1,LinkList *L2,LinkList *L4) /*求两集合的交集*/
{
LinkList *p1=L1->next,*p2,*s,*t;
L4=(LinkList *)malloc(sizeof(LinkList));
t=L4;
while (p1!=NULL) /*在L1不为空时求交集,否则交集为空*/
{
p2=L2->next;
while (p2!=NULL && p2->data<p1->data) /*按顺序比较各自数值的大小,若不相等就移动较小数值的指针*/
{
p2=p2->next;
}
if (p2!=NULL && p2->data==p1->data)/*若相等就记录下来*/
{
s->data=p1->data;
t->next=s;
t=s;
}
p1=p1->next;
}
t->next=NULL;
return(L4);
}
LinkList *ChaJi(LinkList *L1,LinkList *L2,LinkList *L5) /*求两集合的差集*/
{
LinkList *p1=L1->next,*p2,*s,*t;
L5=(LinkList *)malloc(sizeof(LinkList));
t=L5;
while (p1!=NULL) /*仅在L1不为空的情况下求差集,否则差集为空*/
{
p2=L2->next;
while (p2!=NULL && p2->data<p1->data) /*若L2的数值小于L1的数值就移动指针*/ {
p2=p2->next;
}
if (!(p2!=NULL && p2->data==p1->data)) /*记录L1中有而L2中无的数值*/
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=p1->data;
t->next=s;t=s;
}
p1=p1->next;
}
t->next=NULL;
return(L5);
}
void main() /*主函数,实现上述功能*/
{
char a[]={'2','4','5','8'};
char b[]={'1','2','3','6','8','9'};
LinkList *L1,*L2,*L3,*L4,*L5;
L1=(LinkList *)malloc(sizeof(LinkList));
L2=(LinkList *)malloc(sizeof(LinkList));
L3=(LinkList *)malloc(sizeof(LinkList));
printf("集合L1为:");
L1=CreatList(L1,a,4);
DispList(L1);
printf("集合L2为:");
L2=CreatList(L2,b,6);
DispList(L2);
L3=BingJi(L1,L2,L3);
printf("两个集合的并集为:");
DispList(L3);
L4=(LinkList *)malloc(sizeof(LinkList));
L4=JiaoJi(L1,L2,L4);
printf("两个集合的交集为:");
DispList(L4);
L5=(LinkList *)malloc(sizeof(LinkList));
L5=ChaJi(L1,L2,L5);
printf("两个集合的差集为:");
DispList(L5);
}
七、实验结果截图:
八、实验任务分工:。