【发布时间】:2018-04-14 13:31:30
【问题描述】:
所以我正在用 C 做一个练习,学习操作数据结构。我在函数中的结构/指针方面有点挣扎。我试图逐步完成,我可以看到我正在创建新结构,但我要么在同一个内存位置创建它们,要么我正在创建一个具有多个相同结构的链接列表!我不知道发生了什么。
我已尝试按要求简化我的代码,现在它包含重现我的问题所需的所有代码(我相信最少?)。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.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
srand((unsigned)time(NULL)); // Uses current time as seed for random generator
random = rand() % 10; // Generates a random number between 0 and 9
char prefix[10][5] = { "BA","ELAL","SHT","EXS","EZY","TOM","RYR","MON","UAE","TFL" }; // Array of airline prefixes
strcpy_s(FlightNumber, sizeof(FlightNumber), prefix[random]); // 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
srand((unsigned)time(NULL)); // Uses current time as seed for random generator
random = (rand() % 8888) + 1111; // Generate a random number between 1111 and 9999
_itoa_s(random, suffix, 5, 10); // Converts the randomly generated suffix to a string, and stores it in the suffix variable
strcat_s(FlightNumber, sizeof(FlightNumber), suffix); // Concatenates the prefix and suffix to the FlightNumber variable
strcpy_s(node->FlightNumber, sizeof(node->FlightNumber), FlightNumber); // Assign the final flight number to the new aircraft
}
void setUpAircraft(AIRCRAFT * node, bool ground) {
GenerateFlightNumber(node);
}
AIRCRAFT* StartAirQueue()
{
printf("\nCreating Air Queue...");
AIRCRAFT *Temporary = (AIRCRAFT*)malloc(sizeof(AIRCRAFT));
if (Temporary == NULL)
{
printf("\nFailed to allocate memory\n");
return NULL;
}
setUpAircraft(Temporary, false);
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;
}
setUpAircraft(Temporary, false);
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] \n", ptr->FlightNumber);
ptr = ptr->next;
}
printf("\n -------Printing list End------- \n");
return;
}
int main(void)
{
int i = 0, result = 0;
AIRCRAFT *ptr = NULL;
print_list();
for (i = 5; i < 10; i++)
AddToAirQueue(true);
print_list();
for (i = 4; i > 0; i--)
AddToAirQueue(false);
print_list();
getchar();
return 0;
}
我想制作一份飞机列表,每架飞机都有不同的航班号。从结果可以看出,列表中的每个节点似乎都包含相同的航班号。
------Printing list Start-------
------Printing list End------
Creating Air Queue...
Adding node to end of queue...
Adding node to end of queue...
Adding node to end of queue...
Adding node to end of queue...
------Printing list Start-------
[RYR5769]
[RYR5769]
[RYR5769]
[RYR5769]
[RYR5769]
------Printing list End------
Adding node to end of queue...
Adding node to end of queue...
Adding node to end of queue...
Adding node to end of queue...
------Printing list Start-------
[RYR5769]
[RYR5769]
[RYR5769]
[RYR5769]
[RYR5769]
[RYR5769]
[RYR5769]
[RYR5769]
[RYR5769]
[RYR5769]
------Printing list End------
对于为什么我的列表似乎重复包含同一个节点,是否有人有任何有用的建议?
【问题讨论】:
-
你能发帖
setUpAircraft吗? -
我已经添加了 - 你需要查看设置属性的方法吗?它主要是随机生成的整数。
-
请发帖minimal reproducible example。这段代码既不是最小的、完整的,也不是可验证的。
-
C 不支持方法。您应该发布minimal reproducible example 和详细信息。阅读How to Ask。您应该对调试器感到满意(程序,而不是自愿为您工作的人)..
-
我们不需要查看设置属性的函数。相反,我们需要看到一个完全不同的、完整的、小得多的程序来演示您面临的相同问题。您可以通过大幅削减当前程序的副本来生成这样的minimal reproducible example,但您应该考虑从头开始构建单独的示例程序是否更有效。这两种方法各有优势。
标签: c struct linked-list