#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();
}