动态数据结构,预留

时间:2016-01-18 08:33:07

标签: c

我正在用C编写我的第一个更严肃的程序而且我被卡住了。我需要将此列表排序为不同的单独文件,因此它看起来像这样:

BE30B Berlin 2014-04-02 Gale 02
BE30B Berlin 2014-04-02 Dobbs 15
OS43K Oslo 2014-04-03 Malik 34
BE30B Berlin 2014-04-02 Hatton 09
OS43K Oslo 2014-04-03 Lowe 21
OS43K Oslo 2014-04-03 Smith 03
BE30B Berlin 2014-04-02 Chapman 13
OS43K Oslo 2014-04-03 Murphy 41
BE30B Berlin 2014-04-02 Dawkins 19

输出:

BE30B.txt
Berlin 2014-04-02

02 Gale
09 Hatton
13 Chapman
15 Dobbs
19 Dawkins

我不知道如何开始写它。我不太擅长编程,我通常做html / css。我的功能目前看起来像这样,它会在屏幕上打印整个列表。

struct Booking // creating a structure 
{
    char number[6];
    char dest[30];
    char date[11];
    char name[20];
    int seat;
};


struct Bkg
{
    struct Booking res;
    struct Bkg *next;
};

struct Bkg *head = NULL;

void add_on_top( char* argnumber, char* argdest, char* argdate, char* argname, int argseat)
{
    struct Bkg *temp=(struct Bkg*) malloc (sizeof(struct Bkg));

    strcpy(temp->res.number, argnumber);
    strcpy(temp->res.dest, argdest);
    strcpy(temp->res.date, argdate);
    strcpy(temp->res.name, argname);
    temp->res.seat = argseat;

    temp->next = head;
    head = temp;

}

void insert( char* argnumber, char* argdest, char* argdate, char* argname, int argseat)
{

    struct Bkg *head1 = head;
    if (head != NULL) {

        while (head1->next != NULL)
        {
            head1 = head1->next;
        }
        struct Bkg *temp = (struct Bkg*) malloc (sizeof(struct Bkg));
        strcpy(temp->res.number, argnumber);
        strcpy(temp->res.dest, argdest);
        strcpy(temp->res.date, argdate);
        strcpy(temp->res.name, argname);
        temp->res.seat = argseat;
        temp->next = NULL;
        head1->next = temp;

    }

    else
        add_on_top( argnumber, argdest, argdate, argname, argseat);
}

如果有人可以帮助我,我会非常感激。我只是不知道如何用符号对它进行排序,我可以做其余的事情。

符号是航班号:BE30B。

我没有添加main,因为那里没有太多东西,我有struct Booking temp;,我打开一个带有预留的文件并阅读它,然后使用函数fscanf处理它并使用我的函数insert(temp.number, temp.dest, temp.date, temp.name, temp.seat);

用C语言编写代码不是我的选择,这是我学校仅在本学期才需要的。

1 个答案:

答案 0 :(得分:0)

开始使用:

定义结构

struct flight 
{
    char flightNumber[6];
    char destinationCity[30];
    char flightDate[11];
    char passengerName[30];
    unsigned passengerNumber;
}

使用struct flight数组

struct flight Flights[20];

打开源文件进行读取,请务必添加错误检查

FILE *fp = NULL;
fp = fopen( "inputfile.txt", "r" );

使用以下方法从文件中读取一行:

char *buffer = NULL;
size_t length = 0;

// loop through file
int recNum = 0;
while( -1 != getline( &buffer, &length, fp ) ) 

解析字段

char *token = NULL;
token = strtok( buffer, " " ); //< add error checking for each call to strtok
strcpy( Flights[ recNum ].flightNumber, token );

token = strtok( NULL, " " );
strcpy( Flights[ recNum ].destinationCity, token );

token = strtok( NULL, " " );
strcpy( Flights[ recNum ].flightDate, token );

token = strtok( NULL, " " );
strcpy( Flights[ recNum ].passengerName, token );

token = strtok( NULL, " " );
Flights[ recNum ].passengerNumber = atoi(token);

recNum++;

结束输入循环

排序列表,首先在passengerNumber字段上排序,然后在flightNumber上再次排序

(一个简单的冒泡排序适用于这么少的条目。你可以在互联网上搜索算法)

在循环中,打印输出

  1. 其中flightNumber的更改导致使用第一行输出格式
  2. 然后打印passengerName + passengeNumber行输出格式
  3. 清理

    fclose( fp );
    

    对于大型输入文件,这可能无法很好地扩展,其中Flights []最好声明为:

    struct flight **Flights = NULL;  
    

    并使用realloc()获取指向struct flight

    指针数组的内存

    并使用malloc()获取struct flight的每个实例的实际内存区域

    如果使用内存分配函数,为了提高效率,请跟踪数组中使用的条目数以及填充时的条目数。这最大限度地减少了对realloc()的调用次数,这一点非常重要,因为每次调用realloc()都会导致整个数组被复制。