【问题标题】:Stuck on linked list exercise坚持链表练习
【发布时间】:2013-03-26 18:49:05
【问题描述】:

我编写了这个创建新节点的函数。

当我只添加一个节点时,程序可以工作,但是如果我添加第二个节点,我会遇到分段错误,所以很明显问题出在函数“add_node()”的“else”部分,但我不能想办法。

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    char *city;
    struct node *next;
}node;

node *start = NULL;
node *current;

void add_node(char *cityname) {
    node *y = malloc(sizeof(node));
    y->city = cityname;
    y->next = NULL;
    current = start;

    if(start == NULL) {
        start = y;
    } else {
        while (current != NULL) {
            current = current->next;
        }
        current->next = y;
    }   
}

int main() {
    add_node("Paris");
    add_node("London");

    current = start;

    while(current != NULL) {
        printf("%s\n", current->city);
        current = current->next;
    }
}

【问题讨论】:

    标签: c


    【解决方案1】:

    您有一个循环运行,直到 current 为 NULL ...然后您将 current-&gt;next 设置为 y,但 current 必须为 NULL。

    修复它的一个简单方法是将循环更改为

    while (current->next != NULL){
    

    我还要注意,您应该避免使用全局变量。 current 应该是一个局部变量,start 应该是一个参数……我就叫它list,因为这就是它所代表的。 add_node 应该返回 list 的(可能是新的)值。

    【讨论】:

      【解决方案2】:

      这里:

          while (current != NULL) {
              current = current->next;
          }
      
          current->next = y;
      

      while 什么时候停止?当current 变为null。然后current-&gt;next 引发分段错误。

      你必须停止NULL。比较 current-&gt;nextNULL,而不是 current,所以当循环退出时,你仍然指向一个节点。

      【讨论】:

        【解决方案3】:

        这个循环:

        while (current != NULL){
            current = current->next;
        }
        

        将一直移动到current == NULL。一旦发生这种情况:

         current->next = y;
        

        将尝试尊重该 NULL,这当然会导致段错误。你只是想要:

        while(!current && current->next != NULL)
        

        从技术上讲,您只需要 while(current-&gt;next != NULL),因为您需要检查 start,但是 IMO 在您尊重它之前检查指针是否为 NULL 是一种很好的做法。

        【讨论】:

        • current = y 将覆盖迭代变量,而不将项目附加到链表中
        • " 在你尊重它之前检查一个指针是否为 NULL 是一种很好的做法。" -- 它只是 检查了。这些冗余检查实际上是非常糟糕的做法......它们使代码更难阅读和遵循并破坏其抽象性质......在这里,有一个循环来找到一个空next指针,所以两个空检查循环条件没有逻辑意义。空列表的守卫看起来像 if (current != NULL) { while (current-&gt;next != NULL) { ... }} 但该守卫已经存在。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-25
        • 2011-01-27
        相关资源
        最近更新 更多