求教:程序中有好多莫名其妙的错误,请高手赐教

dapeng630790557 2010-05-03 05:36:42

/*6.编写一个在十字链表按三元组表的形式打印输出。*/
#include<stdio.h>
#include<stdlib.h>

typedef struct OLNode
{
int row,col;
int value;
struct OLNode *right,*down;
}OLNode,*OLink;

typedef struct
{
OLink row_head,col_head;
int m,n,len;
}CrossList;

void CreateCrossList(CrossList *M)
{
int m,n,t;
printf("请输入稀疏矩阵的行数、列数、非零元素的个数:");
scanf("%d,%d,%d",&m,&n,&t);
M->m=m;
M->n=n;
M->len=t;
if(!(M->row_head=(OLink)malloc((m+1)sizeof(OLNode))))
{
printf("内存空间不足!");
goto end;
}
if(!(M->col_head=(OLink)malloc((n+1)sizeof(OLNode))))
{
printf("内存空间不足!");
goto end;
}
M->row_head[]=M->col_head[]=NULL;
for(scanf("%d,%d,%d",&m,&n,&t);m!=0;scanf("%d,%d,%d",&m,&n,&t))
{
OLink p,q;
if(!(p=(OLink)malloc(sizeof(OLNode))))
{
printf("内存空间不足!");
goto end;
}
p->row=m;p->col=n;p->value=t;
if(M->row_head[n]==NULL) M->row_head[n]=p;
else
{
for(q=M->row_head[n];q->right&&q->right->col<m;q=q->right);
p->right=q->right;
q->right=p;
}
if(M->col_head[m]==NULL) M->col_head[m]=p;
else
{
for(q=M->col_head[m];q->down&&q->down->row<n;q=q->down);
p->down=q->down;
q->down=p;
}
}
end:;
}

void printcrosslist(CrossList a)
{
int b;
OLink c;
printf("行号\t列号\t元素值\n");
for(b=1;b<=a.m;b++)
{
c=a.row_head+b;
while(c!=NULL)
{
printf("%d\t%d\t%d\n",c->row,c->col,c->value);
c=c->right;
}
}
}

int main()
{
CrossList A;
CreateCrossList(&A);
printcrosslist(A);
system("pause");
return 0;
}
...全文
123 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2010-05-04
  • 打赏
  • 举报
回复
十字链表可能是我所遇到过的最复杂的链表了。
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
dapeng630790557 2010-05-04
  • 打赏
  • 举报
回复

/*6.编写一个在十字链表按三元组表的形式打印输出。*/
#include<stdio.h>
#include<stdlib.h>

typedef struct OLNode
{
int row,col;
int value;
struct OLNode *right,*down;
}OLNode,*OLink;

typedef struct
{
OLink *row_head,*col_head;//OLNode 的指针的指针
int m,n,len;
}CrossList;

void CreateCrossList(CrossList *M)
{
int m,n,t,u;
printf("请输入稀疏矩阵的行数、列数、非零元素的个数(格式:m,n,tEnter):");
scanf("%d,%d,%d",&m,&n,&t);
M->m=m;
M->n=n;
M->len=t;
if(!(M->row_head=(OLink *)malloc(m*sizeof(OLink))))//分配m个OLink指针给M->row_head,分别指向行方向上的第一个元素
{
printf("内存空间不足!");
goto end;
}
if(!(M->col_head=(OLink *)malloc(n*sizeof(OLink))))
{
printf("内存空间不足!");
goto end;
}
for(t=0;t<m;t++)//书上写的是M->row_head[]=M->col_head[]=NULL;可是编译通不过
M->row_head[t]=NULL;
for(t=0;t<n;t++)
M->col_head[t]=NULL;
printf("请分别输入稀疏矩阵元素的行号、列号、元素值(格式:m,n,tEnter)\n");
for(u=0;u<M->len;u++)
{
do
{
scanf("%d,%d,%d",&m,&n,&t);
if(m<1||m>M->m||n<1||n>M->n||n==0)
printf("输入错误,请重新输入:");
}while(m<1||m>M->m||n<1||n>M->n||n==0);
OLink p,q;
if(!(p=(OLink)malloc(sizeof(OLNode))))
{
printf("内存空间不足!");
goto end;
}
p->row=m;p->col=n;p->value=t;
p->right=p->down=NULL;
if(M->row_head[m-1]==NULL)
M->row_head[m-1]=p;
else
{
for(q=M->row_head[m-1];q->right&&q->right->col<n;q=q->right);
p->right=q->right;
q->right=p;
}
if(M->col_head[n-1]==NULL)
M->col_head[n-1]=p;
else
{
for(q=M->col_head[n-1];q->down&&q->down->row<m;q=q->down);
p->down=q->down;
q->down=p;
}
}
end:;
}

void printcrosslist(CrossList a)
{
int b;
OLink c;
printf("行号\t列号\t元素值\n");
for(b=0;b<a.m;b++)
{
c=a.row_head[b];
while(c!=NULL)
{
printf("%d\t%d\t%d\n",c->row,c->col,c->value);
c=c->right;
}
}
}

int main()
{
CrossList A;
CreateCrossList(&A);
printcrosslist(A);
system("pause");
return 0;
}

谢谢大家了,这是最终的结果。我调试了,编译和结果都是正确的。
不过还是存在一些bug:这个十字链表可以接收同一行号列号的元素,暂时先不管了
dapeng630790557 2010-05-04
  • 打赏
  • 举报
回复

/*6.编写一个在十字链表按三元组表的形式打印输出。*/
#include<stdio.h>
#include<stdlib.h>

typedef struct OLNode
{
int row,col;
int value;
struct OLNode *right,*down;
}OLNode,*OLink;

typedef struct
{
OLink *row_head,*col_head;//OLNode 的指针的指针
int m,n,len;
}CrossList;

void CreateCrossList(CrossList *M)
{
int m,n,t,u;
printf("请输入稀疏矩阵的行数、列数、非零元素的个数(格式:m,n,tEnter):");
scanf("%d,%d,%d",&m,&n,&t);
M->m=m;
M->n=n;
M->len=t;
if(!(M->row_head=(OLink *)malloc(m*sizeof(OLink))))//分配m个OLink指针给M->row_head,分别指向行方向上的第一个元素
{
printf("内存空间不足!");
goto end;
}
if(!(M->col_head=(OLink *)malloc(n*sizeof(OLink))))
{
printf("内存空间不足!");
goto end;
}
for(t=0;t<m;t++)//书上写的是M->row_head[]=M->col_head[]=NULL;可是编译通不过
M->row_head[t]=NULL;
for(t=0;t<n;t++)
M->col_head[t]=NULL;
printf("请分别输入稀疏矩阵元素的行号、列号、元素值(格式:m,n,tEnter)\n");
for(u=0;u<M->len;u++)
{
do
{
scanf("%d,%d,%d",&m,&n,&t);
if(m<1||m>M->m||n<1||n>M->n||n==0)
printf("输入错误,请重新输入:");
}while(m<1||m>M->m||n<1||n>M->n||n==0);
OLink p,q;
if(!(p=(OLink)malloc(sizeof(OLNode))))
{
printf("内存空间不足!");
goto end;
}
p->row=m;p->col=n;p->value=t;
p->right=p->down=NULL;
if(M->row_head[m-1]==NULL)
M->row_head[m-1]=p;
else
{
for(q=M->row_head[m-1];q->right&&q->right->col<n;q=q->right);
p->right=q->right;
q->right=p;
}
if(M->col_head[n-1]==NULL)
M->col_head[n-1]=p;
else
{
for(q=M->col_head[n-1];q->down&&q->down->row<m;q=q->down);
p->down=q->down;
q->down=p;
}
}
end:;
}

void printcrosslist(CrossList a)
{
int b;
OLink c;
printf("行号\t列号\t元素值\n");
for(b=0;b<a.m;b++)
{
c=a.row_head[b];
while(c!=NULL)
{
printf("%d\t%d\t%d\n",c->row,c->col,c->value);
c=c->right;
}
}
}

int main()
{
CrossList A;
CreateCrossList(&A);
printcrosslist(A);
system("pause");
return 0;
}

谢谢大家了,这是最终的结果。我调试了,编译和结果都是正确的。
不过还是存在一些bug:这个十字链表可以接收同一行号列号的元素,暂时先不管了
luping303 2010-05-03
  • 打赏
  • 举报
回复
M->row_head=(OLink*)malloc((m+1)sizeof(OLNode))))
这句可以
if(!(M->row_head=(OLink)malloc((m+1)sizeof(OLNode))))
这句不可以
写错了
luping303 2010-05-03
  • 打赏
  • 举报
回复
我的可以编译啊!你按我的编译不了吗?

if(!(M->row_head=(OLink)malloc((m+1)sizeof(OLNode))))
你写的这句编译是可以的
你用什么编译的?

malloc((m+1)sizeof(OLNode))))
malloc返回的是一个(void*)的指针,你不能强制类型转化到一个结构体OLink,而是转化为指向这个结构体的指针
dapeng630790557 2010-05-03
  • 打赏
  • 举报
回复

/*6.编写一个在十字链表按三元组表的形式打印输出。*/
#include<stdio.h>
#include<stdlib.h>

typedef struct OLNode
{
int row,col;
int value;
struct OLNode *right,*down;
}OLNode,*OLink;

typedef struct
{
OLink *row_head,*col_head;
int m,n,len;
}CrossList;

void CreateCrossList(CrossList *M)
{
int m,n,t;
printf("请输入稀疏矩阵的行数、列数、非零元素的个数:");
scanf("%d,%d,%d",&m,&n,&t);
M->m=m;
M->n=n;
M->len=t;
if(!(M->row_head=(OLink *)malloc((m+1)sizeof(OLink))))
{
printf("内存空间不足!");
goto end;
}
if(!(M->col_head=(OLink *)malloc((n+1)sizeof(OLink))))
{
printf("内存空间不足!");
goto end;
}
M->row_head[]=M->col_head[]=NULL;
for(scanf("%d,%d,%d",&m,&n,&t);m!=0;scanf("%d,%d,%d",&m,&n,&t))
{
OLink p,q;
if(!(p=(OLink)malloc(sizeof(OLNode))))
{
printf("内存空间不足!");
goto end;
}
p->row=m;p->col=n;p->value=t;
if(M->row_head[n]==NULL) M->row_head[n]=p;
else
{
for(q=M->row_head[n];q->right&&q->right->col<m;q=q->right);
p->right=q->right;
q->right=p;
}
if(M->col_head[m]==NULL) M->col_head[m]=p;
else
{
for(q=M->col_head[m];q->down&&q->down->row<n;q=q->down);
p->down=q->down;
q->down=p;
}
}
end:;
}

void printcrosslist(CrossList a)
{
int b;
OLink c;
printf("行号\t列号\t元素值\n");
for(b=1;b<=a.m;b++)
{
c=a.row_head[b];
while(c!=NULL)
{
printf("%d\t%d\t%d\n",c->row,c->col,c->value);
c=c->right;
}
}
}

int main()
{
CrossList A;
CreateCrossList(&A);
printcrosslist(A);
system("pause");
return 0;
}

现在程序写到这儿了,还有三个错误
26 D:\Dev-Cpp\未命名1.cpp expected primary-expression before ')' token
26 D:\Dev-Cpp\未命名1.cpp expected `)' before "malloc"
31 D:\Dev-Cpp\未命名1.cpp expected `)' before "if"

定义的部分我觉得应该是定义成指针类型的,为什么定义成OLink * 呢?
还有第26行,我觉得应该是if(!(M->row_head=(OLink)malloc((m+1)sizeof(OLNode))))可是课本上写的是if(!(M->row_head=(OLink *)malloc((m+1)sizeof(OLink)))),我不知道是为什么,编译也不通过
luping303 2010-05-03
  • 打赏
  • 举报
回复
/*6.编写一个在十字链表按三元组表的形式打印输出。*/
#include<stdio.h>
#include<stdlib.h>

typedef struct OLNode
{
int row,col;
int value;
struct OLNode *right,*down;
}OLNode,*OLink;

typedef struct
{
OLink row_head,col_head;
int m,n,len;
}CrossList;

void CreateCrossList(CrossList *M)
{
int m,n,t;
printf("请输入稀疏矩阵的行数、列数、非零元素的个数:");
scanf("%d,%d,%d",&m,&n,&t);
M->m=m;
M->n=n;
M->len=t;
if(!(M->row_head=(OLink)malloc((m+1)*sizeof(OLNode))))
{
printf("内存空间不足!");
return;
}
if(!(M->col_head=(OLink)malloc((n+1)*sizeof(OLNode))))
{
printf("内存空间不足!");
return ;
}

for( int i = 0 ; i < m ; i++ )
M->row_head[i].right = NULL;
for( i = 0 ; i < n ; i++ )
M->col_head[i].down = NULL;

printf("请输入数据:( 输入m=-1结束输入)\n");
for(scanf("%d,%d,%d",&m,&n,&t);m!=-1;scanf("%d,%d,%d",&m,&n,&t))
{
if( m >= M->m )
{
printf("行号输入错误!");
continue;
}
if( n >= M->n )
{
printf("行号输入错误!");
continue;
}


OLink p,q;
if(!(p=(OLink)malloc(sizeof(OLNode))))
{
printf("内存空间不足!");
return;
}
p->row=m;p->col=n;p->value=t;
p->right = NULL;
p->down = NULL;

if(M->row_head[m].right==NULL)
{
M->row_head[m].right = p;
}
else
{
for(q=M->row_head[m].right;q->right!=NULL&&q->right->col<m;q=q->right);
p->right=q->right;
q->right=p;
}

if(M->col_head[n].down==NULL)
q= M->col_head[n].down=p;
else
{
for(q=M->col_head[n].down;q->down!=NULL&&q->down->row<n;q=q->down);
p->down=q->down;
q->down=p;
}
}
}

void printcrosslist(CrossList a)
{
int b;
OLink c;
printf("行号\t列号\t元素值\n");
for(b=0;b<a.m;b++)
{
c=a.row_head+b;
while(c->right!=NULL)
{
c=c->right;
printf("%d\t%d\t%d\n",c->row,c->col,c->value);

}
}
}

int main()
{
CrossList *A = (CrossList*) malloc( sizeof( CrossList ) );
CreateCrossList(A);
printcrosslist(*A);
system("pause");
return 0;
}
xinzaiyiqi 2010-05-03
  • 打赏
  • 举报
回复
  M->row_head[]=M->col_head[]=NULL;

这句是初始化,结合其他可以看出row_head[]的值是OLink类型的,所以row_head应该是OLink *类型的
LZ的
OLink row_head,col_head;

定义有问题吧
dapeng630790557 2010-05-03
  • 打赏
  • 举报
回复
2楼,OLink本身就是一个指针标识,=OLNode *
3楼的我试了,还是不行啊
xinzaiyiqi 2010-05-03
  • 打赏
  • 举报
回复
 if(!(M->row_head=(OLink)malloc((m+1)sizeof(OLNode))))

感觉这句有点别扭,改为

M->row_head=(OLink)malloc((m+1)sizeof(OLNode));
if(M->row_head==NULL){
printf("内存空间不足!");
goto end;
}
}

试试吧
jay1002008 2010-05-03
  • 打赏
  • 举报
回复
if(!(M->row_head=(OLink)malloc((m+1)sizeof(OLNode))))
里面*号呢?
hoya5121 2010-05-03
  • 打赏
  • 举报
回复
坐等楼主被教育

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧