问题标题:
【三元组表示的矩阵的操作实现给定关系R(用矩阵表示),求R的自反闭包、对称闭包和可传递闭包.要求:(1)试试以序偶的形式输入关系,转换为矩阵存储.如果不行就用矩阵直接输入.(2)以关】
问题描述:

三元组表示的矩阵的操作实现

给定关系R(用矩阵表示),求R的自反闭包、对称闭包和可传递闭包.

要求:

(1)试试以序偶的形式输入关系,转换为矩阵存储.如果不行就用矩阵直接输入.

(2)以关系和矩阵两种形式输出该关系的传递自反闭包、对称闭包和可传递闭包.

陈马连回答:
  我有一个可以用的.怎么给你?百度hi我吧.   算了,我贴上来吧,由电脑编程网整理:   #include<stdio.h>   #include<malloc.h>   #definesmax45   typedefintdatatype;   typedefstructlnode//结构体和共用体的定义   {   inti,j;   structlnode*cptr,*rptr;   union   {   structlnode*next;   datatypev;   }uval;   }link;   intflag=0;   //建立稀疏矩阵的函数,返回十字链表头指针   link*creatlinkmat()   {   link*p,*q,*head,*cp[smax];   inti,j,k,m,n,t,s;   datatypev;   printf("输入行、列,非零元素个数(m,n,t数字间用逗号分隔)");   scanf("%d,%d,%d",&m,&n,&t);//输入行、列,非零元素个数   if(m>n)s=m;elses=n;   head=(link*)malloc(sizeof(link));//建立十字链表头结点   head->i=m;head->j=n;   cp[0]=head;//cp[]是指针数组,分别指向头结点和行、列表头结点   for(i=1;i<=s;i++)//建立头结点循环链表   {   p=(link*)malloc(sizeof(link));   p->i=0;p->j=0;   p->rptr=p;p->cptr=p;   cp[i]=p;cp[i-1]->uval.next=p;   }   cp[s]->uval.next=head;   for(k=1;k<=t;k++)   {   printf("t第%d个元素(行号i列号j值v,数字间用空格分隔):",k);   scanf("%d%d%d",&i,&j,&v);   p=(link*)malloc(sizeof(link));   p->i=i;p->j=j;p->uval.v=v;   q=cp[i];   while((q->rptr!=cp[i])&&(q->rptr->j<j))   q=q->rptr;   p->rptr=q->rptr;   q->rptr=p;   q=cp[j];   while((q->cptr!=cp[j])&&(q->cptr->i<i))   q=q->cptr;   p->cptr=q->cptr;   q->cptr=p;   }   returnhead;   }   //插入结点函数   voidinsert(inti,intj,intv,link*cp[])   {   link*p,*q;   p=(link*)malloc(sizeof(link));   p->i=i;p->j=j;p->uval.v=v;   //以下是经*p结点插入第i行链表中   q=cp[i];   while((q->rptr!=cp[i])&&(q->rptr->j<j))   q=q->rptr;//在第i行中找第一个列号大于j的结点*(q->rptr)   //找不到时,*q是该行表上的尾结点   p->rptr=q->rptr;   q->rptr=p;//*p插入在*q之后   //以下是将结点插入第j列链表中   q=cp[j];//取第j列表头结点   while((q->cptr!=cp[j])&&(q->cptr->i<i))   q=q->cptr;//在第j行中找第一个列号大于i的结点*(q->cptr)   //找不到时,*q是该行表上的尾结点   p->cptr=q->cptr;   q->cptr=p;//*p插入在*q之后   }   //输出十字链表的函数   voidprint(link*a)   {   link*p,*q,*r;//p是控制行q是控制列r是控制输出的格式   intk,col,t,row;   col=a->j;//矩阵a的列数   printf("矩阵为:n");   p=a->uval.next;//p指向第一个结点(不是头结点)   while(p!=a)   {   q=p->rptr;//p指向这以一行的一个值   if(q==a->cptr)break;//如果行或列处理完了,跳出   r=p;//r指向这一行的头结点   while(q!=p)   {   for(k=1;k<q->j-(r->j);k++)//输出同一行上两非零数据间的零   printf("0");   printf("%3d",q->uval.v);//输出那个非零值   q=q->rptr;//q指向这一行的下一个元素   r=r->rptr;//r指向q前面的一个非零元素   }   k=r->j;//k的值是某一行的最后一个非零
查看更多
其它推荐
热门其它推荐