一个小问题求指教

Hhcz_2419948234 2017-11-22 09:58:30
#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define TRUE 1
#define ERROR 0
#define FALSE 0
#define OVERFLOW -1

typedef int Status;

typedef struct OLNode { /* struct of Node */
int i,j;
int e;
struct OLNode *right,*down;
} OLNode,*OLink;

typedef struct { /* struct of CrossList */
OLink *rhead,*chead;
int mu,nu,tu; /* the number of row,col and non-zero number */
} CrossList;

Status CreateSMatrix_OL(CrossList *M);
Status PrintSMatrix_OL(CrossList M);

Status CreateSMatrix_OL(CrossList *M) /* Create the CrossList M */
{
int m,n,t,i,j,e,k;
OLNode *p,*q;

if(M) free(M);
scanf("%d,%d,%d",&m,&n,&t); /* input the M's row,col and non-zero's number */

M->mu=m;
M->nu=n;
M->tu=t;

M->rhead=(OLink*)malloc(sizeof(OLNode)*(m+1));
if(!M->rhead)
exit(OVERFLOW);

M->chead=(OLink*)malloc(sizeof(OLNode)*(n+1));
if(!M->chead)
exit(OVERFLOW);

for(k=0;k<m+1;k++) /* init the pointer to null */
M->rhead[k]=NULL;
for(k=0;k<n+1;k++)
M->chead[k]=NULL;

for(scanf("%d,%d,%d",&i,&j,&e);i!=0;scanf("%d,%d,%d",&i,&j,&e)) 这个for无法跳出,查了很多次了,求解
{ /* input the non-zero's info */
p=(OLNode*)malloc(sizeof(OLNode));

if(!p) exit(OVERFLOW);

p->i=i;
p->j=j;
p->e=e;
p->right=NULL;
p->down=NULL; /* create the Node */

if(M->rhead[i]==NULL || M->rhead[i]->j>j)
{
p->right=M->rhead[i];
M->rhead[i]=p;
}
else
{ /* find the row position to insert */
for(q=M->rhead[i];(q->right) && q->right->j<j;q=q->right);
p->right=q->right;
q->right=p;
} /* finish the insert */

if(M->chead[j]==NULL || M->chead[j]->i>i)
{
p->down=M->chead[j];
M->chead[j]=p;
}
else
{ /* find the col position to insert*/
for(q=M->chead[j];(q->down) && q->down->i<i;q=q->down);
p->down=q->down;
q->down=p;
} /* finish insert */
}

return OK;
} /* CreatrSMatrix_OL */

Status PrintSMatrix_OL(CrossList M) /* Print the non-zero information */
{
int i;
OLNode *p;
/* output the elem */
printf(" i j e ");
printf("---------");
for(i=1;i<=M.mu;i++)
{
p=M.rhead[i];
if(!p)
{
p=p->right;
printf("\n %2d %2d %2d ",p->i,p->j,p->e);
}
}
return OK;
}/* PrintSMatrix */

int main (void)
{
CrossList M;
clrscr();

CreateSMatrix_OL(&M);
PrintSMatrix_OL(M);

return 0;
}
...全文
118 9 1 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
paschen 2017-11-23
循环退不出来时,中断下来,单步跟踪程序运行,观察程序流程及变量怎么变化,分析原因
  • 打赏
  • 举报
回复
自信男孩 2017-11-23
代码逻辑不好理解,i, j, k一般都是用于循环变量,这基本上是大家的共识了。如果用于普通变量或者结构体成员,就不很好理解了,代码的可读性就会降低;
  • 打赏
  • 举报
回复
自信男孩 2017-11-23
引用 5 楼 hdt 的回复:
问题多多,那个循环先不说 main函数里调用 CreateSMatrix_OL(&M); 进入到 Status CreateSMatrix_OL(CrossList *M) /* Create the CrossList M */ { int m,n,t,i,j,e,k; OLNode *p,*q; if(M) free(M);//这里,你把一个指向栈上的指针free掉了
free是对应malloc/realloc/calloc的,除这三个申请的堆上空间,其他方式申请的,不能调用free; 还有问题:
//M->rhead=(OLink*)malloc(sizeof(OLNode)*(m+1));
    M->rhead=(OLink*)malloc(sizeof(OLink)*(m+1));
    if(!M->rhead)
        exit(OVERFLOW);

    //M->chead=(OLink*)malloc(sizeof(OLNode)*(n+1));
    M->chead=(OLink*)malloc(sizeof(OLink)*(n+1));
    if(!M->chead)
        exit(OVERFLOW);
申请的空间不对 循环出不去,很可能死循环了,死循环不是在外边的for循环,而应该是内部的循环,内部还有两个循环,建议通过调试打印看一下内部的连个循环那个是死循环;
  • 打赏
  • 举报
回复
赵4老师 2017-11-23
for (A;B;C) D;
//等价于
{
 A;
 while (1) {
  if (!(B)) break;
  D;
  C;
 }
}
输入0,0,0退出循环
  • 打赏
  • 举报
回复
Hhcz_2419948234 2017-11-23
然后那个循环呢?
  • 打赏
  • 举报
回复
问题多多,那个循环先不说 main函数里调用 CreateSMatrix_OL(&M); 进入到 Status CreateSMatrix_OL(CrossList *M) /* Create the CrossList M */ { int m,n,t,i,j,e,k; OLNode *p,*q; if(M) free(M);//这里,你把一个指向栈上的指针free掉了
  • 打赏
  • 举报
回复
Hhcz_2419948234 2017-11-23
用过单步跟踪。就是未发现
  • 打赏
  • 举报
回复
qq_41146587 2017-11-22
表示觉得没什么问题
  • 打赏
  • 举报
回复
Hhcz_2419948234 2017-11-22
积分不够很尴尬
  • 打赏
  • 举报
回复
相关推荐
发帖
C语言
加入

6.5w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2017-11-22 09:58
社区公告
暂无公告