19、数据结构笔记之十九链表实现等价类寻找

本文介绍了一种使用链表来实现等价类搜索的方法。通过输入等价关系对,构建链表来存储等价类信息,并通过扫描链表找到等价类。文章提供了完整的C语言源代码。

19、数据结构笔记之十九链表实现等价类寻找

           “人生有两出悲剧:一是万念俱灰,另一是踌躇满志。

           继续来看下通过链表存储实现等价类寻找。

1.  等价类

等价类(Equivalenceclass)在数学中,给定一个集合 X 和在 X 上的一个等价关系 ~,则 X 中的一个元素 a 的等价类是在 X 中等价于 a 的所有元素构成的集合: a= { X ; X ~ a }

2.  实现

输入一个size,然后初始化out和seq数组。

然后输入数值对。

Seq[i]指向结点表,而结点表包含在输入关系中直接与i等价的每个数。

然后扫描数组seq寻找第一个使得out[i] = TRUE的i,其中0<=i<n 输出seq[i]中的每个元素。

          

 

3.  源码

#include<stdio.h>

#include<atlalloc.h>

#defineMAX_SIZE24

#defineIS_FULL(ptr)(!(ptr))

#defineFALSE 0

#defineTRUE 1

typedefstructnode *node_pointer;

typedefstructnode {

           intdata;

           node_pointerlink;

};

 

void main(void)

{

           shortintout[MAX_SIZE];

           node_pointerseq[MAX_SIZE];

 

           node_pointerx,y,top;

           inti,j,n;

           printf("Enterthe size (<=%d) ",MAX_SIZE);

           scanf("%d",&n);

           for(i = 0;i<n;i++) {

                     out[i]= TRUE;

                     seq[i]= NULL;

           }

           printf("Entera pair of numbers (-1 -1 to quit):");

           scanf("%d%d",&i,&j);

           while(i>=0)

           {

                     x= (node_pointer)malloc(sizeof(node));

                     if(IS_FULL(x)){

                                fprintf(stderr,"Thememory is full\n");

                                          exit(1);

                     }

                     x->data= j;

                     x->link= seq[i];

                     seq[i]= x;

                     x= (node_pointer)malloc(sizeof(node));

                     if(IS_FULL(x)){

                                fprintf(stderr,"Thememory is full\n");

                                exit(1);

                     }

                     x->data= i;

                     x->link=seq[j];

                     seq[j]=x;

                     printf("Entera pair of numbers (-1 -1 to quit):");

                     scanf("%d%d",&i,&j);

           }

           for (i = 0;i < n;i++)

                     if(out[i]){

                                printf("\nNew Class:%5d",i);

                                out[i]= FALSE;

                                x= seq[i];

                                top= NULL;

                                for (;;){

                                          while(x){

                                                     j= x->data;

                                          if(out[j] ) {

                                                     printf("%5d",j);

                                                     y= x->link;

                                                     x->link=top;

                                                     top=x;

                                                     x= y;

                                          }

                                          else x= x->link;

                                }

                                if(!top)break;

                                x= seq[top->data];

                                top= top->link;

                                }

                     }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值