typedef struct dvdtype{
int dvdcode;
char title[50];
int customerID;
int daysowned;
}dvdtype;
typedef struct dvdstruct{
dvdtype *dvd;
int numdvds;
}dvdstruct;
void initDvds(dvdstruct *dvds);
int displayMainMenu();
void insertMovie(dvdstruct *dvds,int *n);
void initDvds(dvdstruct *dvds)
{
int i;
dvds->dvd=(dvdtype*)malloc(5*sizeof(dvdtype));
if(dvds->dvd==NULL){
printf("not enough memoryn");
exit(1);
}
dvds->numdvds=0;
for(i=0;i<5;i++)
{
dvds->dvd[i].customerID=-1;
dvds->dvd[i].daysowned=-1;
dvds->dvd[i].dvdcode=-1;
dvds->dvd[i].title[0]=' ';
}
}
void insertMovie(dvdstruct *dvds,int *n){
int code;
if(dvds->numdvds>=(*n))
{
dvds->numdvds++;
dvds->dvd=realloc(dvds->dvd,(dvds->numdvds)*sizeof(dvdtype));
if(dvds->dvd==NULL){
printf("not enough memoryn");
exit(1);
}
printf(" realloc succesful,size now is :%d n",dvds->numdvds);
dvds->dvd[dvds->numdvds].customerID=-1;
dvds->dvd[dvds->numdvds].daysowned=-1;
printf("give code and name of movie n");
scanf("%dn",&code);
dvds->dvd[dvds->numdvds].dvdcode=code;
gets(dvds->dvd[dvds->numdvds].title);
}
else
{
printf("give code and name of movie n");
scanf("%dn",&code);
dvds->dvd[dvds->numdvds].dvdcode=code;
gets(dvds->dvd[dvds->numdvds].title);
dvds->numdvds++;
}
}
我编写了这个程序来制作电影列表。通过inidvds
的功能,我用malloc
为5张dvd"腾出空间"并进行初始化。然后,用户调用insertmovie
函数将影片插入到文件中。
老师要我们做以下事情。如果用户提供了5张dvd(这是我们从一开始就想要的大小),调用函数realloc
并为另外1张dvd腾出空间。这是可行的,我的意思是,当我给5部电影时,这是可以的。我有一个选择打印电影,它打印所有5部电影。然后,如果我选择再次添加movie (n=5),它将转到if并且必须执行realloc
函数。
我把这个
printf(" malloc successful,size now is :%d n",dvds->numdvds);
所以我可以看看它是否转到realloc
。它打印:
malloc是成功的,新的大小为6
,它要求我给出我们想要的电影代码和名称。我给出代码和名称,然后再次打印列表。它打印了我给出的前5部电影但是它不打印第6部电影
例如:Dvdcode is 5
dvd name is: tarzan
Customer id is: -1(the initialized value)
假设这是我给出的第五部电影。那么第六个是这样的
Dvdcode is 0
dvd name is:
Customer id is: 0
(Dvd name is empty)
那是什么意思?realloc
不工作?
C中的数组是基于0
的,即第一个元素是array[0]
,第二个是array[1]
,以此类推。
insertMovie()
:
if(dvds->numdvds>=(*n))
{
dvds->numdvds++;
dvds->dvd=realloc(dvds->dvd,(dvds->numdvds)*sizeof(dvdtype));
if(dvds->dvd==NULL){
printf("not enough memoryn");
exit(1);
}
printf(" realloc succesful,size now is :%d n",dvds->numdvds);
dvds->dvd[dvds->numdvds].customerID=-1;
dvds->dvd[dvds->numdvds].daysowned=-1;
printf("give code and name of movie n");
scanf("%dn",&code);
dvds->dvd[dvds->numdvds].dvdcode=code;
gets(dvds->dvd[dvds->numdvds].title);
应: if(dvds->numdvds>=(*n))
{
dvds->dvd=realloc(dvds->dvd,(dvds->numdvds + 1)*sizeof(dvdtype));
if(dvds->dvd==NULL){
printf("not enough memoryn");
exit(1);
}
printf(" realloc succesful,size now is :%d n",dvds->numdvds + 1);
dvds->dvd[dvds->numdvds].customerID=-1;
dvds->dvd[dvds->numdvds].daysowned=-1;
printf("give code and name of movie n");
scanf("%dn",&code);
dvds->dvd[dvds->numdvds].dvdcode=code;
gets(dvds->dvd[dvds->numdvds].title);
dvds->numdvds++;