我正在學習 C,目前正在學習動態記憶體分配和鏈表,但遇到了問題。我找到了這篇文章并遵循了答案。但是,我的程式在列印出來時仍然跳過了我的第一個節點。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct record
{
int id;
char name[257];
float age;
struct record *next;
};
int main(void)
{
int i = 1;
struct record *firstrecord = (struct record *)malloc(sizeof(struct record));
firstrecord->id = 1000;
char firstname[] = "John Doe";
memcpy(firstrecord->name, firstname,strlen(firstname) 1);
firstrecord->age = 24.5;
firstrecord->next = NULL;
struct record *mostrecentlycreated = firstrecord;
int iyes = 1;
char cyes;
int yes = 1;
while (yes == iyes)
{
// build next node
mostrecentlycreated->next = (struct record *)malloc(sizeof(struct record));
// change data in new record
int newid;
char newname[257];
char temp;
float newage;
char cnewage[257];
printf("Enter the name: ");
fgets(newname,257,stdin);
newid = 1000 i;
printf("Enter the person's age: ");
fgets(cnewage,257,stdin);
newage = atof(cnewage);
mostrecentlycreated->id = newid;
memcpy(mostrecentlycreated->name,newname,strlen(newname) 1);
mostrecentlycreated->age = newage;
mostrecentlycreated = mostrecentlycreated->next;
mostrecentlycreated->next = NULL;
i ;
// decide whether or not to keep going
printf("Do you wish to continue? 1\\0 ");
fgets(&cyes,1,stdin);
iyes = atoi(&cyes);
scanf("%c",&temp);
}
struct record *traverse = firstrecord;
while (traverse != NULL)
{
printf("Employee id is %i; Employee Name is %s; Employee Age is %f\n",traverse->id,traverse->name,traverse->age);
traverse = traverse->next;
}
free(firstrecord);
free(mostrecentlycreated);
return 0;
}
這是我的輸出:
Enter the name: john doe
Enter the person's age: 23
Do you wish to continue? 1\0 0
Employee id is 1001; Employee Name is john doe
; Employee Age is 23.000000
Employee id is 0; Employee Name is ; Employee Age is 0.000000
為什么不列印第一人稱?
uj5u.com熱心網友回復:
創建第一個節點后,您的回圈會在每次迭代中創建一個新節點,但它將用戶的輸入分配給串列中的前一個節點,而不是添加到串列中的當前節點。因此,在第一次迭代中,您將覆寫第一個節點的資料,然后附加第二個空節點。然后在第二次迭代中,您將覆寫第二個節點的資料,并附加一個空白的第三個節點。等等。
試試這個:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct record
{
int id;
char name[257];
float age;
struct record *next;
};
int main(void)
{
int i = 1;
struct record *firstrecord = (struct record *)malloc(sizeof(struct record));
firstrecord->id = 1000;
strncpy(firstrecord->name, "John Doe", 257);
firstrecord->age = 24.5;
firstrecord->next = NULL;
struct record *mostrecentlycreated = firstrecord;
const int cyes = 1;
int iyes = 1;
while (iyes == cyes)
{
// build next node
struct record *newrecord = (struct record *)malloc(sizeof(struct record));
// change data in new record
newrecord->id = 1000 i;
printf("Enter the name: ");
fgets(newrecord->name, 257, stdin);
printf("Enter the person's age: ");
scanf("%f", &(newrecord->age));
newrecord->next = NULL;
mostrecentlycreated = newrecord;
i;
// decide whether or not to keep going
printf("Do you wish to continue? 1\\0 ");
scanf("%d", &iyes);
}
struct record *traverse = firstrecord;
while (traverse != NULL)
{
printf("Employee id is %i; Employee Name is %s; Employee Age is %f\n", traverse->id, traverse->name, traverse->age);
traverse = traverse->next;
}
traverse = firstrecord;
while (traverse != NULL)
{
struct record *nextrecord = traverse->next;
free(traverse);
traverse = nextrecord;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/434827.html
上一篇:將字符一一添加到二維字符陣列
下一篇:在C中只讀的動態資料
