0

私はc(およびこのサイト)にかなり慣れていないため、セグメンテーション違反で多くの問題を抱えています。数値のリンク リストを作成し、値を昇順で挿入するプログラムを作成しています。

     void insert(struct element **head, struct element *new){   
            if((*head)->next == NULL && (*new).i > (*(*head)->next).i){
                (*head)->next = new;
                return;     
            }
            if((*head)->next == NULL && (*new).i < (*(*head)->next).i){
                new->next = (*head)->next;
                *head = new;    
                return;
            }
            struct element *prev = *head;
            struct element *current = (*head)->next;
            while(current->next != NULL){
                if((*new).i < (*current).i){
                    prev = current;
                    current = current->next;
                } else if((*new).i > (*current).i){
                    new->next = current;
                    prev->next = new;
                }
            }
        }
        int main (void){
            struct element **head;
            int value;
            printf("%s", "TEST" );
            printf("%s" , "Please type in an integer value. ");
            scanf("%d" , &value);
            printf("%s", "TEST" );
            do{
                printf("%s", "TEST" );
                struct element *new;
                if((new = malloc(sizeof(struct element))) == NULL){
                return(NULL);
                }
                printf("%s", "TEST" );
                (*new).i = value;
                printf("%s", "TEST" );
                if(head == NULL){
                    *head = new;
                    printList(*head);
                }  else if(value <= 0){
                    printListBackwards(*head);
                }   
                else {

                    insert(head, new);
                    printList(*head);
                }
                } while(value > 0);

挿入などでロジックが正しいかどうかについての助けは必要ありません。プロンプトの後に整数を入力するとすぐにセグメンテーション違反が発生するため、実際にテストする機会さえありませんでした。ファンキーに見えることはわかっていますが、仕様では、構造体 (リンクされたリストの先頭) へのポインターへのポインターを使用する必要があります。

4

3 に答える 3

0
struct element **head;

あなたはそれを望んでいません。その代わり、

struct element *head = NULL;

次に、挿入を呼び出すときに、使用します

insert(&head, new);

他にも多くのバグや不適切な使用法がありますが、それが特定の問題の始まりです。

于 2013-04-05T02:06:13.983 に答える
0

投稿の 2 行目にセグ フォールトが発生しています

if((*head)->next == NULL && (*new).i > (*(*head)->next).i){
    (*head)->next = new;
    return;     
}

セグメンテーション違反は、許可されていないメモリにアクセスしようとしていることを意味します。たとえば、NULL ポインターを逆参照することはできません。

あなたのif発言はこのように評価されます。(*head)->nextnullであることを確認します。

NULL でない場合は、残りをスキップします。

NULL の場合は、次(*head)->nextのそれぞれを に置き換えることができますNULL。これは、次の部分を次の&& (*new).i > (*(*head)->next.i)ように書き換えることができることを意味します&& (*new).i > ((*NULL).i)...

つまり、NULL ポインター値を逆参照しようとしています。

@Parker Kemp の投稿も参照してください。NULL を正しくチェックしているにもかかわらず、その意味を誤解していることが何度もあります。

コードを書き直すこともできますが、このようなチュートリアルやこのようなチュートリアルを行うことで、より多くのメリットが得られると思います

データ構造の図を描き、ポインターの矢印を描くことを強くお勧めします。

于 2013-04-05T01:45:04.300 に答える