[英]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.