0

ここで .h プロトタイプを使用して双方向リンク リストの実装を作成しました。ターミナルに値を入力し始めるまで、すべて正常に動作します。2 番目の値を入力するとセグメンテーション違反が発生しますが、1 つの値を使用しただけでは正常に実行されます。何度かやり直しましたが、間違いが見つかりません。エラーが発生する理由を見つけるのを手伝ってもらえますか?

.h ファイルは次のとおりです。

#include <stdio.h>
typedef struct node Node;

struct node
{
    int d;
    Node *link;
}*head,*current,*prev;

int num_nodes;

void linked_list_init(int data);
void linked_list_sort();
void linked_list_print();

.c ファイルは次のとおりです。

#include "link.h"
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

void main(){

    int n,e,i;
    printf("How many numbers do you want to sort: ");
    scanf("%d",&e);
    for(i=0;i<e;i++){
        printf("Enter number: ");
        scanf("%d",&n);
        linked_list_init(n);
    }
    linked_list_sort();
    printf("The sorted numbers are: ");
    linked_list_print();
}

void linked_list_init(int data){
    Node *prev=0,*next=0;

    current=(Node*)malloc(sizeof(Node));    
    if(head==0)
    {
        head=current;
        current->d=data;
        current->link=0;
        prev=current;

    }
    else{
        current->d=data;
        current->link=0;
        prev->link=current;
        prev=current;
    }
    }

void linked_list_sort(){
    int i,j;
    Node *prev=0,*next=0;

    current=head;
    prev=head;
    next=head->link;

    for(i=0;i<num_nodes-1;i++)
    {
        for(j=0;j<num_nodes-i-1;j++)
        {
            if(current->d>next->d)
            {
                current->link=next->link;
                next->link=current;
                if(current==head)
                {
                    head=next;prev=next;
                }
                else
                {
                    prev->link=next;prev=next;
                }
                if(next!=0) //check whether final node is reached
                    next=current->link;

            }
            else //move each node pointer by one position
            {
                prev=current;
                current=next;
                next=current->link;
            }

        }
        //next iteration
        current=head;
        prev=head;
        next=current->link;
    }

}

void linked_list_print(){
    current=head;
    while(current!=0){
        printf("%d ",current->d);
        current=current->link;
    }
}
4

4 に答える 4

5

問題は、関数内のローカル宣言でグローバル変数をマスクしていることです。これはprev、関数内の変数がグローバル変数と同じではないprevことを意味します。

それとは別に、ヘッダーファイルが複数のファイルに含まれている場合、それらは互いに衝突するため、ヘッダーファイルに変数定義を配置しないでください。

リストに新しいノードを挿入するときにカウンターを増やさないという、もう1つの小さなバグもあります。

于 2013-02-06T04:18:04.033 に答える
1

あなたの場合、ヘッダーファイルでグローバルに宣言しているので、 headを初期化する必要はありませ0ん(ヘッダーファイルで変数を宣言するのは良い習慣ではありませんが)。ここでの問題は、関数prev内のノードを 再定義していることvoid linked_list_init(int data)です。prevそこからノードを削除するだけで、すべてが正常に機能します。

チップ:

head->ファイル内prevcurrentノードを宣言し.cます。

->NULL代わりに使用するか、単に代わりに0 使用することもできます(void *) 00

于 2013-02-06T05:16:14.140 に答える
0

プログラムで使用されるグローバル変数は初期化されていないため、値がガベージになりがちです。また、ノードの次の定義をお勧めします

struct node {
    int d;
    node *llink; // Left Link
    node *rlink; // Right Link
};
typedef struct node* Node;
Node head = NULL; // Head node 

また

void linked_list_init(int data) {

    Node newnode = (Node) malloc(sizeof (Node));
    newnode->d = data;

    Node curr;

    if (head == NULL) {

        newnode->llink = NULL;
        newnode->rlink = NULL;
        head = newnode;

    } else {
        curr = head;
        while (curr->rlink) {
            curr = curr->rlink;
        }
        curr->rlink = newnode;
        newnode->rlink = NULL;
        newnode->llink = curr;       
    }
}

上記は list の最後に要素を追加し続けます。

次のように簡単にデータを印刷できます。

void linked_list_print() {
    Node curr;
    curr = head;
    while (curr) {
        printf("Element Data : %d", curr->d);
        curr = curr->rlink;
    }
}
于 2013-02-06T05:07:32.373 に答える
0

linked_list_init 関数が呼び出されるたびに *prev と *current を作成して初期化しているようです。したがって、2 番目の値を入力した後、2 番目の if ループは、実際には 0 に設定されている prev を使用しています。

あなたがしようとしているのは、*prev、*head、*current をグローバル変数として使用することだと思います (ヘッダー ファイルで宣言しているため)。externソースファイルでそれらを宣言するために使用するだけで、うまくいくはずです。

于 2013-02-06T04:24:22.447 に答える