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的开始