我将其移植到Archlinux上运行,但不需要太多时间就能将其转换回来。
我添加了几个print语句来显示每个节点的指针地址,您将看到它们是
不
同样的。
#include<stdio.h>
#include <unistd.h>
#include <time.h>
#include<stdlib.h>
#include<stdbool.h>
#include <string.h>
typedef struct aircraft {
char FlightNumber[9]; // Unique aircraft ID
struct aircraft * next; // A pointer to the next aircraft in the current queue
} AIRCRAFT;
AIRCRAFT *AirQueue = NULL;
AIRCRAFT *Current = NULL;
void GenerateFlightNumber(AIRCRAFT* node) {
char FlightNumber[10] = ""; // Stores the flight number for the duration of this function
int random = 0; // Stores the random number used to generate the flight number prefix and suffix
// Generates the prefix
random = rand() % 10; // Generates a random number between 0 and 9
printf("Random: %d\n", random);
char prefix[10][5] = { "BA","ELAL","SHT","EXS","EZY","TOM","RYR","MON","UAE","TFL" }; // Array of airline prefixes
strncpy(FlightNumber, prefix[random], sizeof(FlightNumber)); // Copies a prefix to the FlightNumber variable by selecting one using a random index number
// Generates the suffix
char suffix[5]; // Stores the flight number suffix
random = (rand() % 8888) + 1111; // Generate a random number between 1111 and 9999
snprintf(suffix, sizeof(FlightNumber), "%d", random);
strncat(FlightNumber, suffix, sizeof(FlightNumber)); // Concatenates the prefix and suffix to the FlightNumber variable
strncpy(node->FlightNumber, FlightNumber, sizeof(node->FlightNumber)); // Assign the final flight number to the new aircraft
}
AIRCRAFT* StartAirQueue()
{
printf("\nCreating Air Queue...");
AIRCRAFT *Temporary = (AIRCRAFT*)malloc(sizeof(AIRCRAFT));
if (Temporary == NULL)
{
printf("\nFailed to allocate memory\n");
return NULL;
}
GenerateFlightNumber(Temporary);
Temporary->next = NULL;
AirQueue = Current = Temporary;
return Temporary;
}
AIRCRAFT* AddToAirQueue(bool end)
{
if (NULL == AirQueue)
{
return (StartAirQueue());
}
if (end)
printf("\nAdding node to end of queue...");
else
printf("\n Adding node to beginning of queue...");
AIRCRAFT *Temporary = (AIRCRAFT*)malloc(sizeof(AIRCRAFT));
if (NULL == Temporary)
{
printf("\n Node creation failed \n");
return NULL;
}
GenerateFlightNumber(Temporary);
Temporary->next = NULL;
if (end)
{
Current->next = Temporary;
Current = Temporary;
}
else
{
Temporary->next = AirQueue;
AirQueue = Temporary;
}
return Temporary;
}
void print_list(void)
{
AIRCRAFT *ptr = AirQueue;
printf("\n -------Printing list Start------- \n");
while (ptr != NULL)
{
printf("\n [%s] [%p]\n", ptr->FlightNumber, ptr);
ptr = ptr->next;
}
printf("\n -------Printing list End------- \n");
return;
}
int main(void)
{
int i = 0;
print_list();
srand((unsigned)time(NULL));
for (i = 5; i < 10; i++) {
AddToAirQueue(true);
sleep(1);
}
print_list();
for (i = 4; i > 0; i--) {
sleep(1);
AddToAirQueue(false);
}
print_list();
getchar();
return 0;
}
正如我在您第一次发布时所说,问题在于您的“随机”函数。
该行具体如下:
srand((unsigned)time(NULL)); // Uses current time as seed for random generator
只要把它移到你的main中,因为你只需要调用它一次。
您可以在上阅读更多
seeding
来自前面的问题。
通过使用秒(自纪元起)播种
time(NULL)
,您的呼叫连续进行得如此紧密,以至于每次重复给您相同的号码时,种子都是相同的。