c语言高手帮忙下,看看下面这个程序哪里出错

2024-11-27 14:40:43
推荐回答(2个)
回答1:

先看看我改后的运行可以对不对。。比较下两者有什么区别。
其实就是将你第一个函数的原型
Status InitTriplet(Triplet T,ElemType v1,ElemType v2,ElemType v3)
改为
Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3);

其它的地方都不需要动一个字,你自己试试吧。。。

#include
#include
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int *Triplet;
typedef int ElemType;

//主要看看这个程序,第一个参数我改成了引用,而你之前的只是一个普通的参数,即使你在后面T=(int *)malloc(3*sizeof(int)); 但想想,它只是一个形参,你主程序中的T并没有被复制,自然出现了错误,其实就是这个一个小小的地方。
Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3)
{
T=(int *)malloc(3*sizeof(int));
if(!T)
exit(OVERFLOW);
T[0]=v1;
T[1]=v2;
T[2]=v3;
return OK;
}
Status Get(Triplet T,ElemType i,ElemType e)
{
if(i<1||i>3)
return ERROR;
e=T[i-1];
return e;
}
Status Put(Triplet T,ElemType i,ElemType e)
{
if(i<1||i>3)
return ERROR;
T[i-1]=e;
return T[i-1];
}
void IsAscending(Triplet T)
{
if(T[0]<=T[1]&&T[1]<=T[2])
printf("是升序!\n");
else
printf("不是升序!\n");
}
void IsDescending(Triplet T)
{
if(T[0]>=T[1]&&T[1]>=T[2])
printf("是降序!\n");
else
printf("不是降序!\n");
}
Status Max(Triplet T,ElemType e)
{
e=(T[0]>=T[1])?((T[0]>=T[2])?T[0]:T[2]):((T[1]>=T[2])?T[1]:T[2]);
return e;
}
Status Min(Triplet T,ElemType e)
{
e=(T[0]<=T[1])?((T[0]<=T[2])?T[0]:T[2]):((T[1]<=T[2])?T[1]:T[2]);
return e;
}
int main()
{
ElemType v1,v2,v3,i,e1,e2,e3,e4;

Triplet T=NULL;

e1=e3=e4=0;

printf("请输入v1,v2,v3的值:\n");

scanf("%d %d %d",&v1,&v2,&v3);

printf("请输入i,e2的值:\n");

scanf("%d %d",&i,&e2);

InitTriplet(T,v1,v2,v3);
printf("a\n");

printf("T的第i元的值是:%d\n",Get(T,i,e1));

printf("T的第i元的值被换为e2:%d\n",Put(T,i,e2));

IsAscending(T);

IsDescending(T);

printf("T的最大元素的值是:%d\n",Max(T,e3));

printf("T的最小元素的值是:%d\n",Min(T,e4));
system("PAUSE");
return 0;
}

回答2:

貌似用malloc分配内存以后,是不能更改内容的,就是说赋值以后不能改变了,只能重新分配,再赋值。