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

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;

                                }

                     }

}

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值