问题标题:
【三元组表示的矩阵的操作实现给定关系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的值是某一行的最后一个非零
查看更多