繁体   English   中英

使用动态分配(malloc 或 calloc)在具有不同座位数的几辆公共汽车中预留座位的程序

[英]Program that reserves a seats in a few buses with various number of seats using dynamic allocation (malloc or calloc)

我必须制作一个程序,在几辆公共汽车上预留座位(每辆公共汽车都有不同数量的座位)。 我必须使用 malloc 或 calloc。 它必须存储有关姓名和姓氏的信息并将其分配给座位。 当座位已经被占用时,它必须提供“座位已被占用”的信息。 它还必须进行错误处理。 我是初学者,我不知道该怎么做。

#include <stdlib.h>

#define max_name 32

int main()
{

    int n_buses,n_seats,zm;
    char*** tab;
    printf("Number of buses:");
    scanf("%d", &n_buses);

    tab=calloc(n_buses,sizeof(char**));

    for(int i=0;i<n_buses;i++)
    {
        printf("Number of seats in bus %d: ", i+1);
        scanf("%d", &zm);

        tab[i]=calloc(zm,sizeof(char*));
    }

    for(int i=0;i<n_buses;i++)
    {
        for(j=0;j<max_name;j++)
        {
            tab[i][j]=calloc(max_name,sizeof(char));
        }
    }
 for(i=0;i<n_buses;i++)
    {
        if(tab[i]) free(tab[i]);
    }

    if(tab) free(tab);

    return 0;
}```

从这个指针到指针到指针退后一步,考虑一下什么可以使数据类型易于使用。 你有公共汽车、座位和乘客,所以有几个结构来处理抽象是有意义的:

typedef struct
{
  char* forename;
  char* lastname;
} passenger_t;

typedef struct
{
  int total_seats;
  passenger_t seat[];
} bus_t;

最后一个结构使用一种称为灵活数组成员的技巧来允许在结构的末尾使用可变大小的数组。 您将为其分配 memory 为:

int seats = 100;
bus_t* my_bus = calloc( seats, sizeof(*my_bus) + sizeof(passenger_t[seats]) );
if(my_bus == NULL) { /* handle errors */ }

my_bus->total_seats = seats;

现在每个座位都由seat数组中分配的passenger_t _t 项目表示,每个项目都有两个指针,由calloc设置为 null(malloc 不会将它们设置为 null)。 您可以使用它来跟踪座位是空闲还是占用。

添加乘客:

if(n >= my_bus->total_seats)  // check that input is valid
{ 
  /* error handling */
}

if(my_bus->seat[n].forename != NULL)
{
  my_bus->seat[n].forename = ... /* allocate room for forename then strcpy to it*/

  my_bus->seat[n].lastname = ... /* allocate room for lastname then strcpy to it*/
}

注意我们这里只有一个数组和一级间接,所以这段代码更容易阅读和维护。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM