标题:还是三元组转制问题 不过这次对了
取消只看楼主
minqda
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-4-10
 问题点数:0 回复次数:0 
还是三元组转制问题 不过这次对了
https://bbs.bccn.net/viewthread.php?tid=326358&page=1#pid1878475
上面的是上次写的不对的程序。不知道怎么搞的  总不能回复。
嗯 现在是对了。 上上个星期弄出来 现在来结贴。- +
这是一个10*10矩阵。
[附件ID:attach_1名称:QQ截图未命名.jpg][附件ID:attach_3名称:_$4W}T{GW3H1IGQ@UAXOSZ5.jpg]
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OK 1
#define FALSE 0
#define MAXSIZE 100
typedef int Status;
typedef  int  ElemType;
int c[2],g=0;                //全局变量 用来接收产生的随机行、列数
int d[100],f[100];           //接收随即产生的三元组中所有产生过的i,j值。用来与新产生的行列数i,j值比较 若都相同 则重新产生行列数i,j                                                                                                               
typedef struct{
     int i,j;
    ElemType e;
}Triple;//三元组定义

typedef struct{
    Triple data[MAXSIZE+1];
     int mu,nu,tu;
}TSMatrix;//给三元组添加行mu、列nu、值tu。三个元素

Status cre(TSMatrix &M,int g)//判断随即产生的三元组是否已经产生过
{   
    int h,q,flag=0;
    for(h=0;h<g-1;h++)        
    {   
        for(q=h+1;q<g;q++)
        {
            if(d[h]==d[q]&&f[h]==f[q])
            {
                d[q]=c[0]=rand()%M.mu+1;
                f[q]=c[1]=rand()%M.nu+1;        
                cre(M,g);
            }
        }
    }
    return OK;
}

Status print(TSMatrix &M)//打印原三元组产生的矩阵
{
    int a,b,k,flag;
    for(a=1;a<=M.mu;a++)
    {
        for(b=1;b<=M.nu;b++)
        {
            flag=0;
            for(k=1;k<=M.tu;k++)     
            {
                if(a==M.data[k].i&&b==M.data[k].j)
                {
                    printf("%5d",M.data[k].e);
                    flag=1;
                    break;
                }
            }
            if(flag==0)
              printf("%5d",0);
         }   
        printf("\n");
    }
    return OK;
}

Status Input(TSMatrix &M,int m,int n)   //输入m行n列的矩阵存储到三元组表M中 m<=10  n<=10
{   
    int k,x;
    printf("请输入矩阵的行数和列数:");
    scanf("%d%d",&M.mu,&M.nu);
    M.data[0].i=M.mu;
    M.data[0].j=M.nu;
     printf("输入非零元素的个数tu:");
    scanf("%d",&M.tu);
    srand((unsigned)time(0));
    M.data[0].e=M.tu;
    for(k=1;k<=M.tu;k++)
     {
       c[0]=d[g]=m=rand()%M.mu+1;         
       c[1]=f[g]=n=rand()%M.nu+1;
       g++;
       if(k>1)
         cre(M,g);        
        M.data[k].i=c[0];
        M.data[k].j=c[1];
        x=rand()%100+1;
      
        M.data[k].e=x;
    }
    printf("随即生成的三元组为:\n");
    printf("  mu nu e\n");
    for(k=1;k<=M.tu;k++)
    {
        printf("%3d%3d%4d\n",M.data[k].i,M.data[k].j,M.data[k].e);
    }
    printf("转制前矩阵为:\n");
    return  OK;
}

Status Transpose(TSMatrix M,TSMatrix &T)//按行优先进行将M转制成T  既原来M中的行变成T中的列 M中的列变成T中的行  其中值不变
{
    T.mu=M.nu;
    T.nu=M.mu;
    T.tu=M.tu;
    int col,t,p,q;  
    int num[10];
    int cpot[10];
    if(T.tu)
    {
        for(col=1;col<=M.nu;col++)
            num[col]=0;               //表示矩阵M中第col列中非零元素个数
        for(t=1;t<=M.tu;t++)
            num[M.data[t].j]++;       //中每一列含非零元的个数
        cpot[1]=1;                    //cpot[col]表示M中第col列第一个非零元素在T.data中的恰当位置
        for(col=2;col<=M.nu;col++)
            cpot[col]=cpot[col-1]+num[col-1];
        for(p=1;p<=M.tu;p++)
        {
            col=M.data[p].j;
            q=cpot[col];
            T.data[q].i=M.data[p].j;
            T.data[q].j=M.data[p].i;
            T.data[q].e=M.data[p].e;
            cpot[col]++;
        }  //for语句
    }  //if语句
    return OK;
}


void main()
{
    TSMatrix M,T;
    int m=0,n=0;
    Input(M,m,n);//产生原矩阵并打印
    print(M);
    Transpose(M,T);//转制
    printf("转制后的矩阵为:\n");
    print(T);
}

搜索更多相关主题的帖子: 三元 转制 
2010-12-05 12:36



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-327953-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.414793 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved