C语言 结构的重构


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++;

最新更新