(一)具体实验报告如下
(一) 问题描述 编制一个能用顺序表实现求集合的交、并和差集的程序。 (二) 基本要求 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;
}