数据结构(C语言)例子连载(1)====集合的交、并、差的实现
来源:互联网 发布:酷家乐软件多少钱 编辑:程序博客网 时间:2024/05/29 17:04
【问题描述】
编制一个能演示执行集合的并、交和差运算的程序
【基本要求】
(1)集合的元素限定为小写字母字符[ 'a'......'z' ]
(2 )演示程序以用户和计算机对话的方式执行
【测试数据】
【实现提示】
以有序链表表示集合
【代码过程】
1。先定义 集合的数据类型 notes.h
2。以后要用的一些常量放在 constValues.h
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 && <h2,说明找到插入的地方了
break;
if(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;
}
Status InsertNode(LinkSet &ls, Link &link){
//向集合中插入节点
Position p = PriorInsertNode(ls,link);
if(!p) return ERROR; //如果集合中已有相应元素
link->next = p->next;
if(!p->next) ls.tail->next = link; //如果前一节点为尾节点,修改tail
p->next = link;
ls.len++;
return OK;
}
Position PriorNode(LinkSet &ls, Link &link){
//返回集合中 该节点的前一节点,不存在返回NULL
int j=0;
Link pre,h = ls.head;
while(h->next && j<=ls.len && h!=link){
pre = h; h=h->next; j++;
}
if(j==0) return NULL;
return pre;
}
Status PrintSets(LinkSet &ls){
//打印集合
Link h=ls.head->next;
printf("[ ");
while(h){
printf("%c",h->data);
h = h->next;
}
printf(" ] ");
return OK;
}
Position GetHead(LinkSet &ls){
//获得集合的头节点
return ls.head;
}
Position NextPos(Link &link){
//获得当前节点的下一个节点
return link?link->next:link;
}
Status Empty(LinkSet &ls){
//空为真
return ls.head->next==NULL;
}
ElemType GetCurElem(Link &link){
//获得当前节点的数据
return link->data;
}
int Compare(Link &la, Link &lb){
//判断两个节点的大小
return la->data - lb->data;
}
int Compare(ElemType e1, ElemType e2){
//比较两个数字的大小
return e1-e2;
}
Status DelFirst(LinkSet &ls,Link &q){
//已知h为线性链表的头节点,删除表中的第一个节点,并以q返回
Link h = ls.head;
if(!h->next) return ERROR;
q = h->next;
h->next = h->next->next;
q->next=NULL;
ls.len--;
return OK;
}
Status FreeNode(Link &l){//释放节点,有问题
free(l);
return OK;
}
Status UnionSets(LinkSet lsa, LinkSet &lsb, LinkSet &lsc){
//已知集合ls1,ls2的元素按值非递减排列
//将集合ls1,ls2的并集到ls3
if( !InitSets(lsc) ) return ERROR;
Link node;
Link ha = lsa.head, hb=lsb.head; //找到两节点的头指针
Link pa = NextPos(ha), pb = NextPos(hb);
while( !Empty(lsa) && !Empty(lsb) ){
int result = Compare(pa,pb); //比较两节点大小
if( result<0) {
DelFirst(lsa,node);Append(lsc,node); pa = NextPos(ha); //向lsc插入lsa的相关节点
}else if(result>0){ //向lsc插入lsb的相关节点
DelFirst(lsb,node);Append(lsc,node); pb = NextPos(hb);
}else{
DelFirst(lsb,node); pb = NextPos(hb);//如果两 节点相同,删除lsb中重复的节点,即以lsa为标准
}
}
while(!Empty(lsa)){
DelFirst(lsa,node);Append(lsc,node);
}
while(!Empty(lsb)){
DelFirst(lsb,node);Append(lsc,node);
}
return OK;
}
Status IntersectionSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc){
//已知集合ls1,ls2的元素按值非递减排列
//将集合ls1,ls2的交集到ls3
if( !InitSets(lsc) ) return ERROR;
Link node;
Link ha = lsa.head, hb=lsb.head;
Link pa = NextPos(ha), pb = NextPos(hb);
while( !Empty(lsa) && !Empty(lsb) ){
int result = Compare(pa,pb);
if( result<0) {
DelFirst(lsa,node);pa = NextPos(ha);
}else if(result>0){
DelFirst(lsb,node); pb = NextPos(hb);
}else{
DelFirst(lsb,node); Append(lsc,node);pb = NextPos(hb);
DelFirst(lsa,node);pa = NextPos(ha);
}
}
while(!Empty(lsa)){
DelFirst(lsa,node);Append(lsc,node);
}
return OK;
}
Status DifferenceSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc){
//已知集合ls1,ls2的元素按值非递减排列
//ls3 = ls1 - ls2
if( !InitSets(lsc) ) return ERROR;
Link node;
Link ha = lsa.head, hb=lsb.head;
Link pa = NextPos(ha), pb = NextPos(hb);//,pb2 = NextPos(pb1);
while( !Empty(lsa) && !Empty(lsb) ){
int result = Compare(pa,pb);
if( result<0) {
DelFirst(lsa,node);Append(lsc,node);pa = NextPos(ha);
}else if(result>0){
DelFirst(lsb,node); pb = NextPos(hb);
}else{
DelFirst(lsa,node); pa = NextPos(ha);
DelFirst(lsb,node); pb = NextPos(hb);
}
}
return OK;
}
Status CopySets(LinkSet lsa, LinkSet lsb){
//将集合lsa拷贝到lsb中
InitSets(lsb);
Link la = lsa.head->next, lb = lsb.head->next;
while(la){
Link node;
CreateNode(node,la->data);
lb=node;
lsb.len++;
la = la->next;
lb = lb->next;
}
lsb.tail = lb;
return OK;
}
//~ 4。测试 test.cpp
【界面演示】1。
2。
3。
4。
5。
6
编制一个能演示执行集合的并、交和差运算的程序
【基本要求】
(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;
//~
typedef struct LNode{
ElemType data;
LNode *next;
}*Link, *Position;
typedef struct{
Link head,tail;
int len;
}LinkSet;
//~
2。以后要用的一些常量放在 constValues.h
#include<stdio.h>
#include <malloc.h>
#include <stdlib.h>
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define ElemType int //存放数据的类型
typedef int Status; //函数的返回值
//~
#include <malloc.h>
#include <stdlib.h>
//函数结果状态代码
#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 && <h2,说明找到插入的地方了
break;
if(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;
}
Status InsertNode(LinkSet &ls, Link &link){
//向集合中插入节点
Position p = PriorInsertNode(ls,link);
if(!p) return ERROR; //如果集合中已有相应元素
link->next = p->next;
if(!p->next) ls.tail->next = link; //如果前一节点为尾节点,修改tail
p->next = link;
ls.len++;
return OK;
}
Position PriorNode(LinkSet &ls, Link &link){
//返回集合中 该节点的前一节点,不存在返回NULL
int j=0;
Link pre,h = ls.head;
while(h->next && j<=ls.len && h!=link){
pre = h; h=h->next; j++;
}
if(j==0) return NULL;
return pre;
}
Status PrintSets(LinkSet &ls){
//打印集合
Link h=ls.head->next;
printf("[ ");
while(h){
printf("%c",h->data);
h = h->next;
}
printf(" ] ");
return OK;
}
Position GetHead(LinkSet &ls){
//获得集合的头节点
return ls.head;
}
Position NextPos(Link &link){
//获得当前节点的下一个节点
return link?link->next:link;
}
Status Empty(LinkSet &ls){
//空为真
return ls.head->next==NULL;
}
ElemType GetCurElem(Link &link){
//获得当前节点的数据
return link->data;
}
int Compare(Link &la, Link &lb){
//判断两个节点的大小
return la->data - lb->data;
}
int Compare(ElemType e1, ElemType e2){
//比较两个数字的大小
return e1-e2;
}
Status DelFirst(LinkSet &ls,Link &q){
//已知h为线性链表的头节点,删除表中的第一个节点,并以q返回
Link h = ls.head;
if(!h->next) return ERROR;
q = h->next;
h->next = h->next->next;
q->next=NULL;
ls.len--;
return OK;
}
Status FreeNode(Link &l){//释放节点,有问题
free(l);
return OK;
}
Status UnionSets(LinkSet lsa, LinkSet &lsb, LinkSet &lsc){
//已知集合ls1,ls2的元素按值非递减排列
//将集合ls1,ls2的并集到ls3
if( !InitSets(lsc) ) return ERROR;
Link node;
Link ha = lsa.head, hb=lsb.head; //找到两节点的头指针
Link pa = NextPos(ha), pb = NextPos(hb);
while( !Empty(lsa) && !Empty(lsb) ){
int result = Compare(pa,pb); //比较两节点大小
if( result<0) {
DelFirst(lsa,node);Append(lsc,node); pa = NextPos(ha); //向lsc插入lsa的相关节点
}else if(result>0){ //向lsc插入lsb的相关节点
DelFirst(lsb,node);Append(lsc,node); pb = NextPos(hb);
}else{
DelFirst(lsb,node); pb = NextPos(hb);//如果两 节点相同,删除lsb中重复的节点,即以lsa为标准
}
}
while(!Empty(lsa)){
DelFirst(lsa,node);Append(lsc,node);
}
while(!Empty(lsb)){
DelFirst(lsb,node);Append(lsc,node);
}
return OK;
}
Status IntersectionSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc){
//已知集合ls1,ls2的元素按值非递减排列
//将集合ls1,ls2的交集到ls3
if( !InitSets(lsc) ) return ERROR;
Link node;
Link ha = lsa.head, hb=lsb.head;
Link pa = NextPos(ha), pb = NextPos(hb);
while( !Empty(lsa) && !Empty(lsb) ){
int result = Compare(pa,pb);
if( result<0) {
DelFirst(lsa,node);pa = NextPos(ha);
}else if(result>0){
DelFirst(lsb,node); pb = NextPos(hb);
}else{
DelFirst(lsb,node); Append(lsc,node);pb = NextPos(hb);
DelFirst(lsa,node);pa = NextPos(ha);
}
}
while(!Empty(lsa)){
DelFirst(lsa,node);Append(lsc,node);
}
return OK;
}
Status DifferenceSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc){
//已知集合ls1,ls2的元素按值非递减排列
//ls3 = ls1 - ls2
if( !InitSets(lsc) ) return ERROR;
Link node;
Link ha = lsa.head, hb=lsb.head;
Link pa = NextPos(ha), pb = NextPos(hb);//,pb2 = NextPos(pb1);
while( !Empty(lsa) && !Empty(lsb) ){
int result = Compare(pa,pb);
if( result<0) {
DelFirst(lsa,node);Append(lsc,node);pa = NextPos(ha);
}else if(result>0){
DelFirst(lsb,node); pb = NextPos(hb);
}else{
DelFirst(lsa,node); pa = NextPos(ha);
DelFirst(lsb,node); pb = NextPos(hb);
}
}
return OK;
}
Status CopySets(LinkSet lsa, LinkSet lsb){
//将集合lsa拷贝到lsb中
InitSets(lsb);
Link la = lsa.head->next, lb = lsb.head->next;
while(la){
Link node;
CreateNode(node,la->data);
lb=node;
lsb.len++;
la = la->next;
lb = lb->next;
}
lsb.tail = lb;
return OK;
}
//~
#include "constValues.h" //常量头 文件
#include "notes.h" //节点定义 头文件
#include "setsFun.h" //集合操作函数 头文件
/**************** 测试 ***********************************/
void Initialization(){
printf("**************************************************************************** " );
printf("*MakeSet1-1 MakeSet1-2 Union-u Intersection-i Difference-d Quit-q * " );
printf("**************************************************************************** " );
}
void main()
{
LinkSet set1,set2,set3,seta,setb;
InitSets(set1),InitSets(set2); //初始化集合
while(1){
Initialization();
printf("集合Set1:");
PrintSets(set1); //打印集合set1
printf("集合Set2:");
PrintSets(set2); //打印集合set1
printf("请键入操作代码:");
fflush(stdin); //清空缓冲区
char oper = getchar();
char setsContent[200];
switch(oper)
{
case '1': //集合set1 赋值
printf("请输入集合Set1的内容:");
fflush(stdin);
gets(setsContent);
InitSets(set1);
SetSets(set1,setsContent);
break;
case '2': //集合set1 赋值
printf("请输入集合Set1的内容:");
fflush(stdin);
gets(setsContent);
InitSets(set2);
SetSets(set2,setsContent);
break;
case 'u':
case 'U': //求并
InitSets(set3);
CopySets(set1,seta); //因为求并的算法是添加一个节点,删除set1,set2中对应的节点,
CopySets(set2,setb); //所以要复制一份
UnionSets(seta,setb,set3); //下同
printf("set1 U set2=: ");
PrintSets(set3);
fflush(stdin);
getchar();
break;
case 'i':
case 'I': //求交
InitSets(set3);
CopySets(set1,seta);
CopySets(set2,setb);
IntersectionSets(seta,setb,set3);
printf("set1 交 set2=: ");
PrintSets(set3);
fflush(stdin);
getchar();
break;
case 'd':
case 'D': //求差
InitSets(set3);
CopySets(set1,seta);
CopySets(set2,setb);
DifferenceSets(seta,setb,set3);
printf("set1 - set2=: ");
PrintSets(set3);
fflush(stdin);
getchar();
break;
case 'q':
case 'Q':
exit(0);
break;
}
system("cls"); //清屏
}
}
//~
#include "notes.h" //节点定义 头文件
#include "setsFun.h" //集合操作函数 头文件
/**************** 测试 ***********************************/
void Initialization(){
printf("**************************************************************************** " );
printf("*MakeSet1-1 MakeSet1-2 Union-u Intersection-i Difference-d Quit-q * " );
printf("**************************************************************************** " );
}
void main()
{
LinkSet set1,set2,set3,seta,setb;
InitSets(set1),InitSets(set2); //初始化集合
while(1){
Initialization();
printf("集合Set1:");
PrintSets(set1); //打印集合set1
printf("集合Set2:");
PrintSets(set2); //打印集合set1
printf("请键入操作代码:");
fflush(stdin); //清空缓冲区
char oper = getchar();
char setsContent[200];
switch(oper)
{
case '1': //集合set1 赋值
printf("请输入集合Set1的内容:");
fflush(stdin);
gets(setsContent);
InitSets(set1);
SetSets(set1,setsContent);
break;
case '2': //集合set1 赋值
printf("请输入集合Set1的内容:");
fflush(stdin);
gets(setsContent);
InitSets(set2);
SetSets(set2,setsContent);
break;
case 'u':
case 'U': //求并
InitSets(set3);
CopySets(set1,seta); //因为求并的算法是添加一个节点,删除set1,set2中对应的节点,
CopySets(set2,setb); //所以要复制一份
UnionSets(seta,setb,set3); //下同
printf("set1 U set2=: ");
PrintSets(set3);
fflush(stdin);
getchar();
break;
case 'i':
case 'I': //求交
InitSets(set3);
CopySets(set1,seta);
CopySets(set2,setb);
IntersectionSets(seta,setb,set3);
printf("set1 交 set2=: ");
PrintSets(set3);
fflush(stdin);
getchar();
break;
case 'd':
case 'D': //求差
InitSets(set3);
CopySets(set1,seta);
CopySets(set2,setb);
DifferenceSets(seta,setb,set3);
printf("set1 - set2=: ");
PrintSets(set3);
fflush(stdin);
getchar();
break;
case 'q':
case 'Q':
exit(0);
break;
}
system("cls"); //清屏
}
}
//~
【界面演示】1。
2。
3。
4。
5。
6
- 数据结构(C语言)例子连载(1)====集合的交、并、差的实现
- C语言实现集合的交,并,差
- C语言实现集合的交,并,差
- 数据结构(C语言)例子连载(4)====广义表的实现
- 集合的交、并、差的实现
- 集合的交、并、差的实现
- 利用线性表的顺序结构求集合的并、交、差、补(C语言实现)
- 集合的并、交、差
- 集合的交 并 差 补 运算
- 集合的交、并、差运算
- 集合的并、交和差运算
- 数据结构(C语言)例子连载(0)=====开贴
- 数据结构(C语言)例子连载(2)====迷宫问题
- 数据结构(C语言)例子连载(3)====文学研究助手
- 数据结构(C语言)例子连载(6)====赫夫曼编码
- 正则语言的 并 交 差
- 数据结构——顺序(升序)链表(增加,删除,集合的并,交,差)
- multiset集合容器的集合运算:并、交、差
- begtostudy经验灵感笔记-VC宏
- 人生如火
- 第4代白盒测试方法实践之“使用VcTester实施持续集成的组织管理模式”
- 用_T("")和直接用""的区别
- Digital Imaging : Interpolation
- 数据结构(C语言)例子连载(1)====集合的交、并、差的实现
- CSR蓝牙开发手记
- 日志分析系统开发笔记
- 11月2日小结
- 11月1日小结
- 为什么受伤的总是我
- VFP工作区的概念(感谢十豆三)
- 终于把mysql、apache、php给安装好了
- 概念