代码之家  ›  专栏  ›  技术社区  ›  Link

向链表中添加结构似乎不起作用

  •  0
  • Link  · 技术社区  · 7 年前

    所以我在做一个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------
    

    关于为什么我的列表似乎重复包含同一个节点,有人有什么有用的建议吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   tijko    7 年前

    我将其移植到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) ,您的呼叫连续进行得如此紧密,以至于每次重复给您相同的号码时,种子都是相同的。