0

私は C で単一リンク リストに取り組んでいます。これがこれまでに書いたものです。

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

struct Node{
    int value;
    struct Node *next; 
};


struct Node* init()
{
   struct Node* head=NULL;
   head=malloc(sizeof(struct Node));
    head->value=-1;
    return head;

}



int length(struct Node* head)
{
    struct Node* current=head;
    int length=0;
    while(current!=NULL)
    {
        length++;
        current=current->next;

    }
    return length;

}


void print(struct Node* head)
{
   int i=0;
   int len=length(head);
   for(i=0;i<len;i++)
   {
    printf("%d%d",i,head[i].value);
    printf("\n");


   }


}




 struct Node* insert(int data,struct Node* head)
 {
    struct Node* current=NULL;
    if(length(head) > 0)
    {
        int val=head->value;        
        if (val==-1)
        {
            head->value=data;
            head->next=NULL;

        }
        else
        {
           current=malloc(sizeof(struct Node));
           current->value=data;
           current->next=head;
           head=current;


      }

  }
   else
  {
    printf("List is empty");

  }

  return head;


}

int main() 
{

/* printf("Hello"); */
struct Node *head=init();

head=insert(20,head);
head=insert(30,head);
head=insert(40,head);

print(head);
printf("%d",length(head)); 

return 0;

}

私が得る出力値は次のとおりです。 インデックス値 0 40 1 0 2 0

長さは 3 です。ポインタ操作でここで間違っていることを把握できません。

4

4 に答える 4

4

明らかな問題の 1 つは、init で NULL の隣に設定しないことです。これは、空のリストの長さをチェックするときに失敗します。

しかし、あなたの本当の問題は印刷機能です

次のものは使用できません。

head[i].value

その表記法は配列に対してのみ有効です。各メンバーを見つけるには next を使用する必要があります

于 2012-09-23T06:07:09.907 に答える
1

ここ:

    for (i = 0; i < len; i++)
    {
        printf("%d%d", i, head[i].value);
        printf("\n");
    }

head = head->nextで行うのと同じ方法で、あるノードから別のノードに進む必要がありますlength()head[i]それをしません。

なぜあなたinit()insert()が不必要に複雑なのかは不明であり、私はその理由を推測しようとさえしたくありません。私はより良いものを提案したいと思いinsert()ますinit()

struct Node* insert(int data, struct Node* head)
{
    struct Node* current;

    current = malloc(sizeof(struct Node));
    current->value = data;
    current->next = head;

    return current;
}

そして、あなたはこれを行います:

int main(void)
{
    struct Node *head = NULL;

    head = insert(20, head);
    head = insert(30, head);
    head = insert(40, head);

    print(head);
    printf("%d", length(head));

    return 0;
}
于 2012-09-23T06:21:28.560 に答える
1

Init 関数は、Next を NULL に設定する必要があります

struct Node* init()
{
   struct Node* head=NULL;
   head=malloc(sizeof(struct Node));
    head->value=-1;
    head->next=NULL;
    return head;

}

それ以外の場合、 length の最初の呼び出しは未定義の結果 (または GPF ) を返します。

于 2012-09-23T06:13:00.210 に答える
0

この表記head[i].valueは配列に対してのみ有効であり、リンクされたリストに対しては有効ではありません。配列とリンクされたリストは完全に異なります。配列へのメモリの割り当ては事前に計画されていますが、リンクされたリストは動的です。これが、リンクされたリストにポインターを使用する理由です。

初めてinit()呼び出したときにループが無限に実行される原因となる null を割り当てませんでした。length()

印刷機能の変更されたコードを投稿しています:

void print(struct Node* head)
{
    int i=0;
    int len=0;
    struct Node* current=head;
    for(i=0;i<len;i++)
    {
        printf("%d %d",i,current->value);
        print("\n");
        current=current->next;
    }
}
于 2012-09-23T07:45:36.267 に答える