C 链表开始插入
我一直很难弄明白这个代码:C 链表开始插入,c,list,structure,C,List,Structure,我一直很难弄明白这个代码: typedef struct student_grade sg; sg *first = NULL; sg *renew = NULL; sg *temp = NULL; int num; float g; char classname[12], fn[STR_LENS], ln[STR_LENS]; printf("Enter the classname (without spaces): "); scanf("%11s", classname); prin
typedef struct student_grade sg;
sg *first = NULL;
sg *renew = NULL;
sg *temp = NULL;
int num;
float g;
char classname[12], fn[STR_LENS], ln[STR_LENS];
printf("Enter the classname (without spaces): ");
scanf("%11s", classname);
printf ("Enter the student's name and their grade. Enter 0 0 0 to quit. \n(FirstLast ##.#): ");
num = scanf("%11s %11s %f", fn, ln, &g);
while (fn[0] != '0')
{
if (num == 3)
{
renew = (sg*) malloc(sizeof(sg));
strncpy(renew->first_name, fn, STR_LENS-1);
strncpy(renew->last_name, ln, STR_LENS-1);
renew->grade = g;
renew->next = first; //next pointer to first
first = renew; //assign address of renew to first
}
else
{
return 1;
}
printf("Enter the student's name and their grade.Enter 0 0 0 to quit\n(First Last ##.#): ");
num = scanf("%11s %11s %f", fn, ln, &g);
}
特别是这一部分:
renew = (sg*) malloc(sizeof(sg));
strncpy(renew->first_name, fn, STR_LENS-1);
strncpy(renew->last_name, ln, STR_LENS-1);
renew->grade = g;
renew->next = first; //next pointer to first
first = renew; //assign address of renew to first
续订
被分配给结构,指向最初为空的第一个
指针,第一个
被分配给续订
的相同地址,然后指向续订
的地址。在第二个循环之后,相同的续订
显然被克隆,并且还指向第一个
的地址,然后第一个
的地址被分配给克隆的续订
的相同地址
所有这些都没有意义。没有克隆
续费
。每次迭代都会分配一个新的内存块(这就是malloc
调用所做的),并更改renew
指针以引用此新内存。没有克隆renew
。每次迭代都会分配一个新的内存块(这就是malloc
调用所做的),并更改renew
指针以引用这个新内存。这是一个循环,将新元素添加到链接列表的开头
第一个scanf
读取类名,就这样。然后,还有另一个scanf
将名字、姓氏和等级存储到3个变量中,然后while
循环开始:
每次代码使用malloc
为新元素分配空间,然后填充其3个字段(您没有显示struct student_grade
的定义,但我们可以推断它包含字段first_name
,last_name
和grade
)通过将用户使用scanf插入的数据复制到它们中,然后还有两行处理链表:我们在开头插入,这意味着新元素将成为第一行。所以,renew->next=first代码>确保我们正在创建的元素(它还不在列表中!)之后的元素是当前的第一个元素(它将成为下一行的第二个元素),然后使用first=renew代码>程序确保从现在开始,列表将从我们正在添加的元素开始
在循环结束时,新的scanf
请求另一个学生的数据,这些数据存储在与以前相同的变量中,以便在循环的下一次迭代中,可以将它们复制到结构中,并继续执行,直到用户插入一个0
这里没有克隆。每次调用malloc
时,您都会得到一个新的内存块,与前一个内存块不同,它的地址临时存储在renew
中。由于续订
每次都会被覆盖,并且您不想丢失它,因此必须确保它存储在某个位置:第一个元素的地址始终存储在第一个
中,每个元素都存储指向下一个元素的指针(下一个
),这样就不会丢失地址<代码>续订
并非每次都克隆;相反,变量总是相同的,但是它的值(地址)每次都会改变。这是一个循环,将新元素添加到链表的开头
第一个scanf
读取类名,就这样。然后,还有另一个scanf
将名字、姓氏和等级存储到3个变量中,然后while
循环开始:
每次代码使用malloc
为新元素分配空间,然后填充其3个字段(您没有显示struct student_grade
的定义,但我们可以推断它包含字段first_name
,last_name
和grade
)通过将用户使用scanf插入的数据复制到它们中,然后还有两行处理链表:我们在开头插入,这意味着新元素将成为第一行。所以,renew->next=first代码>确保我们正在创建的元素(它还不在列表中!)之后的元素是当前的第一个元素(它将成为下一行的第二个元素),然后使用first=renew代码>程序确保从现在开始,列表将从我们正在添加的元素开始
在循环结束时,新的scanf
请求另一个学生的数据,这些数据存储在与以前相同的变量中,以便在循环的下一次迭代中,可以将它们复制到结构中,并继续执行,直到用户插入一个0
这里没有克隆。每次调用malloc
时,您都会得到一个新的内存块,与前一个内存块不同,它的地址临时存储在renew
中。由于续订
每次都会被覆盖,并且您不想丢失它,因此必须确保它存储在某个位置:第一个元素的地址始终存储在第一个
中,每个元素都存储指向下一个元素的指针(下一个
),这样就不会丢失地址<代码>续订
并非每次都克隆;相反,变量总是相同的,但是它的值(地址)每次都会改变
在第二个循环之后,相同的“更新”显然被克隆了
首先,续订
未克隆。一个全新的内存空间被分配给它
您想将续订
添加到列表的开头。另一个指针(第一个
)指向列表的开头
续订->下一步=第一步代码>-这一行基本上是说“好的,从现在开始,续订
将是我列表中的第一项,下一项将是实际的第一项
。基本上,续订
是我列表中的第0项`
first=更新代码>-您有续订指针,该指针指向li的开始