哪位高手能给解释一下下面一段程序为什么在wintc和tc下能正确运行,但是在vc6.0和vs2008下总是无法运行?
哪位高手能给解释一下下面一段程序为什么在wintc和tc下能正确编译和运行,但是在vc6.0和vs2008下能编译却总是无法运行,提示关于内存的什么问题??#includ...
哪位高手能给解释一下下面一段程序为什么在wintc和tc下能正确编译和运行,但是在vc6.0和vs2008下能编译却总是无法运行,提示关于内存的什么问题??
# include<stdlib.h>
# include<stdio.h>
# define OK 1
# define ERROR 0
# define TRUE 1
# define FALSE 0
# define OVERFLOW -2
typedef int ElemType;
typedef int Status;
# define LIST_INTS_SIZE 100/*线性表存储空间的初始分配量*/
# define LISTINCREMENT 10 /*线性表存储空间的分配增量*/
typedef struct{
ElemType *elem;/*储存空间基址*/
int length;/*当前长度*/
int listsize;/*当前分配的储存容量(以sizeof(ElemType)为单位)*/
}SqList;/*SqList*/
Status InitList(SqList *L) {
/*构造一个空的线性表*/
L->elem = (int*)malloc(LIST_INTS_SIZE*sizeof(int) );
if(!L->elem){
printf("线性表空间分配失败");
exit(OVERFLOW);
}
L->length=0;
L->listsize = LIST_INTS_SIZE;
return OK;
}
Status PlusList(SqList *L){
/*向线性表中加入元素*/
int i,n,a;
InitList(L);
printf("how much num do you want to scan:");scanf("%d",&n); /*确定插入线性表元素个数*/
for(i=1;i<=n;i++)
{
printf("please scan %d num:",i);
scanf("%d",&a);
ListInsert(L,i,a);
}
return OK;
}
Status ListInsert(SqList *L,int i,ElemType e){
/*在顺序线性表L中i个位置之前插入新的元素*/
/*i的合法值为1<=i<=ListLength_Sq(L)+1*/
int *newbase;
int *p,*q;
if (i<1||i>L->length+1)
return ERROR; /*i值不合法*/
if (L->length>=L->listsize){
/*当前存储空间已满,增加分配空间*/
newbase=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if (!newbase) /*存储空间分配失败*/
exit(OVERFLOW);
L->elem=newbase; /*新基址*/
L->listsize+=LISTINCREMENT; /*增加储存容量*/
}
q=&(L->elem[i-1]); /*q为插入位置*/
for (p=&(L->elem[L->length-1]);p>=q;--p)
*(p+1)=*p; /*插入位置及之后的元素右移*/
*q=e; /*插入e*/
++L->length; /*表长增加1*/
return OK;
}
Status listlength(SqList*L){
/*求出线性表的长度*/
return L->length;
}
void main()
{
SqList *La;
ElemType *p,*q,*h;
int n,i,t;
InitList(La);
PlusList(La);
printf("you scan the linear_list:\n");
for (h=La->elem;h<=(La->elem+La->length-1);h++)
printf("%-5d",*h);
printf("\n");
p=La->elem;
q=La->elem+La->length-1;
if (La->length%2==0)
n=La->length/2;
else
{
n=La->length-1;
n=n/2;
}
for(i=1;i<=n;p++,q--,i++)
{
t=*p;
*p=*q;
*q=t;
}
printf("the linear_list has been converted :\n");
for (h=La->elem;h<=(La->elem+La->length-1);h++)
printf("%-5d",*h);
printf("\n");
getch();
} 展开
# include<stdlib.h>
# include<stdio.h>
# define OK 1
# define ERROR 0
# define TRUE 1
# define FALSE 0
# define OVERFLOW -2
typedef int ElemType;
typedef int Status;
# define LIST_INTS_SIZE 100/*线性表存储空间的初始分配量*/
# define LISTINCREMENT 10 /*线性表存储空间的分配增量*/
typedef struct{
ElemType *elem;/*储存空间基址*/
int length;/*当前长度*/
int listsize;/*当前分配的储存容量(以sizeof(ElemType)为单位)*/
}SqList;/*SqList*/
Status InitList(SqList *L) {
/*构造一个空的线性表*/
L->elem = (int*)malloc(LIST_INTS_SIZE*sizeof(int) );
if(!L->elem){
printf("线性表空间分配失败");
exit(OVERFLOW);
}
L->length=0;
L->listsize = LIST_INTS_SIZE;
return OK;
}
Status PlusList(SqList *L){
/*向线性表中加入元素*/
int i,n,a;
InitList(L);
printf("how much num do you want to scan:");scanf("%d",&n); /*确定插入线性表元素个数*/
for(i=1;i<=n;i++)
{
printf("please scan %d num:",i);
scanf("%d",&a);
ListInsert(L,i,a);
}
return OK;
}
Status ListInsert(SqList *L,int i,ElemType e){
/*在顺序线性表L中i个位置之前插入新的元素*/
/*i的合法值为1<=i<=ListLength_Sq(L)+1*/
int *newbase;
int *p,*q;
if (i<1||i>L->length+1)
return ERROR; /*i值不合法*/
if (L->length>=L->listsize){
/*当前存储空间已满,增加分配空间*/
newbase=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if (!newbase) /*存储空间分配失败*/
exit(OVERFLOW);
L->elem=newbase; /*新基址*/
L->listsize+=LISTINCREMENT; /*增加储存容量*/
}
q=&(L->elem[i-1]); /*q为插入位置*/
for (p=&(L->elem[L->length-1]);p>=q;--p)
*(p+1)=*p; /*插入位置及之后的元素右移*/
*q=e; /*插入e*/
++L->length; /*表长增加1*/
return OK;
}
Status listlength(SqList*L){
/*求出线性表的长度*/
return L->length;
}
void main()
{
SqList *La;
ElemType *p,*q,*h;
int n,i,t;
InitList(La);
PlusList(La);
printf("you scan the linear_list:\n");
for (h=La->elem;h<=(La->elem+La->length-1);h++)
printf("%-5d",*h);
printf("\n");
p=La->elem;
q=La->elem+La->length-1;
if (La->length%2==0)
n=La->length/2;
else
{
n=La->length-1;
n=n/2;
}
for(i=1;i<=n;p++,q--,i++)
{
t=*p;
*p=*q;
*q=t;
}
printf("the linear_list has been converted :\n");
for (h=La->elem;h<=(La->elem+La->length-1);h++)
printf("%-5d",*h);
printf("\n");
getch();
} 展开
1个回答
展开全部
VC编译器要求比之前两个都更为严格,三个问题:
1.调用一个函数时,必须保证其可见性。Insert函数必须在调用它之前被定义
2.getch()改为getchar()
3.分配空间时形参和实参不是一个变量,所以要分配La的空间要在主函数中完成。改过之后如下
# include<stdlib.h>
# include<stdio.h>
# define OK 1
# define ERROR 0
# define TRUE 1
# define FALSE 0
# define OVERFLOW -2
typedef int ElemType;
typedef int Status;
# define LIST_INTS_SIZE 100/*线性表存储空间的初始分配量*/
# define LISTINCREMENT 10 /*线性表存储空间的分配增量*/
typedef struct{
ElemType *elem;/*储存空间基址*/
int length;/*当前长度*/
int listsize;/*当前分配的储存容量(以sizeof(ElemType)为单位)*/
}SqList;/*SqList*/
Status InitList(SqList *L) {
/*构造一个空的线性表*/
// L->elem = (int*)malloc(LIST_INTS_SIZE*sizeof(int) );
if(!L->elem){
printf("线性表空间分配失败");
exit(OVERFLOW);
}
L->length=0;
L->listsize = LIST_INTS_SIZE;
return OK;
}
Status ListInsert(SqList *L,int i,ElemType e){
/*在顺序线性表L中i个位置之前插入新的元素*/
/*i的合法值为1<=i<=ListLength_Sq(L)+1*/
int *newbase;
int *p,*q;
if (i<1||i>L->length+1)
return ERROR; /*i值不合法*/
if (L->length>=L->listsize){
/*当前存储空间已满,增加分配空间*/
newbase=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if (!newbase) /*存储空间分配失败*/
exit(OVERFLOW);
L->elem=newbase; /*新基址*/
L->listsize+=LISTINCREMENT; /*增加储存容量*/
}
q=&(L->elem[i-1]); /*q为插入位置*/
for (p=&(L->elem[L->length-1]);p>=q;--p)
*(p+1)=*p; /*插入位置及之后的元素右移*/
*q=e; /*插入e*/
++L->length; /*表长增加1*/
return OK;
}
Status PlusList(SqList *L){
/*向线性表中加入元素*/
int i,n,a;
InitList(L);
printf("how much num do you want to scan:");scanf("%d",&n); /*确定插入线性表元素个数*/
for(i=1;i<=n;i++)
{
printf("please scan %d num:",i);
scanf("%d",&a);
ListInsert(L,i,a);
}
return OK;
}
Status listlength(SqList*L){
/*求出线性表的长度*/
return L->length;
}
void main()
{
SqList *La=NULL;
ElemType *p,*q,*h;
int n,i,t;
La=(SqList*)malloc(sizeof(SqList));
InitList(La);
PlusList(La);
printf("you scan the linear_list:\n");
for (h=La->elem;h<=(La->elem+La->length-1);h++)
printf("%-5d",*h);
printf("\n");
p=La->elem;
q=La->elem+La->length-1;
if (La->length%2==0)
n=La->length/2;
else
{
n=La->length-1;
n=n/2;
}
for(i=1;i<=n;p++,q--,i++)
{
t=*p;
*p=*q;
*q=t;
}
printf("the linear_list has been converted :\n");
for (h=La->elem;h<=(La->elem+La->length-1);h++)
printf("%-5d",*h);
printf("\n");
getchar();
}
1.调用一个函数时,必须保证其可见性。Insert函数必须在调用它之前被定义
2.getch()改为getchar()
3.分配空间时形参和实参不是一个变量,所以要分配La的空间要在主函数中完成。改过之后如下
# include<stdlib.h>
# include<stdio.h>
# define OK 1
# define ERROR 0
# define TRUE 1
# define FALSE 0
# define OVERFLOW -2
typedef int ElemType;
typedef int Status;
# define LIST_INTS_SIZE 100/*线性表存储空间的初始分配量*/
# define LISTINCREMENT 10 /*线性表存储空间的分配增量*/
typedef struct{
ElemType *elem;/*储存空间基址*/
int length;/*当前长度*/
int listsize;/*当前分配的储存容量(以sizeof(ElemType)为单位)*/
}SqList;/*SqList*/
Status InitList(SqList *L) {
/*构造一个空的线性表*/
// L->elem = (int*)malloc(LIST_INTS_SIZE*sizeof(int) );
if(!L->elem){
printf("线性表空间分配失败");
exit(OVERFLOW);
}
L->length=0;
L->listsize = LIST_INTS_SIZE;
return OK;
}
Status ListInsert(SqList *L,int i,ElemType e){
/*在顺序线性表L中i个位置之前插入新的元素*/
/*i的合法值为1<=i<=ListLength_Sq(L)+1*/
int *newbase;
int *p,*q;
if (i<1||i>L->length+1)
return ERROR; /*i值不合法*/
if (L->length>=L->listsize){
/*当前存储空间已满,增加分配空间*/
newbase=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if (!newbase) /*存储空间分配失败*/
exit(OVERFLOW);
L->elem=newbase; /*新基址*/
L->listsize+=LISTINCREMENT; /*增加储存容量*/
}
q=&(L->elem[i-1]); /*q为插入位置*/
for (p=&(L->elem[L->length-1]);p>=q;--p)
*(p+1)=*p; /*插入位置及之后的元素右移*/
*q=e; /*插入e*/
++L->length; /*表长增加1*/
return OK;
}
Status PlusList(SqList *L){
/*向线性表中加入元素*/
int i,n,a;
InitList(L);
printf("how much num do you want to scan:");scanf("%d",&n); /*确定插入线性表元素个数*/
for(i=1;i<=n;i++)
{
printf("please scan %d num:",i);
scanf("%d",&a);
ListInsert(L,i,a);
}
return OK;
}
Status listlength(SqList*L){
/*求出线性表的长度*/
return L->length;
}
void main()
{
SqList *La=NULL;
ElemType *p,*q,*h;
int n,i,t;
La=(SqList*)malloc(sizeof(SqList));
InitList(La);
PlusList(La);
printf("you scan the linear_list:\n");
for (h=La->elem;h<=(La->elem+La->length-1);h++)
printf("%-5d",*h);
printf("\n");
p=La->elem;
q=La->elem+La->length-1;
if (La->length%2==0)
n=La->length/2;
else
{
n=La->length-1;
n=n/2;
}
for(i=1;i<=n;p++,q--,i++)
{
t=*p;
*p=*q;
*q=t;
}
printf("the linear_list has been converted :\n");
for (h=La->elem;h<=(La->elem+La->length-1);h++)
printf("%-5d",*h);
printf("\n");
getchar();
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询