簡體   English   中英

C鏈表頭指針不斷變化

[英]C linked list head pointer keep changing

我制作了一個程序,它從一個文本文件中讀取輸入並創建一個鏈接列表,但在執行時遇到了麻煩。 我還是個初學者。 問題是在添加新項目時頭指針一直在移動。

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include <stdbool.h>
    //Visitor information
    struct visitData
    {
    char *SrNo;
    char *ticketNo;
    char *Name;
    char *ID;
    };

    //Ticket linked list
    struct ticket
    {
    struct visitData visitor;
    struct ticket *nextPtr;
    };

    int main() { //main

    FILE *fPtr = NULL;
    fPtr = fopen("Tickets.txt", "a+");
    if (fPtr == NULL)
    {
        printf("Error, please try again.\n");
        return 0;
    }

    FILE *outfPtr = NULL;
    outfPtr = fopen("output.txt", "w");
    if (outfPtr == NULL)
    {
        puts("Error, could not create output file, please try again.");
        return 0;
    }

    else {

        
        struct ticket *head = NULL;

        struct ticket *new = NULL;

        struct visitData *nextPtr = NULL;


        char sr[2];
        char ticketNumber[20];
        char name[30];
        char id[24];

        

        
            rewind(fPtr);

            if (fscanf(fPtr, "%2s%20s%29s%24s", sr, ticketNumber, name, id) == 4)
            {

                new = malloc(sizeof(struct ticket));
                
                new->visitor.SrNo = strdup(sr);
                new->visitor.ticketNo = strdup(ticketNumber);
                new->visitor.Name = strdup(name);
                new->visitor.ID = strdup(id);
                new->nextPtr = NULL;
                head = new;
                
                printf("%s\n", head->visitor.SrNo);

                while (!feof(fPtr))
                {

                                    
                    if (fscanf(fPtr, "%2s%20s%29s%24s", sr, ticketNumber, name, id) == 4)


                        new->visitor.SrNo = sr;                       
                        new->visitor.ticketNo = ticketNumber;
                        new->visitor.Name = name;
                        new->visitor.ID = id;
                        
                        new->nextPtr = malloc(sizeof(struct ticket));
                        new = new->nextPtr;
                        new->nextPtr = NULL;
                    }
                    

                }
                
                
            }
            else
            {
                printf("%d",fscanf(fPtr, "%2s%20s%29s%24s", sr, ticketNumber, name, id));
                new->visitor.SrNo = "0";
            }

            if (head == NULL)
            {
                printf("List is empty\n");
            }
            struct ticket *Ptr = NULL;
            Ptr = head;
            printf("%s\n", Ptr->visitor.SrNo);
            while (Ptr != NULL)
            {
                printf("%s %s\n", Ptr->visitor.SrNo, Ptr->visitor.ticketNo);
                Ptr = Ptr->nextPtr;
            }
    }
    }



    I did try to add a line which is `
new = malloc(sizeof(struct ticket));
    `, but it became another problem, that the head pointer cannot link to the second node.



    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include <stdbool.h>
    //Visitor information
    struct visitData
    {
    char *SrNo;
    char *ticketNo;
    char *Name;
    char *ID;
    };

    //Ticket linked list
    struct ticket
    {
        struct visitData visitor;
        struct ticket *nextPtr;
    };

    int main() { //main

    FILE *fPtr = NULL;
    fPtr = fopen("Tickets.txt", "a+");
    if (fPtr == NULL)
    {
        printf("Error, please try again.\n");
        return 0;
    }

    FILE *outfPtr = NULL;
    outfPtr = fopen("output.txt", "w");
    if (outfPtr == NULL)
    {
        puts("Error, could not create output file, please try again.");
        return 0;
    }

    else {

        
        struct ticket *head = NULL;

        struct ticket *new = NULL;

        struct visitData *nextPtr = NULL;


        char sr[2];
        char ticketNumber[20];
        char name[30];
        char id[24];

        

        
            rewind(fPtr);

            if (fscanf(fPtr, "%2s%20s%29s%24s", sr, ticketNumber, name, id) == 4)
            {

                new = malloc(sizeof(struct ticket));
                
                new->visitor.SrNo = strdup(sr);
                new->visitor.ticketNo = strdup(ticketNumber);
                new->visitor.Name = strdup(name);
                new->visitor.ID = strdup(id);
                new->nextPtr = NULL;
                head = new;
                
                printf("%s\n", head->visitor.SrNo);

                while (!feof(fPtr))
                {

                                    
                    if (fscanf(fPtr, "%2s%20s%29s%24s", sr, ticketNumber, name, id) == 4)
                    {
                        new = malloc(sizeof(struct ticket));
                        new->visitor.SrNo = sr;                       
                        new->visitor.ticketNo = ticketNumber;
                        new->visitor.Name = name;
                        new->visitor.ID = id;
                        
                        new->nextPtr = malloc(sizeof(struct ticket));
                        new = new->nextPtr;
                        new->nextPtr = NULL;
                    }
                    

                }
                
                
            }
            else
            {
                printf("%d",fscanf(fPtr, "%2s%20s%29s%24s", sr, ticketNumber, name, id));
                new->visitor.SrNo = "0";
            }

            if (head == NULL)
            {
                printf("List is empty\n");
            }
            struct ticket *Ptr = NULL;
            Ptr = head;
            printf("%s\n", Ptr->visitor.SrNo);
            while (Ptr != NULL)
            {
                printf("%s %s\n", Ptr->visitor.SrNo, Ptr->visitor.ticketNo);
                Ptr = Ptr->nextPtr;
            }
    }
    }

將節點添加到列表的典型方法是:

new = malloc(size);    // Create a new node
new->nextPtr = head;   // Save the existing list
head = new;            // Add the new element at the front of the list

你在保存你的舊值之前改變了頭,所以你失去了列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM