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

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

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

struct entry结构定义如下:

 struct entry { int x; struct entry *ptr; }; 

这是我的代码:

 #include  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中开发的函数仅在列表中的现有元素之后插入元素,从而阻止您在列表的前面插入新条目。 你如何使用同样的function,但仍然克服了这个问题? (提示:考虑设置一个特殊结构来指向列表的开头。)

我不知道如何继续。 如果我设置另一个结构,我将无法在不更改insert_entry函数的forms参数的情况下将其作为参数传递。 但我不能使用list_ptr指针,因为如果我将它作为第二个参数传递给insert_entry函数,则语句new_entry->ptr = prev_entry->ptr; 没有意义。

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

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

 #include  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的值。 我怎样才能使它不显示?

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

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

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

您可以通过设置名为listHead的“虚拟”结构变量来解决此问题,

例如:

  struct entry listHead; 

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

  listHead.next = &entry1; 

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

  insertEntry (&new_entry, &list_head); 

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