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

时间:2016-04-10 16:17:38

标签: c pointers struct

我正在教自己C和Stephen Kochan编写的“Programming in C”一书,我在指针上进行了以下练习:

  1. 编写一个名为insertEntry的函数,将新条目插入到链表中。让过程将指向要插入的列表条目的指针(本章定义的类型struct entry)作为参数,并指向列表中元素的指针,之后将插入新条目。 / LI>

    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;
    }
    

    此代码工作正常并完成工作。但接下来是练习#3:

    1. 练习2中开发的函数仅在列表中的现有元素之后插入元素,从而阻止您在列表的前面插入新条目。你如何使用同样的功能,但仍然克服了这个问题? (提示:考虑设置一个特殊的结构来指向列表的开头。)
    2. 我不知道如何继续。如果我设置另一个结构,我将无法在不更改insert_entry函数的形式参数的情况下将其作为参数传递。但是我不能使用list_ptr指针,因为如果我将它作为insert_entry函数的第二个参数传递,则语句new_entry->ptr = prev_entry->ptr;将没有意义。

      关于这个关注练习#2的其他问题,但我无法找到任何关于此的内容。帮助将永远感激。提前谢谢。

      *编辑:这就是我的代码现在的样子(感谢你/ ringzero):

      #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  n_start, n1, n2, n3, new_entry;
          struct entry  *list_ptr = &n_start;
      
          n_start.ptr = &n1;
      
          n1.x = 1;
          n1.ptr = &n2;
      
          n2.x = 2;
          n2.ptr = &n3;
      
          n3.x = 3;
          n3.ptr = (struct entry *) 0;
      
          insert_entry (&new_entry, &n_start);
      
          // 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 = 0;
      }
      

      n_start应该是虚拟结构。代码的唯一问题是循环显示n_start.x的值。如何才能使它不显示?

1 个答案:

答案 0 :(得分:1)

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

那里有一个论坛,其中有一小部分与他的书有关,#34; C编程,第3版。&#34;它包括奇数编号末尾练习的答案。你会发现它非常有用。

这里有来自该网站的相关信息,作为如何回答练习的轻微提示:

  

您可以通过设置&#34; dummy&#34;来解决此问题。结构变量       叫listHead,

     

例如:

     struct entry  listHead;  
     

然后你可以通过指定listHead的下一个成员指向实际的第一个来设置它指向列表的头部   列表的输入:

       listHead.next = &entry1;  
     

现在要在列表的前面插入一个名为newEntry的新条目,您可以写:

       insertEntry (&new_entry, &list_head);

我不会发布我为练习编写的代码 - 如果你自己与之争吵,你将会学到更多。