首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

棘手!一个有志青年的》》》》解决方案

2012-03-05 
棘手!一个有志青年的》》》》我在编程的时候遇到一个很棘手的问题,问题要求用十字链表实现稀疏矩阵的相加,所用

棘手!一个有志青年的》》》》
我在编程的时候遇到一个很棘手的问题,问题要求用十字链表实现稀疏矩阵的相加,所用语言是C语言,运行环境是VC++,我参考了一个网上的程序,在调试的时候没有错误,但是在输入数据运行的时候,数据输入到一半就弹出警告了。说
“内存”“指令”“要终止程序单击确定”“要调试单击取消”
。高不懂是什么原因。希望大家帮帮小弟,谢谢。
程序如下:

#include   <stdio.h>
#include   <malloc.h>

#define   MAX   100

struct   matnode             //十字链表结点的定义  
{
  int   row,col;
  struct   matnode   *right,*down;
  union     {
    int   val;//表结点使用V域
    struct   matnode   *next;//表头结点使用next域
  }tag;
};
struct   matnode   *createmat(struct   matnode   *hmone[MAX])
{
  int   m,n,t,s,i,r,c,v;  
//   struct   matnode   *l,*p,*q;  
  struct   matnode   *h[100],*l,*p,*q;     //h[]是十字链表每行的表头指针数组  
  printf( "行数m,列数n,非零元素个数t: ");
  //scanf( "%d,%d,%d ",&m,&n,&t);   //输入行、列数,非零元素个数
  scanf( "%d,%d,%d ",&m,&n,&t);//输入行、列数,非零元素个数
  l=(struct   matnode   *)malloc(sizeof(struct   matnode));
  h[0]=l;//h[]是指针数组,分别指向头节点和行、列表头结点
  l-> row=m;   //建立十字链表头结点*l
  l-> col=n;
  s=m> n   ?   m:n;   //确定表头节点个数   s=max(m,n)
  for(i=1;i <=s;i++)//建立头节点循环链表
  {
    p=(struct   matnode   *)malloc(sizeof(struct   matnode));
    p-> row=p-> col=0;
    p-> down=p-> right=p;
    h[i]=p;
    h[i-1]-> tag.next=p;    
  }

  //最后一个行、列表头结点指向十字链表头节点
  h[s]-> tag.next=h[0];

  for(i=1;i <=t;i++)               //t为非零元素个数
  {
    printf( "\t   第%d个元素(行号m,列号n,值v): ",i);
    scanf( "%d,%d,%d ",&r,&c,&v);
    p=(struct   matnode   *)malloc(sizeof(struct   matnode));
    //生成一个非零表结点*p
    p-> row=r;
    p-> col=c;
    p-> tag.val=v;

                //以下是将*p结点插入第r行链表中
    q=h[r];   //取第r行表头结点
    while(q-> right!=h[r]&&q-> right-> col <c)
      q=q-> right;//在第r行中找第一个列号大于c的结点*(q-> right)
    //找不到时,*q是该行表上的尾结点
    p-> right=q-> right;
    q-> right=p;//*p插在*q之后

    //以下是将结点插入第c列链表中
    q=h[c];//取第c列表头结点
    while(q-> down!=h[c]&&q-> down-> row <r)
      q=q-> down;//在第c列中找第一个列号大于c的结点*(q-> down)
    //找不到时,*q是该列表上的尾结点
    p-> down=q-> down;
    q-> down=p;//*p插在*q之后
  }
  return(h[0]);
}
void   prmat(struct   matnode   *hm)
{
  struct   matnode   *p,*q;
  printf( "\n   按行表输出矩阵元素:\n ");
  printf( "row=%d   col=%d\n ",hm-> row,hm-> col);
  p=hm-> tag.next;
  while(p!=hm)
  {
    q=p-> right;
    while(p!=q)
    {
      printf( "\t   %d,%d,%d\n ",q-> row,q-> col,q-> tag.val);
      q=q-> right;
    }
    p=p-> tag.next;


  }
}

struct   matnode   *colpred(int   i,int   j,   struct   matnode   *h[])
//根据i(行号)和j(列号)找出矩阵第i行第j列的非零元素在十字链表中的前驱结点
{
  struct   matnode   *d;
  d=h[j];
  while(d-> down-> col!=0   &&   d-> down-> row <i)
    d=d-> down;
  return   (d);

}


//求矩阵相加的算法
struct   matnode   *addmat(struct   matnode   *ha,struct   matnode   *hb,struct   matnode   *h[])
{
  struct   matnode   *p,*q,*ca,*cb,*pa,*pb,*qa;
    if(ha-> row!=hb-> row||ha-> col!=hb-> col)
    {
      printf( "两个矩阵不是同类型的,不能相加!\n ");
      return   (0);
    }
    else
    {
      ca=ha-> tag.next;
      cb=hb-> tag.next;
      do
      {
        pa=ca-> right;
        pb=cb-> right;
        qa=ca;
        while(pb-> col!=0)
          if(pa-> col <pb-> col&&pa-> col!=0)
          {
            qa=pa;
            pa=pa-> right;
          }
          else
            if(pa-> col> pb-> col||pa-> col==0)
            {
              p=(struct   matnode*)malloc(sizeof(struct   matnode));
              *p=*pb;
              p-> right=pa;
              qa-> right=p;
              qa=p;
              q=colpred(p-> row,p-> col,h);
              p-> down=q-> down;
              q-> down=pa;
              pb=pb-> right;
            }
            else
            {
              pa-> tag.val+=pb-> tag.val;
              if(pa-> tag.val==0)
              {
                qa-> right=pa-> right;
                q=colpred(pa-> row,pa-> col,h);
                q-> down=pa-> down;
                free(pa);
              }
              else   qa=pa;
              pa=pa-> right;
              pb=cb-> right;
            }
            ca=ca-> tag.next;
            cb=cb-> tag.next;
      }while(ca-> row==0);


    }
    return   (h[0]);
}


void   main(void)
{
  struct   matnode   *hm,*hm1,*hm2;
  struct   matnode   *h[MAX],*h1[MAX];
  printf( "第一个矩阵:\n ");
    hm1=createmat(h);
  printf( "第二个矩阵:\n ");
    hm2=createmat(h1);
  hm=addmat(hm1,hm2,h);
  prmat(hm);
}  




[解决办法]
我在网吧上网没编译器所以没仔细看你的程序
应该是内存泄漏
[解决办法]
编译没问题,但程序有问题,很多结构体指针没有分配空间就使用了,仔细改一下吧。
createmat
[解决办法]
矩阵 起始下标有问题! 最好把十字链表的头接点h[0]改一下 ,找结点的前趋结点也内存越界

热点排行