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

struct node {
    char str[200];
    int nn;
    struct node* next;
};

int number;
struct node* start=NULL;
struct node* current;
//function to insert into the list 

void insert() {
    struct node* n;
    n=(struct node*)malloc(sizeof(struct node));
    n->str=malloc(sizeof(char) * 1000);
    printf("please enter the data that you would like to insert: ");
    gets(n->str);
    printf("asdasdasdasd");
    n->next=NULL;
    if( start==NULL ) {
        start->next=n;
        current=n;
    }
    else {

    current->next=n;
    current=n;

    }

    printf("done\n");
}

void display() {
    current=start;
    int i=0;
    while( current->next!=NULL ) {
        printf("node%d= %s\n",++i,current->str);
        current=current->next;

    }
    printf("this the end");
}


int main() {
    char c;
    int input;

    do {
        printf("Select from the following options:\n"
           "1.Display list\n"
           "2.Add to list\n"
           "3.delete from list\n");

        scanf("%d",&input);
        switch (input) {
            case 1: display(); break;
            case 2: insert(); break;
      //    case 3: delete(); break;
            default : printf("Please select 1 , 2 or 3\n");
        }
        printf( "would you like to continue?(y/n)\n");
        scanf("%s",&c);
    } while(c=='y');

    return 0;
}

これにより、挿入機能でエラーが発生しています A SEGMENTATION FAULT !

私は物事を試しましたが、明確な画像が得られません。私はポインタに少し弱く、実際には混乱しています!

私が間違っていることを教えてください。リンクされたリストのロジックは忘れてください。セグメンテーション違反が発生している理由を知りたいだけです!

4

6 に答える 6

3

セグメンテーション違反が発生した行を教えてくれなかったので、推測することしかできません。

少なくともこれらの行は私には偽物に聞こえます:

if( start==NULL ) {
    start->next=n;
    current=n;
}

startのときに逆参照してもNULLよろしいですか? それがあなたがやっていることですstart->next。逆参照NULLはセグメンテーション違反を引き起こします。

多分これはあなたが期待するように動作します:

if( start==NULL ) {
    start=n;
    current=n;
}

基本的に、startまだ定義されていない場合は、それを定義すると、現在のアイテムにもなります。

于 2012-08-18T20:45:18.337 に答える
3

多くの間違いがありますが、クラッシュは開始を割り当てていないためです

n->next=NULL;
    if( start==NULL ) {
        start->next=n;
        current=n;
    }
    else {

    current->next=n;
    current=n;

start が null かどうかを確認し、null の場合は start->next it を呼び出して読み取ろうとします。最初に割り当てる必要があります。

于 2012-08-18T20:50:05.080 に答える
2
  1. コンパイル エラー
    n->str=malloc(sizeof(char) * 1000);

    これは定数のアドレス再割り当てです!!!!!配列のアドレスを変更していますか???

  2. 25%の確率で実行される危険な機能。

    gets(n->str);

  3. nullポインタに値を設定!!!

    struct node* start=NULL;....
    start->next=n;

作業コードの例

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

    struct node {
        char *str;
        int nn;
        struct node* next;
        };

    int number;
    struct node* start=NULL;
    struct node* current;
    //function to insert into the list

    void insert() {
        struct node* n;
        n=(struct node*)malloc(sizeof(struct node));
        n->str=(char*)malloc(sizeof(char) * 1000);
        printf("please enter the data that you would like to insert: ");
        scanf("%s",n->str);
        printf("asdasdasdasd");
        n->next=NULL;
        if( start==NULL ) {
            //start->next=n;
            current=n;
        }
        else {

        current->next=n;
        current=n;

        }

        printf("done\n");
    }

    void display() {
        current=start;
        int i=0;
        while( current->next!=NULL ) {
            printf("node%d= %s\n",++i,current->str);
            current=current->next;

        }
        printf("this the end");
        }


    int main() {

        char c;
        int input;

        do {
            printf("Select from the following options:\n"
               "1.Display list\n"
               "2.Add to list\n"
               "3.delete from list\n"
               );


        scanf("%d",&input);
        switch (input) {

            case 1: display(); break;
            case 2: insert(); break;
        //    case 3: delete(); break;
            default : printf("Please select 1 , 2 or 3\n");

            }
        printf( "would you like to continue?(y/n)\n");
        scanf("%s",&c);
        }while(c=='y');

    return 0;
    }
于 2012-08-18T20:52:04.737 に答える
2

問題に関する詳細情報を見つけるには、(当社ではなく) デバッガーを使用する必要があります。

たとえば gdb ( GNU Debuger )。

于 2012-08-18T20:55:47.267 に答える
1
if( start==NULL ) {
        start->next=n;
        current=n;
    }

ここで少し問題があると思います;-)

于 2012-08-18T20:44:45.860 に答える
1

次の行は安全ではありません:

   scanf("%s",&c);

scanf は、あなたの場合、スタックを破壊する終端のヌル文字 '\0' を追加します。

于 2012-08-18T20:51:29.707 に答える