用C语言编程,Stephen Kochan-第11章,练习3
我正在用Stephen Kochan的《C语言编程》一书自学C语言,我做了以下关于指针的练习:用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
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);