【问题标题】:Adding structs to a linked list doesn't seem to work将结构添加到链表似乎不起作用
【发布时间】: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


【解决方案1】:

我将它移植到 Archlinux 上运行,但转换回来应该不会花太多时间。

我添加了几个打印语句来显示每个节点的指针地址,您会发现它们相同。

#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) 以秒为单位(从纪元开始)播种,您的通话非常连续地发生,以至于每次都使用相同的种子重复给您相同的号码。

【讨论】:

  • 感谢您的回答。但这并不是我想要的。我已经更新了我的代码 - 它重现了问题,但没有任何条件代码。我遇到的问题是我的列表似乎包含多个相同的节点 - 或具有相同航班号的多个节点,我试图随机生成。
  • 我打印了列表中每个指针的地址,每个都是一样的。我不再使用那个随机函数了。
  • 是的,我已尝试将其最小化以重现实际问题而不会分心。
  • 是的,我已经意识到 :p 因此发生了变化。实际上,我几乎重写了整个程序,只是复制了一些旧程序。
  • 谢谢。这是导致我的问题的种子。其他一切都按我的预期工作,呸! RE: 最佳实践等。我对 C 语言非常陌生,对编程也很陌生,我相信您已经猜到了。如果有什么让你读起来真的很痛苦,请原谅我:p 但我正在努力边做边学,这是我无法弄清楚的绊脚石。感谢您抽出宝贵时间帮助我,我现在要离开并阅读有关播种的信息。
猜你喜欢
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
相关资源
最近更新 更多