我正在用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语言编写代码不是我的选择,这是我学校仅在本学期才需要的。
答案 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上再次排序
(一个简单的冒泡排序适用于这么少的条目。你可以在互联网上搜索算法)
在循环中,打印输出
清理
fclose( fp );
对于大型输入文件,这可能无法很好地扩展,其中Flights []最好声明为:
struct flight **Flights = NULL;
并使用realloc()
获取指向struct flight
并使用malloc()
获取struct flight
的每个实例的实际内存区域
如果使用内存分配函数,为了提高效率,请跟踪数组中使用的条目数以及填充时的条目数。这最大限度地减少了对realloc()
的调用次数,这一点非常重要,因为每次调用realloc()
都会导致整个数组被复制。