十字链表实现加法
运行结果及报错内容:没有报错
我的解答思路和尝试过的方法:在build的地方对循环条件改动
我想要达到的结果:不会无限输入,得到输出
#include<stdio.h>
#include<stdlib.h>
typedef struct OLNode
{
int row,col;
int info;
struct OLNode *right,*down;
}OLNode,*OLink;
typedef struct
{
OLink *rowhead,*colhead;//这里要加*,为什么?
int m,n,len;
}Crosslist;
Crosslist* build(int m,int n,int len)
{
Crosslist*p=(Crosslist*) malloc(sizeof(Crosslist));
p->m=m;
p->n=n;
p->len=len;
p->rowhead=(OLink*)malloc((m+1)*sizeof(OLNode));
p->colhead=(OLink*)malloc((n+1)*sizeof(OLNode));
for(int i=0;i<m+1;i++)
{
p->rowhead[i]=NULL;
}
for(int j=0;j<n+1;j++)
{
p->colhead[j]=NULL;
}
return p;
}
void insert(Crosslist*list,int row,int col,int info)//插入
{
OLink p=(OLNode*)malloc(sizeof(OLink));//这里不加*
p->col=col;
p->row=row;
p->info=info;
if(list->rowhead[row]==NULL||list->rowhead[row]->col>col)
{
p->right=list->rowhead[row];
list->rowhead[row]=p;
}
else if(list->rowhead[row]->col<col)
{
OLink q=list->rowhead[row];
while(q->right!=NULL&&q->right->col<col)
{
q=q->right;
}
if(q->right==NULL)
{
q->right=p;
}
else
{
p->right=q->right;
q->right=p;
}
}
}
void completeMatrix(Crosslist* p)
{
for(int k=1;k<=p->len;k++)
{
int i,j,elem;
scanf("%d %d %d\n",&i,&j,&elem);
insert(p,i,j,elem);
}
}
void output(Crosslist*p)
{
int i,j;
for(i=1;i<=p->m;i++)
{
OLink q;
q=p->rowhead[i];
for(j=1;j<=p->n;j++)
{ OLink q1;
q1=q;
while(q1!=NULL)
{
if(q1->col==j)
{
printf("%d %d %d",q1->row,q1->col,q1->info);
}
q1=q1->right;
}
}
}
}
Crosslist* add(Crosslist* p1,Crosslist* p2,Crosslist* p3)
{
int i;
int num=0;
int mumax,tumax;
OLink q1,q2;//不加*,为什么?
if(p1->len>p2->len)
tumax=p1->len;
else
tumax=p2->len;
if(p1->m>p2->m)
mumax=p1->m;
else
mumax=p2->m;
while(num<=tumax)
{
for(i=1;i<=mumax;i++)
{
q1=p1->rowhead[i];
q2=p2->rowhead[i];
if(q1!=NULL&&q2==NULL)
{
while(q1!=NULL)
{
insert(p3,q1->row,q1->col,q1->info);
q1=q1->right;
num++;
}
}
if(q1==NULL&&q2!=NULL)
{
while(q2!=NULL)
{
insert(p3,q2->row,q2->col,q2->info);
q2=q2->right;
num++;
}
}
if(q1!=NULL&&q2!=NULL)
{
while(q1!=NULL||q2!=NULL)
{
if(q1->col<q2->col ||q2!=NULL)
{
insert(p3,q1->row,q1->col,q1->info);
q1=q1->right;
num++;
}
if(q2->col>q1->col ||q1!=NULL)
{
insert(p3,q2->row,q2->col,q2->info);
q2=q2->right;
num++;
}
if(q1->col==q2->col)
{
if((q1->info+q2->info)!=0)
{
insert(p3,q1->row,q1->col,q1->info+q2->info);
q1=q1->right;
q2=q2->right;
num++;
}
}
}
}
}
}
return p3;
}
int main()
{
Crosslist* p1,*p2,*p3;
int m,n,t1,t2,i,j;
scanf("%d %d %d %d\n",&m,&n,&t1,&t2);
p1=build(m,n,t1);
p2=build(m,n,t2);
p3=build(m,n,t1+t2);
completeMatrix(p1);
completeMatrix(p2);
p3=add(p1,p2,p3);
output(p3);
return 0;
}