稀疏矩阵的输入与输出

 #include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct juzhen)
#define NULL 0

struct juzhen
{
    int h,l;
    int num;
    struct juzhen*next;
    struct juzhen*below;
};
int n,hmax,lmax;

struct juzhen*creat(void)
{
    struct juzhen*hhead,*lhead;
    struct juzhen*p,*q,*p1,*q1;
    int a,b,temp;
    n=0;
    hhead=NULL;
    lhead=NULL;

  l:printf("请输入矩阵的行数和列数:/n");
    scanf("%d,%d",&hmax,&lmax);
   
    if(hmax<=0||lmax<=0)
    {
        printf("输入错误!/n");
        goto l;
    }
   
    printf("这是一个%d行%d列的稀疏矩阵/n",hmax,lmax);
    printf("请键入矩阵元素,顺序为元素,行,列:/n");

    p=q=(struct juzhen*)malloc(LEN);
    scanf("%d,%d,%d",&p->num,&p->h,&p->l);

    if(((p->h)>hmax)||((p->l)>lmax))
    {
        printf("输入错误,请重新输入!/n");
        goto l;
    }
    n=n+1;

    while(p->num!=NULL&&p->h!=NULL&&p->l!=NULL)
    {
        if(n==1)hhead=p;
        else p1->next=p;
        p1=p;
        p=(struct juzhen*)malloc(LEN);
        scanf("%d,%d,%d",&p->num,&p->h,&p->l);

        if(p->num==NULL)
        {
        break;
        }
        while((p->h)>hmax||(p->l)>lmax)
        {
        printf("行或列输入错误,请重新输入这个元素:/n");
        scanf("%d,%d,%d",&p->num,&p->h,&p->l);
        }
        n=n+1;
    }
    p1->next=NULL;
   
        //增加行的头指针,按行排序
    p=hhead;
    q=hhead;
    while(q!=NULL)
    {
        p=hhead;
        while(p!=NULL)
        {
            p1=p->next;
            if(p1==NULL)
        {
            break;
        }
            if((p->h==p1->h)&&(p->l<p1->l))
            {

                temp=p->num;a=p->h;b=p->l;
                p->num=p1->num;p->h=p1->h;p->l=p1->l;
                p1->num=temp;p1->h=a;p1->l=b;
            }                            //变换位置
            else if(p->h<p1->h)
            {
                temp=p->num;a=p->h;b=p->l;
                p->num=p1->num;p->h=p1->h;p->l=p1->l;
                p1->num=temp;p1->h=a;p1->l=b;
            }                            //最小的沉底
            else if(p->h==p1->h&&p->l==p1->l)
            {
                p->num=p->num+p1->num;
                n=n-1;
                if(p1->next!=NULL)
                {
                    p->next=p1->next;
                }
                else
                {
                    p->next=NULL;
                }
            }
            else
            {
                 ;
            }
            p=p->next;
        }
        q=q->next;
    }

   
    printf("这个矩阵有%d个非0项/n",n);
   
    int m[100][100]={};
    p=hhead;
    for(int d=1;d<=n;d++)
    {
        m[p->h][p->l]=p->num;
        p=p->next;
    }
   

    for(int i=1;i<=hmax;i++)
    {
        for(int j=1;j<=lmax;j++)
        {
            printf("%d  ",m[i][j]);
        }
        printf("/n");
    }
    p=hhead;
    while(p!=NULL)
    {
        printf("%d,%d,%d/n",p->num,p->h,p->l);
        p=p->next;
    }    //简单输出

    return(hhead);
}


main()
{
    struct juzhen*hhead;
    hhead=creat();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值