2

新しいノードを作成するこの関数を作成しました。

ノードを1つだけ追加するとプログラムは機能しますが、2つ目のノードを追加するとセグメンテーション違反が発生するため、問題は関数「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;
    }
}
4

3 に答える 3

3

がNULLになるまで実行されるループがcurrentあります...その後、に設定current->nextしますyが、current必ずNULLになります。

これを修正する簡単な方法は、ループを次のように変更することです。

while (current->next != NULL){

また、グローバルを避ける必要があることにも注意してください。currentローカル変数である必要があり、パラメータである必要があります...そしてそれが表すものなので、start私はそれを単に呼び出すでしょう。の(おそらく新しい)値を返す必要があります。listadd_nodelist

于 2013-03-26T18:51:18.443 に答える
2

ここ:

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

    current->next = y;

いつwhile止まりますか?にcurrentなるとnull。次にcurrent->next、セグメンテーション違反が発生します。

の1つ足りないで停止する必要がありNULLます。ではなく、と比較current->nextしてください。ループが終了するまでに、ノードを指していることになります。NULLcurrent

于 2013-03-26T18:51:53.700 に答える
0

このループ:

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

まで電流を移動しcurrent == NULLます。それが起こったら、この行:

 current->next = y;

そのNULLを無視しようとしますが、これはもちろんセグメンテーション違反を引き起こします。あなたはただ欲しかった:

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

while(current->next != NULL)技術的には、チェックを行うために必要なだけですがstart、IMOは、ポインターを尊重する前に、このようにポインターのNULLをチェックすることをお勧めします。

于 2013-03-26T18:53:22.587 に答える