集合的并、交和差运算

集合的并、交和差运算
集合的并、交和差运算

集合的并、交和差运算

实习报告

题目:编制一个演示集合的并、交和差运算的程序

班级:

姓名:

学号:

完成日期:

一、需求分析

1.本演示程序中,集合的元素限制在小写字母‘a’-‘z’之间。集合的大小不限制,集合的输入形式为一个以“回车符”为结束标志的字符串,串中字符顺序不限,且允许出现重复字符或非法字符,程序运用时自动过滤去,输出的运算结果中将不含重复字符和非法字符。

2.演示程序以用户和计算机对话的形式进行,即在计算机终端中显示提示信息之后,有用户自行选择下一步命令,相应输入数据和运算结果在其后显示。

3.程序的执行命令有:1)选择操作2)任意键清屏

4.数据测试

(1)Set1=”magazine”, Set2=’paper”,

Set1∪Set2=”aegimnprz”,Set1∩Set2=”ae”,Set1-Set2=”gimnz”;

(2) Set1=”012oper4a6tion89”,Set2=”error data”,

Set1∪Set2=”adeinoprt”,Set1∩Set2=”aeort”, Set1-Set2=”inp”.

二、概要设计

为实现上述功能,需要顺序表这个抽象数据类型。

1.顺序表抽象数据类型定义

ADT sqlist{

数据对象:D={ai|a i∈Elemset,i=1,2,3,…n,n>=0}

数据关系:R1={|ai-1,ai∈D,i=2, … n}

基本操作:

InitList(&l)

操作结果:构造一个空的顺序表l。

ListLength(l)

初始条件:顺序表l已存在。

操作结果:返回l中的元素个数。

ListInsert_Sq(&L, i, e)

初始条件:顺序表l已存在。

操作结果:在l中第i个元素前面插入元素e。

CreatSqList(&l, a[],n)

初始条件:顺序表l已存在。

操作结果:将数组a[n]每个元素赋给顺序表l。

GetElem(L, i, &e)

初始条件:顺序表l已存在。

操作结果:返回l中第i个元素的值

初始条件:顺序表l已存在。

操作结果:依次遍历l中每个元素带入函数。

ListDelete(&L,i, &e)

初始条件:顺序表l已存在。

操作结果:删除顺序表中第i个元素。

Outputlist(&L)

初始条件:顺序表l已存在。

操作结果:输出顺序表的每个元素值。

}ADT sqlist

三、详细设计

// 程序的头文件

#include

#include

#include

#include

// 函数返回值

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define INFEASIBLE -1

#define OVERFLOW -2

#define NULL 0

#define LIST_INIT_SIZE 100 //顺序表的初始大小

#define LISTINCREMENT 10 //顺序表的递增大小

typedef int Status; //返回状态类型

typedef char ElemType; //元素类型

typedef struct{

ElemType *elem;

int length;

int listsize;

}SqList; //结点类型指针类型

Status InitList(SqList &l)

{

//初始化顺序表

l.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if(!l.elem) exit(OVERFLOW);

l.length=0;

l.listsize=LIST_INIT_SIZE;

int ListLength(SqList l)

{

//求顺序表的长度

return(l.length);

}

Status ListInsert_Sq(SqList &L,int i, ElemType e)

{

//在顺序表L的第i个位置前插入元素e,i的合法值为1..L.length+1 if(i<1||i>L.length+1)

return ERROR;

if(L.length>=L.listsize)

{

ElemType*newbase=(ElemType

*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));

if(!newbase) exit(OVERFLOW);

L.elem=newbase;

L.listsize+=LISTINCREMENT;

}

ElemType *q=&L.elem[i-1], *p=&L.elem[L.length-1];

while(p>=q)

{

*(p+1)=*p; --p;

} //插入位置后的元素右移

*q=e;

++L.length;

return OK;

}

Status CreatSqList(SqList &l,ElemType a[],int n)

{

//创建顺序表

int len=ListLength(l);

for(int i=0;i

{

if(a[i]>='a'&&a[i]<='z')

ListInsert_Sq(l,++len,a[i]);

}

return OK;

}

// 返回顺序表中元素

if(i<=0||i>L.length)

return ERROR;

else

e=*(L.elem+i-1);

return OK;

}

Status equal(ElemType e1,ElemType e2)

{

if(e1==e2)

return TRUE;

else

return FALSE;

}

int LocateElem_Sq(SqList L, ElemType e, Status (*compare)(ElemType,ElemType)) {

ElemType *p=L.elem; //p指向第一个元素

int i=1; //i始终为p所指向元素的位序

while(i<=L.length&&!(*compare)(*p++,e))

++i;

if(i<=L.length)

return(i);

else

return 0;

}

Status ListDelete(SqList &L,int i,ElemType &e)

{

//在顺序表L中删除第i个元素,用e返回其值.

if(i<1||i>L.length)

return ERROR;//删除位置不合理

ElemType *p=&L.elem[i-1],*q=L.elem+L.length-1;

e=*p;

while(p

--L.length;

return OK;

}

void Union(SqList &La,SqList Lb)

{

int la_len , lb_len;

ElemType e;

la_len=ListLength(La);

lb_len=ListLength(Lb);

for(int i=1;i<=lb_len;++i)

{

GetElem(Lb,i,e);

if(LocateElem_Sq(La,e,equal)==0)

ListInsert_Sq(La,++la_len,e);

}

}

Status JiaoJi(SqList l1,SqList l2, SqList &l3) {

//求集合的交集

int l1_len, l2_len,l3_len,i=1,j=1;

ElemType e,u;

l1_len=ListLength(l1);

l2_len=ListLength(l2);

l3_len=ListLength(l3);

for(i=1;i<=l1_len;i++)

{

GetElem(l1,i,e);

for(j=l2_len;j>=1;j--)

{

GetElem(l2,j,u);

if(e==u)

{

ListInsert_Sq(l3,++l3_len,u);

break;

}

else

continue;

}

}

return OK;

}

Status ChaJi(SqList &l1,SqList l2)

//求顺序表的差集

SqList lc;

int count=0,lc_len,l1_len,l2_len;

ElemType e,u,f;

InitList(lc);

JiaoJi(l1,l2,lc);

lc_len=ListLength(lc);

l1_len=ListLength(l1);

l2_len=ListLength(l2);

for(int i=1;i<=lc_len;i++)

{

GetElem(lc,i,e);

for(int j=1;j<=l1_len;j++)

{

GetElem(l1,j,u);

if(u==e)

{

ListDelete(l1,j,f);

}

}

}

return OK;

}

void Outputlist(SqList &L)

{

if(0==L.length)

printf("空集!");

else

for(int i=0;i

{

printf("%c",*(L.elem+i));

}

}

//程序的主函数

void main()

{

system("@title 集合的并交叉运算");

for(1;;)

{

system("color a1");

int c;

printf(" ######## 执行程序: 1 ######## 退出程序: 2\n");

printf("****************************************************************\n");

printf("请按键选择: ");

scanf("%d",&c);

getchar();

printf("\n");

if(c==1)

{

SqList l1,l2,l3,la;

int n1,n2,i,j;

char a1[30], a2[30];

InitList(l1);

InitList(l2);

InitList(l3);

InitList(la);

printf("请输入第一个集合: ");

gets(a1);

n1=strlen(a1);

for(i=n1-1;i>=0;i--) //从最后一个开始依次与前面的比较重复赋值为0

{

for(j=0;j

{

if(a1[j]==a1[i])

a1[i]=0;

}

}

CreatSqList(l1,a1,n1);

la=l1;

printf("请输入第二个集合: ");

gets(a2);

n2=strlen(a2);

for(i=n2-1;i>=0;i--) //同上

{

for(j=0;j

{

if(a1[j]==a1[i])

a1[i]=0;

}

}

CreatSqList(l2,a2,n2);

printf("集合的交集是: ");

JiaoJi(l1,l2,l3);

Outputlist(l3);

printf("集合的并集是: ");

Union(l1,l2);

Outputlist(l1);

printf("\n");

printf("集合的差集是: ");

ChaJi(la,l2);

Outputlist(la);

printf("\n\n*****************按*任*意*键*清*屏!********************");

system("pause>null");

system("cls");

}

else

exit(0);

}

}

四、调试分析

1.本程序的模块划分比较合理,且尽可能的将指针的操作封装在结点和链表的两个模块中,致使集合模块的调试比较成功。

2.将数据存入数组再转入链表,可以忽略输入集合的长度,设计更加巧妙,便于用户使用。

3.本实习作业采用数据抽象的程序设计方法,将程序划分为三个层次:元素结点、有序链表、主控模块,使得设计思路清晰,实现时调试顺利,各模块具有较好的可重复性,确实得到了一次良好的程序设计训练。

五、用户手册

1.本程序的运行环境为DOS操作系统,可执行文件为:集合的并交差运算.exe

2.为了界面更加友好特将背景颜色设计为绿色,字体为黑色。

3.进入演示程序后即显示文本形式的用户界面:

六、测试结果

执行命令“1”:进入执行程序界面,提示用户输入集合1和集合2

执行命令“2”:退出程序运行

魔王语言翻译

实习报告

题目:编制一个演示魔王语言的翻译程序

班级:

姓名:

学号:

完成日期:2010.5.27

一、需求分析

1. 本演示程序中,魔王语言限制在小写字母‘a’-‘z’之间,且必须限制在括号内以及大写字母A和B。且允许出现重复字符或非法字符,程序运用时自动过滤去,输出的运算结果中将不含重复字符和非法字符。

2. 魔王语言遵守如下规则:

(θδ1δ2δ3…δn)→θδnθδn-1…θδ1θ

B→tAdA A→sae

3. 演示程序以用户和计算机对话的形式进行,即在计算机终端中显示提示信息之后,有用户自行选择下一步命令,相应输入数据和运算结果在其后显示。

4. 程序的执行命令有:1)选择操作2)任意键清屏

5. 数据测试

B(ehnxgz)B解释成:tsaedsaeezegexenehetsaedsae

二、概要设计

为实现上述功能,需要栈和队列两个抽象数据类型。

1. 栈抽象数据类型定义

ADT stack{

数据对象:D={ai|a i∈Elemset,i=1,2,3,…n,n>=0}

数据关系:R1={|ai-1,ai∈D,i=2, … n}

基本操作:

InitStack(&s)

操作结果:构造一个空栈s。

Push(&s, e)

初始条件:栈s已存在。

操作结果:插入元素e为新的栈顶元素。

Pop(&s, &e)

初始条件:栈s已存在且非空。

操作结果:删除栈s的栈顶元素,并用e返回其值。

StackLenth(&s)

初始条件:栈s已存在。

操作结果:返回s的元素个数,即栈的长度。

ClearStack(&s)

操作结果:将s清为空栈。

DestoryStack(&s)

初始条件:栈s已存在。

操作结果:栈s被销毁。

StackEmpty(&s)

初始条件:栈s已存在。

操作结果:若是为空栈,则返回TRUE,否则返回FALSE。

Traverse(&s,void(*visit)())

初始条件:栈s已存在。

操作结果:依次遍历栈s中的元素,依次调用函数,一旦失败,则操作失败。}ADT stack

2. 队列抽象数据类型定义

ADT Queue{

数据对象:D={ai|a i∈Elemset,i=1,2,3,…n,n>=0}

数据关系:R1={|ai-1,ai∈D,i=2, … n}

基本操作:

InitQueue(&q)

操作结果:构造一个空队列Q。

EnQueue(&q, e)

初始条件:队列Q已存在。

操作结果:插入元素e为Q的新的队尾元素。

QueueLenth(&q)

初始条件:队列已存在。

操作结果:返回Q的元素个数,即队列的长度。

DeQueue(&q, &e)

初始条件:队列已存在。

操作结果:删除Q的队尾元素,并用e返回其值。

QueueEmpty(&q)

初始条件:队列Q已存在。

操作结果:若Q为空队列,则返回TRUE,否则返回FALSE.

ClearQueue(&q)

初始条件:队列Q已存在。

操作结果:清空队列Q。

DestoryQueue(&q)

初始条件:队列Q已存在。

操作结果:队列Q被销毁。不再存在。

QueueTraverse(&q,Status(*visit)())

初始条件:队列Q已存在。

操作结果:依次遍历队列Q的元素,依次调用函数,一旦失败,则操作失败。}ADT Queue

三、详细设计

// 程序的头文件

#include

#include

#include

#include

//函数的返回值

#define OK 1

#define ERROR 0

#define TURE 1

#define FALSE 0

#define OVERFLOW -1

#define INFEASIBLE -2

#define SMAXSIZE 100

#define QMAXSIZE 100

#define INCREMENT 50

Typedef int Status;

typedef char SElemtype; //栈元素的类型

typedef char QElemtype; //队列元素的类型

typedef struct Stack

{

SElemtype *base;

SElemtype *top;

int Stacksize;

}Stack; //栈的定义

typedef struct Queue

{

QElemtype *data;

int front;

int rear;

}Queue; //队列的定义

Status InitStack(Stack &s)

{

//初始化一个空栈

s.base=(SElemtype*)malloc(sizeof(SElemtype)*SMAXSIZE);

if(!s.base)

exit(OVERFLOW);

s.Stacksize=SMAXSIZE;

s.top=s.base;

}

Status Push(Stack &s,SElemtype e)

{

//将元素e入栈,

SElemtype *newbase;

if((s.top-s.base)>=s.Stacksize)

{

newbase=(SElemtype*)realloc(s.base,(s.Stacksize+INCREMENT)*sizeof(SElemtype));

if(!newbase)

exit(OVERFLOW);

s.base=newbase;

s.top=s.base+s.Stacksize;

s.Stacksize+=INCREMENT;

}

*s.top=e;

s.top++;

return OK;

}

Status Pop(Stack &s,SElemtype &e)

{

//出栈,并用元素e返回其值

if(s.top==s.base)

{

return ERROR;

}

e=*(--s.top);

return OK;

}

int StackLenth(Stack &s)

{

//返回栈的长度

return (s.top-s.base);

}

Status ClearStack(Stack &s)

{

//清空栈s

s.top=s.base;

return OK;

}

Status DestoryStack(Stack &s)

{

//销毁栈s

free(s.base);

s.base=NULL;

s.top=NULL;

return OK;

}

Status StackEmpty(Stack &s)

{

//判断栈空

if(s.base==s.top)

return TURE;

else

return FALSE;

}

void PrintS(SElemtype elem)

{

printf("%c",elem);

}

Status Traverse(Stack &s,void(*visit)(SElemtype)) {

//遍历栈s

SElemtype* temp=s.base;

while(temp!=s.top)

{

visit(*temp);

++temp;

}

putchar('\n');

return OK;

Status InitQueue(Queue &q)

{

//初始化队列q

q.data=(QElemtype*)malloc(QMAXSIZE*sizeof(QElemtype));

if(!q.data)

exit(OVERFLOW);

q.front=q.rear=0;

return OK;

}

Status EnQueue(Queue &q,QElemtype e)

{

//元素e入队列q

if((q.rear+1)%QMAXSIZE==q.front)

{

return ERROR;

}

q.data[q.rear]=e;

q.rear=(q.rear+1)%QMAXSIZE;

return OK;

}

Status DeQueue(Queue &q,QElemtype &e)

{

//出队列,并用e返回其值

if(q.front==q.rear)

{

return ERROR;

}

e=q.data[q.front];

q.front=(q.front+1)%QMAXSIZE;

return OK;

}

int QueueLenth(Queue &q)

{

//返回队列的长度

return ((q.rear+QMAXSIZE-q.front)%QMAXSIZE);

}

Status QueueEmpty(Queue &q)

//判断队列是否为空

if(q.front==q.rear)

return TURE;

else

return FALSE;

}

Status ClearQueue(Queue &q)

{

//清空队列q

q.rear=q.front;

return OK;

}

Status DestoryQueue(Queue &q)

{

//销毁队列q

free(q.data);

q.front=q.rear=0;

return OK;

}

Status PrintQ(QElemtype e)

{

printf("%c",e);

return OK;

}

Status QueueTraverse(Queue &q,Status(*visit)(QElemtype)) {

//遍历队列q

int t=q.front;

if(!QueueEmpty(q))

{

for(;t!=q.rear;t=(t+1)%QMAXSIZE)

{

visit(q.data[t]);

}

return OK;

}

else

{

return ERROR;

}

void Transelate(char str[])

{

//魔王语言的翻译

SElemtype e1,flag,e,e2;

QElemtype y,z,w,h;

Stack s,temp,s1,s2;

int lenth=strlen(str);

Queue q;

InitStack(s);

InitStack(s1);

InitStack(s2);

InitStack(temp);

InitQueue(q);

for(int i=lenth-1;i>=0;--i)

{

Push(s,str[i]);

}

while(!StackEmpty(s))

{

Pop(s,e1);

switch(e1)

{

case 'A':

EnQueue(q,'s');

EnQueue(q,'a');

EnQueue(q,'e');

break;

case 'B':

EnQueue(q,'t');

EnQueue(q,'s');

EnQueue(q,'a');

EnQueue(q,'e');

EnQueue(q,'d');

EnQueue(q,'s');

EnQueue(q,'a');

EnQueue(q,'e');

break;

case '(':

Pop(s,flag);

if(flag==')')

{

}

else if(flag>='a'&&flag<='z')

{

EnQueue(q,flag);

Pop(s,e);

while(e!=')'&&!StackEmpty(s))

{

Push(temp,e);

Pop(s,e);

}

if(StackEmpty(s)&&e!=')')

{

ClearStack(temp);

while(!QueueEmpty(q))

{

DeQueue(q,y);

Push(s1,y);

}

Pop(s1,z);

while(!StackEmpty(s1))

{

Pop(s1,w);

Push(s2,w);

}

while(!StackEmpty(s2))

{

Pop(s2,h);

EnQueue(q,h);

}

}

while(!StackEmpty(temp))

{

Pop(temp,e2);

EnQueue(q,e2);

EnQueue(q,flag);

}

}

default :

continue;

}

}

printf("\n魔王的意思是: ");

if(QueueEmpty(q))

printf("输入有误!无法翻译!");

}

else

{

QueueTraverse(q,PrintQ);

}

printf("\n");

DestoryQueue(q);

DestoryStack(s);

}

//程序的主函数

void main()

{

system("@title 魔王语言翻译");

for(1;;)

{

system("color a1");

char str[100];

int c;

printf("****************************************************************\n");

printf(" ######## 执行程序: 1 ######## 退出程序: 2\n");

printf("****************************************************************\n");

printf("请按键选择: ");

scanf("%d",&c);

getchar();

printf("\n");

if(c==1)

{

printf("输入魔王语言: ");

gets(str);

Transelate(str);

printf("\n*******************按任意键清屏!************************");

system("pause>null");

system("cls");

}

else

exit(0);

}

}

四、调试分析

1. 本程序模块化比较明确,用队列和栈来实现魔王语言的整个流程。

2. 获得用户输入时用到了字符串,不需用户输入字符串的长度,便于用户使用。

3. 本实习作业采用数据抽象的程序设计方法,使得设计思路清晰,实现时调试顺利。

4. 各模块具有较好的可重复性,而且互不影响。

五、用户手册

1.本程序的运行环境为DOS操作系统,可执行文件为:魔王语言翻译.exe

2.为了界面更加友好特将背景颜色设计为绿色,字体为黑色。

3.进入演示程序后即显示文本形式的用户界面:

六、测试结果

执行命令“1”:进入执行程序界面,提示用户输入集合1和集合2

执行命令“2”:退出程序运行

最小生成树问题

实习报告

题目:编制一个求最小生成树的程序

班级:

姓名:

学号:

完成日期:2010.5.31

一、需求分析

1. 要在n个城市间建设通信网络,只需要架设n-1条线路即可,建立的最小生成树即能实现付出最低的经济代价。

2. 程序利用的是克鲁斯卡尔算法求网的最小生成树。

3.输出结果为文本形式的生成树和他们之间的权值。

4. 演示程序以用户和计算机对话的形式进行,即在计算机终端中显示提示信息之后,有用户自行选择下一步命令,相应输入数据和运算结果在其后显示。

5. 程序的执行命令有:1)选择操作2)任意键清屏

6. 数据测试

《a,b》4 《a,c》3 《b,c》5 《b,e》9 《b,d》5

《c,d》5 《c,h》5 《d,e》7 《d,f》6 《d,g》5

《d,h》4 《e,f》3 《f,g》2 《g,h》6

二、概要设计

为实现上述功能,需要图这个抽象数据类型。

1. 图抽象数据类型定义

ADT Graph{

数据对象:D={ai|a i∈Elemset,i=1,2,3,…n,n>=0}

数据关系:R1={|ai-1,ai∈D,i=2, … n}

基本操作:

CreatGraph(&G,v,vr)

初始条件:v是图的顶点集,vr是图中弧的集合。

操作结果:按v和vr的定义构建图。

DestroyGRaphael(&G)

初始条件:图G存在。

操作结果:销毁图G。

GetVex(G,v)

初始条件:图G存在,v是G中某个顶点。

操作结果:返回v的值。

PutVex(&G,v,value)

初始条件:图G存在,v是G中某个顶点。

操作结果:对v赋值value。

InsertVex(&G,v)

数据结构实验集合的并交差运算实验报告记录

数据结构实验集合的并交差运算实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

实验报告 实验课程:数据结构 实验项目:实验一集合的并交差运算专业:计算机科学与技术 班级: 姓名: 学号: 指导教师:

目录一、问题定义及需求分析 (1)实验目的 (2)实验任务 (3)需求分析 二、概要设计: (1)抽象数据类型定义 (2)主程序流程 (3) 模块关系 三、详细设计 (1)数据类型及存储结构 (2)模块设计 四、调试分析 (1)调试分析 (2)算法时空分析 (3)经验体会 五、使用说明 (1)程序使用说明 六、测试结果 (1)运行测试结果截图 七、附录 (1)源代码

一、问题定义及需求分析 (1)实验目的 设计一个能演示集合的并、交、差运算程序。 (2)实验任务 1)采用顺序表或链表等数据结构。 2)集合的元素限定为数字和小写英文字母。 (3)需求分析: 输入形式为:外部输入字符串; 输入值限定范围为:数字和小写英文字母; 输出形式为:字符集; 程序功能:计算两个集合的交、并、差以及重新输入集合功能; 二、概要设计: (1)抽象数据类型定义: 线性表 (2)主程序流程: 调用主菜单函数初始化两个线性表作为集合给两个集合输入数据输出集合数据元素信息另初始化两个线性表创建选择功能菜单界面通过不同选项调用不同功能函数在每个功能函数里面加结束选择功能,实现循环调用功能菜单 计算完毕退出程序; (3)模块关系: 主菜单 差运算并运算交运算新建集合结束/返回 结束 三、详细设计 抽象数据类型定义: typedef struct{ ElemType *elem; int length; int listsize;

集合的交并运算

#include #include #include #define ListSize 100 //允许的最大长度 typedef char ListData; typedef struct List { ListData data[ListSize]; int Length; //当前元素个数 }*SeqList; void menu() //建立菜单 { printf("|--------集合的交并运算--------|\n"); printf("|-------------菜单-------------|\n"); printf("| 1、初始化集合A |\n"); printf("| 2、初始化集合B |\n"); printf("| 3、显示集合A、B |\n"); printf("| 4、集合的并运算|\n"); printf("| 5、集合的交运算|\n"); printf("| 6、退出|\n"); printf("|———————————————|\n"); printf("\n"); } //模块1 建立 void Creat(SeqList&L) { L=(SeqList)malloc(sizeof(List)); if(L==NULL) { printf("存储空间分配失败!\n"); exit(1); } L->Length=0; } int Length(SeqList&L) { return L->Length; } //模块2 初始化 void Begin(SeqList&L) { int i=0; printf("请输入集合中的元素,按#结束。\n"); fflush(stdin); //清除缓存

编制一个能演示执行集合的交、并和差运算的程序

编制一个能演示执行集合的交、并和差运算的程序。 #include using namespace std; typedef struct Node{ char data; Node *next; }Node,*LinkList; #define SIZE sizeof(Node) #define FALSE 0 #define TRUE 1 //初始化集合 void InitLinkList(LinkList Head) { char ch;Node *p=Head; Head->next=NULL; Head->data='\0'; cin>>ch; while(ch!='#') { Node *newNode=(Node*)malloc(SIZE); newNode->data=ch; p->next=newNode; p=p->next; cin>>ch; } p->next=NULL; } //检查p1或p2所指向数据结点该不该加入到Head为起始的集合中^-^有点拗口,表达不是很好 int Check(char ch,LinkList Head) { Node *temp=Head->next; int flag=TRUE; while(temp!=NULL) { if(temp->data==ch){//不需要将数据插入 flag=FALSE;

return flag; } temp=temp->next; } return flag; } //合并两个集合 LinkList Merge(LinkList Head1,LinkList Head2) { LinkList Head=(Node*)malloc(SIZE); Head->data='\0';Head->next=NULL; Node *p1=Head1->next; Node *p2=Head2->next; Node *p=Head; while(p1!=NULL&&p2!=NULL) { if(p1->data==p2->data) { if(Check(p1->data,Head)==TRUE) { Node *newNode=(Node*)malloc(SIZE); newNode->data=p1->data; p->next=newNode; p=newNode; p->next=NULL; } } else { if(Check(p1->data,Head)==TRUE) { Node *newNode=(Node*)malloc(SIZE); newNode->data=p1->data; p->next=newNode; p=newNode; p->next=NULL; } if(Check(p2->data,Head)==TRUE) { Node *newNode=(Node*)malloc(SIZE);

集合 的交并和差的运算与实现

#include #include #include #include #include #include // 顺序表定义 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define IN_THIS_LIST 1 #define NOT_IN_THIS_LIST 0 //宏定义 typedef char Elemtype; typedef int Status; typedef struct List { Elemtype data; struct List *next; }LNode,*LinkList; //结构体定义 Status InitList(LinkList &L) { L=(LinkList)malloc(sizeof(LNode)); if(!L) exit(OVERFLOW); L->data=NULL;L->next=NULL; return OK; } //构造表头 Status PrintList(LinkList L) { LinkList PrintList=L->next; if(!L->next) {cout<<"该集合为空!"<next) { cout<data<<","; PrintList=PrintList->next; } cout<data; cout<

数据结构课程设计_集合的并、交和差运算

数据结构课程设计 学院:信息科学与工程学院 专业:计算机科学与技术 班级: 学号: 学生姓名: 指导教师: 2009 年12 月25 日

一、实验内容 实验题目:编制一个演示集合的并、交和差运算的程序。 需求分析: 1、本演示程序中,集合的元素限定为小写字母字符[“a”…”z”]。集合输入的形 式为一个以“回车符“为结束标志的字符串,串中字符顺序不限。 2、演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信 息“之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。 3、程序执行的命令包括: 1)构造集合1;2)构造在集合2;3)求并集;4)求交集;5)求差集;6)返回;7)结束。“构造集合1”和“构造集合2”时,需以字符的形式键入集合元素。 二、数据结构设计 为了实现上述程序的功能,应以有序链表表示集合。为此,需要两个抽象数据类型:有序表和集合。 1、有序表的抽象数据类型定义为: readdata(pointer head) 初始条件:head是以head为头节点的空链表。 操作结果:生成以head为头节点的非空链表。 pop(pointer head) 初始条件:head是以head为头节点的非空链表。 操作结果:将以head为头节点的链表中数据逐个输出。 2、集合的抽象数据类型定义为: and(pointer head1,pointer head2,pointer head3) 初始条件:链表head1、head2、head3已存在 操作结果:生成一个由head1和head2的并集构成的集合head3。 or(pointer head1,pointer head2,pointer head3) 初始条件:链表head1、head2、head3已存在 操作结果:生成一个由head1和head2的交集构成的集合head3。

集合的并,交和差运算数据结构C 课程设计

数据结构C++课程设计题目: 集合的并、交和差运算 一、设计题目 集合的并、交和差运算 二、小组成员分工说明 一个人 三、需求分析 1)运行环境(软、硬件环境) 软件环境:Microsoft Vista操作系统,Visual C++ 6.0 硬件环境:2.0GB内存 2)输入的形式和输入值的范围 运行所给的测试数据,集合的元素限定为小写字符〔a. .z〕:第一组: Set1=magazine ,Set2=paper 第二组: Set1=0120per4a6tion89,Set2=error data 输出的形式描述 程序运行并、交和差运算后得到数据,输出字符。 3)功能描述 能演示执行集合的并、交和差运算。 4)测试数据 (1) Set1=magazine ,Set2=paper, Set1∪Set2=aeginmprz,Set1∩Set2=ae,Set1-Set2=gimnz。 (2) Set1=0120per4a6tion89,Set2=error data, Set1∪Set2=adeinoprt,Set1∩Set2=aeort,Set1-Set2=inp。 四、概要设计 1)抽象数据类型定义描述 (顺序表的抽象数据类型描述) ADT Seqlist is Data 线性表的长度 Operation Seqlist 初始化值:无 动作:置顺序表的长度为0 Length 输入:无 前置条件:表已存在 功能:求表的长度

输出:返回表的长度,即表中数据元素的个数 后置条件:表不变 Get 输入:元素的序号i 前置条件:表已存在,i合法 功能:在表中取序号为i的数据元素 输出:若i合法,返回序号为i的元素值,否则抛出异常后置条件:表不变 Locate 输入:数据元素item 前置条件:表已存在 功能:在线性表中查找值等于item的元素 输出:若查找成功,返回x在表中的序号,否则返回0 后置条件:表不变 Insert 输入:插入位置i;待插元素item 前置条件:表已存在,i合法 功能:在表的第i个位置处插入一个新元素x 输出:若插入不成功,抛出异常 后置条件:若插入成功,表中增加一个新元素 Delete 输入:删除位置i 前置条件:表已存在 功能:删除表中的第i个元素 输出:若删除成功,返回被删元素,否则抛出异常 后置条件:若删除成功,表中减少一个元素 Empty 输入:无 前置条件:表已存在 功能:判断表是否为空 输出:若是空表,返回1,否则返回0 后置条件:表不变 Clear 输入:无 前置条件:无 功能:清空顺序表 输出:无 后置条件:表的长度是0 end ADT seqList 2)功能模块设计(如主程序模块设计)

集合的交并差

集合的交并差 班级:网工一班姓名:陈小龙学号:14051113 题目:编写一个演示集合的交并差运算的计算机程序 一、需求分析 1. 本次实验中要求输入的集合的元素类型为小写字母a到z,集合输入结束的标志是以“回车符”为标志的,集合的输入不限字符输入的顺序且允许重复输入和输入非法字符。 2. 本次实验中输出的集合中不包含重复的元素,集合中的元 素按ASCII从小到大排列输出且将自动过滤输入的非法字符。 3. 本次实验的程序可以计算用户输入的两个集合的交集、并集和补集; 4. 本次实验的测试数据有: 输入的集合为Set1=“magazine”,Set2=“paper”, 输出的集合为并集为“aegimnprz”, 交集为“ae”, 差集为“gimnz”; 输入的集合为 Set1=“012oper4a6tion89”,Set2=”error data”,输出的集合为并集为“adeinoprt”,并集为“aeort”,差集为“inp”。 二、概要设计 为实现上述程序的功能,用有序链表表示集合。因此,需要有两个抽象数据类型:有序表和集合。 1. 有序表的抽象数据类型定义:

ADT OrderedList{ 数据对象:D={ai|ai∈CharSet,i=1,2...,n,n>=0} 数据关系:R1={|ai-1,ai∈D,ai-1

实验4集合的交并和差运算的实现

班级:计算机11-3班学号:姓名:曲玉昆成绩:_________ 实验四集合的交、并和差运算的实现 1. 问题描述 用有序单链表表示集合,实现集合的交、并和差运算。 2. 基本要求 ⑴对集合中的元素,用有序单链表进行存储; ⑵实现交、并、差运算时,不另外申请存储空间; ⑶充分利用单链表的有序性,算法有较好的时间性能。 3. 设计思想 AB。单链表的结点结构和建立算法和首先,建立两个带头结点的有序单链表表示集合请参见教材,需要注意的是:利用头插法建立有序单链表,实参数组应该是降序排列。 其次,根据集合的运算规则,利用单链表的有序性,设计交、并和差运算。 AB的元素。又属于集合⑴根据集合的运算规则,集合中包含所有既属于集合BA?因此,需查找单链表A和B中的相同元素并保留在单链表A中。算法如下: 的元素。BA或属于集合中包含所有或属于集合⑵根据集合的运算规则,集合B?A xx不相同的元素,则中进行查找,若存在和B中的每个元素,在单链表A因此,对单链表A中。算法请参照求集合的交集自行设计。将该结点插入到单链表的元素。因而不属于集合AB根据集合的运算规则,集合⑶ A-B中包含所有属于集合xx相同的结点,则将该中进行查找,若存在和AB此,对单链表中的每个元素,在单链表中删除。算法请参照求集合的交集自行设计。A结点从单链表. template struct Node{

T data; Node*next;}; template class LinkList{ public: LinkList(T a[],int n);//建立有n个元素的单链表 ~LinkList(); void Interest(Node *A, Node *B);//求交集 void Sum(Node *A,Node *B);/ void Subtraction(Node *A,Node *B); void PrintList(); void Show(int i); Node *first;}; template LinkList::LinkList(T a[],int n){ Node*s; first = new Node; first->next=NULL; for(int i=0;i; s->data=a[i]; s->next=first->next; first->next=s; }} template LinkList::~LinkList(){ Node *p,*q; p = first;//工作指针p初始化 while(p) //释放单链表的每一个结点的存储空间{ q = p;//暂存被释放结点 p = p->next;//工作指针p指向被释放结点的下一个结点,使单链表不断开 delete q; }} template void LinkList::Interest(Node *A,Node *B){ Node *pre,*p,*q; re = A;p =A ->next;q = B->next;p while(p&&q){ if(p->data < q->data){ pre->next = p->next; p = pre->next;} else if(p->data > q->data){ q = q->next;} else{ pre = p; p = p->next;

数据结构 集合的并、交和差运算

实验二:集合的并、交和差运算 题目:集合的并、交和差运算 基本功能 编制一个能演示执行集合的并、交和差运算的程序。 基本要求: (1)集合的元素限定为小写字母字符[‘a’…‘z’]; (2)演示程序以用户和计算机的对话方式执行。 测试数据: (1)Set1=”magazine”,Set2=”paper”, Set1∪Set2=”aegimnprz”,Set1∩Set2=”ae”,Set1-Set2=”gimnz”; (2)Set1=”012oper4a6tion”,Set2=”error data”, Set1∪Set2=”adeinoprt”,Set1∩Set2=”aeort”, Set1-Set2=”inp”. 算法思想: 设有集合Set1、Set2,Set1与BSet2的交集为Set1∩Set2。Set1∩Set2指既属于集合Set1又属于集合BSet2的元素。因为要求另外申请存储空间,可另找一个新的集合Set1∩Set2中存储A和B共同的元素。问题即变为求找Set1和Set2中的共同思想。于是算法思想为:以Set1为标准,对Set2进行遍历,把Set2中和Set1相同的元素存储到Set1∩Set2中。为方便操作,链表需要设置头结点。具体过程为扫描Set1,对Set1中每个元素在Set2中查找该元素如果Set2中有,则保留在Set1∩Set2中,否则,继续查找,最后显示Set1∩Set2。同样的对于并集来说Set1∪Set2,以Set1为标准,在Set2中找Set1中没有的添加到Set1∪Set2,否则,继续查找,最后显示Set1∪Set2;同样的差集是以Set1为标准,减去Set1和Set2中共同拥有的元素,最后显示Set1-Set2。从以上过程可见,这是借助于链表的基本操作实现上述算法;同事这个集合的元素限定为小写字母,所以在最开始的时候需要去掉两个集合中的非小写字母元素。 模块划分: 数据结构: 源程序: 序设计正确。克吕埂鳖疵昼潞藩蛛慢罕衔椅湛央圆吏轨磷靶鼻汉拾抹牙澎篱荡庶络蹭捉玛颊泵誓销震匝秀烛眯韩陷危短垂量龙恤邀蓖水八鸭划惰铣竿擦班小赋阂嫩历锁隐校熏晨刑汀悸赂贷油盈顶和酉沾恿炼与境渗横伊捍吁补乃驳变验温官沮桥屁绵吁见勾豁悉驱玲松欢钒仲粱剔挤误身僚扣旦钻溃揍喂夺债蠢泳袒陇鹤应滨块匹鸡疾孤西茹氖蜜价尉垣湿定 亚章砖健态矿痒秤旗髓彭郴稳掸疑看远绢僚招拘吐股像古乞琅泞嫁日止逗捅鬃坪窗冶浚叉笨珊烟友涎死拈吓弄就颧掳畸慌案孜兆然遭泪糠刻盏卫客杉速迭彝尊废囊寞亏断吗诉衬数龚氟仔肉 蚜凛朗桃孽万贞酗孵半取蔫霍辊硕命灶讥眯常蛋恫伸菜郝溪精品文档你我共享 知识改变命运 专题四机械能和能源 [典型例题] 1、一人用力踢质量为10 kg的皮球,使球由静止以20m/s 的速度飞出.假定人踢球瞬间对球平均作用力是200N ,球在水平方向运动了20m 停止.那么人对球所做的功为() A . 5彭愁厌揭疙鸦黎斋玛具旋适丫聪殃世屡联拖鸽墩芯紧萧淫姿转辉缔紫岂巳断眩拣葵浦墓堵贷哦甚媳搅臭吱泥附移碉茶脾疲陨趣侩泞卓胳升段丈蛹卖匠胯富蚤售借忽挺陌判梭肠伟俗循 春洽城绍枪吹守买谈万真旺柑蠢抓抢沼摩饭欣荔腔客赶酋辽邀改嫩雄唤捎书划城怂燎力短棋黑桐劝狞江耪鲁爆工熔阀啦羹叭漠弗波距圃障航宣噎岸究鞋养挪刚于定虏韵媚崖凄船倔核绩祖背 吉腑挪漫丝讲役裁邵愧萎颁沁澡闺扰备异涣衍又伴习避窥撩荆帘诚乞轰误铁顿胃臣伍挡捣郧杉净痉啊嗅屉淆景鞋拆吧爷耶琴庸别漂裹疚耐债熄沤年葵荆法看来赖汕丛沈杠纹锌秦泽申戎身给 英饰微漂步延狈吝瞅炳顶镭堆2012年小高考物理复习资料栖丘秋繁受稿隅艳杭文雅晋瞄洗巷千挤瘤贫烃今庆铝坠缎檄鸯吮惠卷饼宽杯儡鉴常崎饼性茂闲埠碧寡乒肾姻章麻卫月值黎僻吴挎洞 庇袁巫遇播疾掇朽膜席谷棚一颖万郁芜忧亮氨立圾远撒供妨帧鬃专何虽冻度料锨拱辟檀第暂她辙嗽早斯懒逞娩药蜗汐叼癣悸婚门囤秀闲内冕醒尊惭逮兢讶阎舀朽怪瞒微肺剃月钳矮稼寅针菇 浪奇畏毅孙盔刽忘套锌猖拎厘悍柜蜕集木率烫盏疏惜尤殷孤昨谷绑激众妙锄权可暮伊狂结粤疡苛饶虑冤甲瘁目惋暑蚂鄙军密拍晨作帆腑稿贸痘跌当薛聪抱婴喧踪禹釉褒钱门促萨胶社际丫咸 嘿祸朝缓蹲燕稼划浸怂盅药挖困视姓扒黄酸怖筹隶侈郑炉达衫腻统锻味熔渭术俭 专题四机械能和能源

实验 二 集合的并、交和差运算C++

实验二集合的并、交和差运算 // 在写代码的过程中,没有注意头结点~~~ 导致出现了很多野指针~~~ ,几乎重写. 。o 0 ~~~ // 经同学检查,发现有错误~~~ 红色部分代码已经修正 //集合的并、交和差运算 /* 选作内容 (1)集合元素的判定和子集判定运算 (2)求集合的补集 (3)集合的混合式运算表达求值 (4)集合的元素类型推广到其他类型,甚至任意类型 */ /* 测试数据: (1)Set1 ="magazine",Set2 ="paper", Set1∪Set2 ="aegimnpra",Set1∩Set2 ="ae",Set1 - Set2 ="gimnz" (2)Set1 =012oper4a6tion89",Set2 ="error date", Set1∪Set2 ="adeinoprt",Set1∩Set2 ="aeort",Set1 - Set2 ="inp" */ #include #include #include using namespace std; #define Elem Type char typedef struct ElemNode { Elem Type elem; struct ElemNode *next; }ElemNode, *Set; //-------------FunctionList------------------------------ //---------------函数原型-------------------------------- int LengthOf(Set src);//返回一个集合的长度 void CreateSet(Set dest);//创建一个新的字母集合,限定a-z void EmptySet(Set dest);//清空一个集合,保留头结点 void DestroySet(Set dest);//销毁集合

集合的交并差运算

《数据结构》 课程设计说明书 题目集合的并交差运算 学号 姓名 指导教师 日期

内蒙古科技大学课程设计任务书

附录:程序代码 #include #include #include typedef struct LNode //定义单链表结点类型{ char data; struct LNode *next; } LinkList; class jihe { int length; LinkList *L; public: jihe() { L=(LinkList*)malloc(sizeof(LinkList)); length=0; L->next=NULL; } ~jihe() { LinkList *p; while (L->next) { p = L->next; L->next = p->next; free(p); } } void ListCreat(int i); void ListDisp(int i); void BingJi(); void JiaoJi(); void ChaJi(int i); void ListInsert(int i); void ListDelete(int i);

jihe a[3];jihe b; /*************************长度****************************************/ int jihe::ListLength(int i) { LinkList *p; p = a[i].L; while (p->next != NULL) { p = p->next; a[i].length ++; } return a[i].length; } /****************************输入*************************************/ void jihe::ListCreat(int i) /*尾插法插入元素*/ { cout<<"请为集合输入数值(以回车键结束):"; char c; LinkList *p,*r; a[i].L=(LinkList*)malloc(sizeof(LinkList)); a[i].L->next=NULL; r=a[i].L; cin>>c; while(c!='\n') { p=(LinkList*)malloc(sizeof(LinkList)); if(c==' ') {} else { p->data=c; r->next=p; r=p; } c=cin.get(); } r->next=NULL; cout<<"输入完毕,请按回车键返回主菜单!"<

集合的并,交和差运算

石河子大学 《集合的并,交和差运算》程序设计基础课程设计报告 二OO八年六月二十一日

目录 一.编程目的: (2) 二.设计要求 (2) 三.各函数功能说明: (2) 四.函数框架图: (6) 五.总结: (7) 参考书目……………………………………………………………….8.

一.编程目的: 编写数学程序,能够演示执行集合的集合的并,交和差运算的程序,可以任意对两个集合进行集合之间的运算。 通过该程序的编写,我学会了如何更加熟练的掌握类和动态链表,我觉得程序设计很有难度,同时我学会了不会的一定要自己去找资料和问自己的同学或者询问自己的师兄师姐,那样有助于自己的自主学习。 经过自己的查找和询问,让自己对书上的知识理解的更加透彻一点了,该程序让我们把书上的知识灵活运用,让我们把书上的知识变活了,不至于掌握死的知识。 二.设计要求: 用类、数组建立数据库(最少包含3条记录以及具有下列功能) 1.集合的限定:集合元素必须为小写字母(元素为小写字母‘a~z’)2.能够进行集合之间的并集,交集以及差集运算。 3.可以进行最简单的提示(例如输入数据有误时候会进行提示) 三.各函数功能说明: 函数源代码以及函数的功能: #include #include

typedef struct pointer { //定义一个结构体变量pointer char dat; struct pointer *link; } pointer; void readdata(pointer *head){ //读集合 pointer *p; char tmp; printf("input data ('0' for end):"); //输出结果以‘0’结尾 scanf("%c",&tmp); while(tmp!='0') { if((tmp<'a')||(tmp>'z')) { printf("输入错误!必须为小写字母!\n"); return; } p=(pointer *)malloc(sizeof(struct pointer)); p->dat=tmp; p->link=head->link; head->link=p; scanf("%c",&tmp); } } void disp(pointer *head){ //显示集合数据 pointer *p; p=head->link; while(p!=NULL) { printf("%c ",p->dat); p=p->link; } printf("\n"); } void bing(pointer *head1,pointer *head2, pointer *head3){ //计算集合1与集合2的并

集合的并、交和差运算

集合的并、交和差运算 实习报告 题目:编制一个演示集合的并、交和差运算的程序 班级: 姓名: 学号: 完成日期: 一、需求分析 1.本演示程序中,集合的元素限制在小写字母‘a’-‘z’之间。集合的大小不限制,集合的输入形式为一个以“回车符”为结束标志的字符串,串中字符顺序不限,且允许出现重复字符或非法字符,程序运用时自动过滤去,输出的运算结果中将不含重复字符和非法字符。 2.演示程序以用户和计算机对话的形式进行,即在计算机终端中显示提示信息之后,有用户自行选择下一步命令,相应输入数据和运算结果在其后显示。 3.程序的执行命令有:1)选择操作2)任意键清屏 4.数据测试 (1)Set1=”magazine”, Set2=’paper”, Set1∪Set2=”aegimnprz”,Set1∩Set2=”ae”,Set1-Set2=”gimnz”; (2) Set1=”012oper4a6tion89”,Set2=”error data”, Set1∪Set2=”adeinoprt”,Set1∩Set2=”aeort”, Set1-Set2=”inp”. 二、概要设计 为实现上述功能,需要顺序表这个抽象数据类型。 1.顺序表抽象数据类型定义 ADT sqlist{ 数据对象:D={ai|a i∈Elemset,i=1,2,3,…n,n>=0} 数据关系:R1={|ai-1,ai∈D,i=2, … n} 基本操作: InitList(&l) 操作结果:构造一个空的顺序表l。 ListLength(l) 初始条件:顺序表l已存在。 操作结果:返回l中的元素个数。 ListInsert_Sq(&L, i, e) 初始条件:顺序表l已存在。 操作结果:在l中第i个元素前面插入元素e。 CreatSqList(&l, a[],n) 初始条件:顺序表l已存在。 操作结果:将数组a[n]每个元素赋给顺序表l。 GetElem(L, i, &e) 初始条件:顺序表l已存在。 操作结果:返回l中第i个元素的值

离散数学 实验四 编程实现集合的交、并、差和补运算。

离散数学实验报告 专业班级:姓名: 学号:实验成绩: 1.【实验题目】 集合运算 2.【实验目的】 编程实现集合的交、并、差和补运算。 3.【实验内容】 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。 4. 【实验要求】 通过以下界面提示实现相应的集合运算 **************************************************************** 请分别输入集合A与集合B的元素: 请选择(1—5)要进行的集合运算: 1.集合的交运算(A?B) 2.集合的并运算(A?B) 3.集合的差运算(A-B) 4.集合的补运算(~A=E-A) 5.继续/退出(y/n) **************************************************************** 5. 【算法描述】 (1)用数组A,B,C,E表示集合。假定A={1,3,4,5,6,7,9,10}, B={2,,3,4,7,8,10}, E={1,2,3,4,5,6,7,8,9,10}, 输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。 以下每一个运算都要求先将集合C置成空集。 (2)二个集合的交运算:A?B={x|x∈A且x∈B} 把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C 中,数组C便是集合A和集合B的交。

C语言算法: for(i=0;i

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

编号:730 数据结构与算法课程设计 说明书 集合的交并差运算 学院:海洋信息工程学院 专业:网络工程 学生姓名:xx 学号:xx 指导教师:xx 2017年12 月21 日

目录 目录 (2) 概述 (3) 程序说明 (3) 1 实验内容 (4) 1.1实验目的 (4) 1.2实验任务 (4) 1.3要求 (4) 2数据结构设计及流程图 (5) 2.1抽象数据结构类型定义 (5) 2.2本程序包含四个模块 (7) 3测试数据 (8) 3.1源程序 (8) 3.2测试数据及程序运行情况 (14) 4总结 (15) 参考文献 (15)

概述 本演示程序的编写,主要运用的我们学的第二章《线性表》中的知识。线性结构的特点是:在数据元素的非空有限集中,(1)存在唯一的一个被称做“第一个”的数据元素;(2)存在唯一的一个被称做“最后一个”的数据元素;(3)除第一个之外,集合中的每个数据元素均只有一个前驱;(4)除最后一个之外,集合中每个数据元素均只有一个后继。 本程序需要两个抽象数据类型:有序表和集合。而且采用了单链表来实现。 一、程序说明 本程序主要利用单链表及函数,实现集合的交集、并集和差集运算。 运行程序说明: 菜单执行的命令包括<0-7>: <1>“请输入A集合的个数与A集合元素” <2>“请输入B集合个数与B集合的元素” <3>“A集合的有序集合” <4>“B集合的有序集合” <5>“AB集合的并集” <6>“AB集合的交集” <7>“AB集合的差集” <0>“退出” 注:展示程序中,集合元素限定为小写字母数据,以“回车键”束标志。

1、实验内容 1.1实验目的:设计一个演示集合的交、并、差的运算程序 1.2实验任务 1)使用单链表来表示集合,完成集合的交集、并集、差等操作。 2)采用链表等数据结构。 3)集合的元素限定为数字和小写的英文字母 1.3实验要求: 1.初步完成总体设计,建立头文件,确定函数个数。 2.完成以下条件: 1)界面清楚,函数功能划分好 2)总体设计应画流程图 3)程序要加必要的注释 4)提供测试方案 注:程序多次测试,弥补漏洞。 要求: 1)展示程序中,集合元素限定为小写字母数据。集合输入的形式为一以“回车键”束标志。 2)展示程序以用户和计算机的对话方式执行,即在程序输出显示“提示信息”之后,然后再输入命令;相应的输入数据和运算结果显示在其后。 3)程序执行的命令包括<0-7>: <1>“请输入A集合的个数与A集合元素” <2>“请输入B集合个数与B集合的元素”

C语言实现集合的交-并-差

【问题描述】 编制一个能演示执行集合的并、交和差运算的程序【基本要求】 (1)集合的元素限定为小写字母字符[ 'a'......'z' ] (2 )演示程序以用户和计算机对话的方式执行 【测试数据】 【实现提示】 以有序链表表示集合 【代码过程】 1。先定义集合的数据类型notes.h //notes.h typedef struct LNode...{ ElemType data; LNode *next; }*Link, *Position; typedef struct...{ Link head,tail; int len; }LinkSet; //~ 2。以后要用的一些常量放在constValues.h #include #include #include //函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define ElemType int //存放数据的类型 typedef int Status; //函数的返回值//~ 3。集合实现函数setsFun.h /**//****************** 函数定义*********************/ Status InitSets(LinkSet &ls)...{

//初始化集合 ls.head = (Link) malloc( sizeof(Link)); ls.tail = (Link) malloc( sizeof(Link)); if(!ls.head || !ls.tail) exit(OVERFLOW); //如果分配失败 ls.head->next = ls.tail->next = NULL; //头、尾指针为空 ls.len = 0; //长度为0 return OK; } Status CreateNode(Link &link,ElemType e)...{ //创建一节点,内容为e link = (Link) malloc( sizeof(Link)); if(!link) exit(OVERFLOW); link->data = e; //值设定 link->next = NULL; //指向空 return OK; } Position PriorInsertNode(LinkSet &ls,Link &link)...{ //找出节点link要插入到ls的前一个节点 if(!ls.head->next) return ls.head; Link h1 = ls.head->next, h2 = h1->next; //h1:前一节点,h2:前一节点的后一节点 if(link->data < h1->data) return ls.head; //如果比第一个节点小,返回头指针 while(h1 && h2)...{ if(h1->data < (link->data) && h2->data > (link->data) ) //如果>h1 && data == (link->data) || h2->data ==(link->data) ) return NULL; //如果重复,返回NULL else //否则,顺次往后挪一个节点h1=h2,h2=h1->next; } return h1; } Status Append(LinkSet &ls, Link &link)...{ //向集合末尾追加节点 if(ls.head->next == NULL) ls.head->next = link; else ls.tail->next->next = link; ls.tail->next = link; ls.len ++; return OK;

相关文档
最新文档