用C语言编程,Stephen Kochan-第11章,练习3

用C语言编程,Stephen Kochan-第11章,练习3,c,pointers,struct,C,Pointers,Struct,我正在用Stephen Kochan的《C语言编程》一书自学C语言,我做了以下关于指针的练习: 编写一个名为insertEntry的函数,在链表中插入一个新条目。让过程将指向要插入的列表项(类型为本章定义的struct entry)的指针和指向列表中要插入新项的元素的指针作为参数 结构条目结构定义如下: struct entry { int x; struct entry *ptr; }; 这是我的代码: #include <stdio.h> void ins

我正在用Stephen Kochan的《C语言编程》一书自学C语言,我做了以下关于指针的练习:

  • 编写一个名为
    insertEntry
    的函数,在链表中插入一个新条目。让过程将指向要插入的列表项(类型为本章定义的
    struct entry
    )的指针和指向列表中要插入新项的元素的指针作为参数
  • 结构条目结构定义如下:

    struct  entry
    {
        int x;
        struct entry  *ptr;
    };
    
    这是我的代码:

    #include <stdio.h>
    
    void insert_entry (struct entry  *new_entry, struct entry  *prev_entry);
    
    struct entry
    {
        int x;
        struct entry  *ptr;
    };
    
    int main (void)
    {
        struct entry  n1, n2, n3, new_entry;
        struct entry  *list_ptr = &n1;
    
        n1.x = 1;
        n1.ptr = &n2;
    
        n2.x = 2;
        n2.ptr = &n3;
    
        n3.x = 4;
        n3.ptr = (struct entry *) 0;
    
        insert_entry (&new_entry, &n2);
    
        // Loop to display the list to check if insert_entry worked
        while ( list_ptr != (struct entry *) 0 ) {
            printf ("%i\n", list_ptr->x);
            list_ptr = list_ptr->ptr;
        }
    }
    
    void insert_entry (struct entry  *new_entry, struct entry  *prev_entry)
    {
        new_entry->ptr = prev_entry->ptr;
        prev_entry->ptr = new_entry;
    
        // Assign a value to make it easier to check if the function worked 
        new_entry->x = 3;
    }
    

    n_start
    应该是一个虚拟结构。代码的唯一问题是循环显示
    n\u start.x
    的值。我怎样才能使它不被显示?

    作者Stephen Kochan有一个网站:classroomm.com

    那里有一个论坛,有一小部分内容与他的书“C语言编程,第三版”有关,其中包括对奇数章节末练习的答案。你会发现它很有用

    以下是该网站的相关信息,作为如何回答练习的提示:

    您可以通过设置“虚拟”结构变量来解决此问题 叫做listHead

    例如:

         struct entry  listHead;  
    
    然后,通过将listHead的下一个成员指定为指向实际的第一个成员,可以将其设置为指向列表的头部 名单的条目:

           listHead.next = &entry1;  
    
    现在,要在列表前面插入一个名为newEntry的新条目,您可以编写:

           insertEntry (&new_entry, &list_head);
    

    我不会发布我为练习编写的代码——如果你自己与它争论,你会学到更多。

    这不是辅导网站。但作为一个提示:学习“环列表”。据我所知,这个练习希望你用它教给你的概念来解决它,这是一个基本的链表。不要在其他函数中声明函数。声明应该在全局范围内,就像函数在全局范围内定义一样。(是的,它在语法上是有效的;我只是不鼓励使用它。另请参见GCC选项
    -ownested externs
    )您尚未初始化
    新条目
    ,因此它的
    .x
    值未定义(这就是为什么您有“测试模式”
    新条目->x=3;
    )。
    .ptr
    值并不重要,因为插入代码将对其进行设置。您应该将打印循环分解为一个函数。然后应该调用函数两次,一次在插入新条目之前,一次在插入新条目之后。您可能最终决定打印指针(指向当前节点的指针和指向下一个节点的指针)。请参阅。如果我初始化
    new_entry.x
    或稍后为其赋值,则不会产生任何影响。主要问题已经解决了。我只需要知道如何在不显示虚拟结构的情况下显示列表(
    n\u start
    )。顺便说一句,感谢功能范围提示,FTFY。非常感谢。我想我现在明白了。现在唯一的问题是循环还显示了
    n\u start
    结构的
    x
    成员,该结构应该是一个虚拟结构。@Hello\u World:您需要在打印条目列表之前设置list\u ptr=n\u start.ptr。另外,n_start.next=&n1;可能应该是n_start.ptr=&n1;
           insertEntry (&new_entry, &list_head);