链接列表开始插入

时间:2017-03-10 00:44:48

标签: 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);

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

为结构分配renew,指向first指针,该指针最初为NULL,first被指定为renew的相同地址,然后指向renewrenew的地址。在第二个循环之后,相同的first显然会被克隆并指向first的地址,然后renew的地址被分配与克隆的let mainWindow; let playerWindow; app.on('window-all-closed', function() { if (process.platform != 'darwin') { app.quit(); } }); app.on('ready', function() { mainWindow = new BrowserWindow({ title: 'MasterGameApp', x: 910, y: 500, width: 800, height: 460, show: true, resizable: false, transparent: false }); playerWindow = new BrowserWindow({ title: 'playerView', x: 2250, y: 50, width: 1005, height: 540, show: true, transparent: false, fullscreen : true }); mainWindow.loadURL('http://localhost:8889'); mainWindow.setMenuBarVisibility(false); mainWindow.setAutoHideMenuBar(true); playerWindow.loadUrl('http://localhost:8889/playerView'); playerWindow.setMenuBarVisibility(false); playerWindow.setAutoHideMenuBar(true); mainWindow.on('closed', function() { playerWindow.close(); playerWindow = null; mainWindow = null; }); }); 相同的地址

没有一个加起来。

3 个答案:

答案 0 :(得分:0)

没有发生renew的克隆。每次迭代都会分配一块新的内存(这是malloc调用正在做的事情)并更改renew指针以引用这个新的内存。

答案 1 :(得分:0)

这是一个将新元素添加到链表开头的循环。

第一个scanf读取了类名,而这就是它。然后,另一个scanf将名字,姓氏和等级存储到3个变量中,然后开始while循环:

每次代码用malloc分配新元素的空间时,就会填充其3个字段(您没有显示struct student_grade的定义,但我们可以推断它有字段{ {1}},first_namelast_name)将用户使用grade插入的数据复制到其中,然后还有2行处理链接列表:我们是在开头插入,这意味着新元素将成为第一个元素。所以,scanf确保我们创建的元素之后的元素(它不在列表中!)首先是当前(它将成为下一行的第二个元素) ),然后使用renew->next = first;程序确保从现在起列表将从我们添加的元素开始。

在循环结束时,新的first = renew;会询问有关另一个学生的数据,这些数据存储在与之前相同的变量中,以便在循环的下一次迭代中将它们复制到结构,它一直持续到用户插入0。

这里没有克隆。每次调用scanf时,都会得到一个与前一个不同的新内存块,其地址暂时存储在malloc中。由于每次都会覆盖renew,并且您不想丢失它,因此您必须确保将其存储在某处:第一个元素的地址始终存储在renew中,并且每个元素都将指针(first)存储到下一个元素,这样就不会丢失任何地址。 next每次都没有被克隆;相反,变量总是相同的,但它的值(地址)每次都会改变。

答案 2 :(得分:0)

  

在第二次循环之后,相同的更新'显然被克隆了......

首先没有克隆"module"。为它分配了一个全新的内存空间。

您想将renew添加到列表的开头。另一个指针(renew)指向列表的开头。

first - 使用此行,您基本上可以说“好”,从这一点开始renew->next = first;将成为我列表中的第一项,其下一项将是实际的{{1} }。基本上renew是我列表中的第0项。

first - 您有renew指针指向列表的开头。您还希望first = renew;点指向列表的开头。因此,解决方案是将renew指针设置为指向与first指针相同的内存位置。现在,您的两个指针都将正确指向列表中的第一个项目。

first基本上用作辅助指针。它有助于向列表中添加新项目。另一方面,first指针是列表的重要组成部分。它的工作是指向列表中的第一个元素。