2

リンクされたリストをランダムに初期化し、ユーザー指定のインデックス (getnth) に値を出力する基本的なプログラムを試しています。ただし、特定の cout 行をコメントアウトすると表示され、コメントを解除すると消える奇妙なセグメンテーション違反に遭遇しています。

#include<iostream>
#include<cstdlib>

using namespace std;

struct node
{
    int x;
node *next;
};

void ins(struct node*& headRef, int n)
{
    node *newNode = new node;
if (!newNode)
    return;
newNode->x = n;
if (!headRef)
    newNode->next = NULL;
else
    newNode->next = headRef;
headRef = newNode;
cout<<"\n"<<n<<" inserted at "<<headRef<<"\n\n";
}

void disp(struct node* head)
{
    node *temp = head;
    if (!temp)
{
    cout<<"\n\nLL empty\n";
    return;
}
while (temp)
{
    cout<<temp->x<<" ";
    temp = temp->next;
}
cout<<"\n\n";
}

void getnth(struct node* head, int n)
{
int i=0;
node *temp = head;
while (temp)
{
    if (i == n)
    {
        cout<<"\n"<<temp->x<<"\n\n";
        return;
    }
}

cout<<"\nIndex too high\n";
}

int main()
{
node *head;
int i;

srand(time(NULL));
for (i=0; i<10; i++)
{
    ins(head, rand()%10+1);
    cout<<"Main head is "<<head<<"\n"; // segfault appears if this line is commented out, disappears if it's not
}

cout<<"\nInitial LL\n\n";
disp(head);
cout<<"\nEnter index ";
cin>>i;
getnth(head, i);
return 0;
}
4

2 に答える 2

4

main初期化中

node *head=NULL;

そしてあなたgetnthは間違っています、それを修正してください。

このようなものかもしれません:-

void getnth(struct node* head, int n)
{
int i=0;
node *temp = head;
while (temp)
{
    if (++i == n)
    {
        cout<<"\n"<<temp->x<<"\n\n";
        return;
    }
    temp=temp->next;
}
cout<<"\nIndex too high\n";
}
于 2013-08-04T08:19:18.993 に答える
0

デフォルトでは、「main( )」のポインタ「head」は、プログラム スタック上に割り当てられる自動変数であるため、ガベージで初期化されます。

そのため、ポインター「head」を関数「disp( )」に渡すと、このポインターが逆参照され、セグメンテーション フォールトが発生します。

ポインター「ヘッド」を明示的に 0 で初期化する必要があり、これで問題が解決します。

于 2013-08-04T08:27:21.917 に答える