2017-11-11 3 views
-1

誰かが私のコードがリンクリストの最後の値を印刷しているだけなので、実際にはコーディングがうまくいかないので教えてください。リンクされたリストが正しく表示されない理由を誰かが知ることができますか? (Cプログラミング)

これはコードである:

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

typedef struct node { 
    int data; //element 
    struct node * next; //address of next node 
} node_t; 

node_t * create(int n); 
void display(node_t *head); 

int main(int argc, char *argv[]) { 
    int n=0; 
    node_t * HEAD=NULL; 
    printf("Enter number of nodes: "); 
    scanf("%d",&n); 
    HEAD=create(n); 
    display(HEAD); 
    return 0; 
} 

node_t * create(int n) { 
    node_t * head=NULL; 
    node_t * temp=NULL; 
    node_t * p=NULL; 
    int i; 

    for (i=0; i<n; i++) { // this is just reading the nodes 
    temp=(node_t*)malloc(sizeof(node_t)); 
    printf("\n Enter the data for node num %d: ",i+1); 
    scanf("%d",&(temp->data)); 
    temp->next=NULL; 
    } 
    if (head==NULL) { //if list is item 
    head = temp; 
    } else { // this is linking the items. 
    p =head; 
    while (p->next !=NULL) { 
     p=p->next; 
     p->next=temp; 
    } 
    } 
    return head; 
} 

void display(node_t *head) { 
    node_t *p = head; 
    while (p !=NULL) { 
    printf("\n%d->",p->data); 
    p=p->next; 

    } 
} 

これが出力される。

は、ノード数を入力:3

ノードNUM 1のデータを入力してください:2

ノードnumのデータを入力します。2:4

ノードnumのデータを入力します3:1

の1->

あなたがやりたいこと
+0

あなたはこのコードを自分で作成しましたか? – coderredoc

+0

種類、youtubeのチュートリアルの笑いに従ってください。ああ、私はmallocやもので良くはありません。どのように私はこれを修正するのですか? – Rita

+0

'p-> next = temp;'を何回設定しますか?あなたがするとき、それぞれの 'p> next'はどうなりますか? –

答えて

2

あなたが何をしたか何かであります何か他のものです。

割り当てをしてから、その参照を失っています。そして、再割り当て。リンクリストのheadはまだ空です。あなたはそれを渡し、何かが現れるのを待つ。何も起こりません。

node_t * ttemp; 
for (i=0; i<n; i++) { // this is just reading the nodes 
    temp=malloc(sizeof(node_t)); 
    if(temp == NULL){ 
     fprintf(stderr,"error in malloc"); 
     exit(1); 
    } 
    printf("\n Enter the data for node num %d: ",i+1); 
    scanf("%d",&(temp->data)); 
    temp->next=NULL; 
    if(i == 0) head = temp,ttemp=temp; 
    else{ 
     ttemp->next = temp; 
     ttemp=ttemp->next;  
    } 
    } 

    return head; 

ここでは、メモリが割り当てられ、参照が格納されます。ヘッドが先頭に変更され、先頭を指します。

割り当てたメモリを解放するのを忘れないでください。リンクされたリストのメモリを解放するときは、freeのノードのメモリはそれぞれ、headのメモリだけではありません。

mallocの結果もキャストしないでください。

node_t * create(int n) { 
    node_t * head, *temp, *ttemp, *p; 
    int i; 

    for (i=0; i<n; i++) { // this is just reading the nodes 
    temp=malloc(sizeof(node_t)); 
    if(temp == NULL){ 
     fprintf(stderr,"error in malloc"); 
     exit(1); 
    } 
    printf("\n Enter the data for node num %d: ",i+1); 
    scanf("%d",&(temp->data)); 
    temp->next=NULL; 
    if(i == 0) head = temp,ttemp=temp; 
    else{ 
     ttemp->next = temp; 
     ttemp=ttemp->next;  
    } 
    } 
    return head; 
    } 

また、このリストを持っている必要があります。あなたがリストを使って作業を終えたときにも呼び出す必要があります。

void freemem(node_t* head){ 
    node_t *temp; 
    while(head){ 
     tenp=head; 
     head=head->next; 
     free(temp); 
    } 
} 

完全なコードは次のようになります: - 以下のコードの場合

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

typedef struct node { 
    int data; //element 
    struct node * next; //address of next node 
} node_t; 

node_t * create(int n); 
void display(node_t *head); 
void freemem(node_t* head){ 
    node_t *temp; 
    while(head){ 
     temp=head; 
     head=head->next; 
     free(temp); 
    } 
} 
int main(int argc, char *argv[]) { 
    int n=0; 
    node_t * HEAD=NULL; 
    printf("Enter number of nodes: "); 
    scanf("%d",&n); 
    HEAD=create(n); 
    display(HEAD); 
    freemem(HEAD); 
    HEAD=NULL; 
    return 0; 
} 

node_t * create(int n) { 
    node_t * head, *temp, *ttemp, *p; 
    int i; 

    for (i=0; i<n; i++) { // this is just reading the nodes 
    temp=malloc(sizeof(node_t)); 
    if(temp == NULL){ 
     fprintf(stderr,"error in malloc"); 
     exit(1); 
    } 
    printf("\n Enter the data for node num %d: ",i+1); 
    scanf("%d",&(temp->data)); 
    temp->next=NULL; 
    if(i == 0) head = temp,ttemp=temp; 
    else{ 
     ttemp->next = temp; 
     ttemp=ttemp->next;  
    } 
    } 

    return head; 
} 

void display(node_t *head) { 
    node_t *p = head; 
    while (p !=NULL) { 
    printf("\n%d->",p->data); 
    p=p->next; 

    } 
} 
+0

tempがNULLの場合、なぜ終了する必要がありますか?また、私はちょうど自由(頭)か、どうやって小さなノードを解放するのですか? – Rita

+0

@Rita:メモリが割り当てられていないことを確認しているためです。あなたはプログラムを終了させるでしょう。 – coderredoc

+0

@Rita:また、私が言ったことを実装しようとしました... 'freemem'を使ってデバッガを使うことを学ぶ – coderredoc

2

for (i=0; i<n; i++) { // this is just reading the nodes 
    temp=(node_t*)malloc(sizeof(node_t)); 
    printf("\n Enter the data for node num %d: ",i+1); 
    scanf("%d",&(temp->data)); 
    temp->next=NULL; 
    } 

あなたは何度も何度もtempを割り当て、最後のものだけを使用しています。

私の私がお勧め:

node_t* head = NULL; 
    node_t* tail = NULL; 
    for (i=0; i<n; i++) { // this is just reading the nodes 
     temp=(node_t*)malloc(sizeof(node_t)); 
     printf("\n Enter the data for node num %d: ",i+1); 
     scanf("%d",&(temp->data)); 

     if (head == NULL) { 
      head = temp; // first one 
     } 
     else { 
      tail->next = temp; 
     } 
     tail = temp; 
    } 
    return head; 
+0

あなたはテールを追加しました。私はまだ少しテールが一時的なものを指していることを少し混乱させましたが、それは一時的なものになりますか? – Rita

+0

ループが繰り返されるたびに、新たに割り当てられたノードの 'temp'がリストの末尾に追加されます。したがって、リストポインタの既存の終わり、 'tail'は、リストの終わりを指し示す必要があります。 – selbie

0

create

for (i=0; i<n; i++) { // this is just reading the nodes 
    temp=(node_t*)malloc(sizeof(node_t)); 
    printf("\n Enter the data for node num %d: ",i+1); 
    scanf("%d",&(temp->data)); 
    temp->next=NULL; 
    // } this needs to go to end of loop 
    if (head==NULL) { //if list is item 
    head = temp; 
    } else { // this is linking the items. 
    p = head; 
    while (p->next !=NULL) { 
     p=p->next; 
    } // one step up is here 
     p->next=temp; 
    //} This needs to go one step up 
    } 
} // <-- end of loop is here 

、ここで括弧'}'を閉じる置き忘れの問題だけではあなたの同じロジックが

node_tです*(int型n)を作成します{

node_t * head=NULL; 
    node_t * temp=NULL; 
    node_t * p=NULL; 
    int i; 

    for (i = 0; i < n; i++) { // this is just reading the nodes 
      temp = malloc(sizeof(node_t)); 
      if(temp) { 
        printf("\n Enter the data for node num %d: ",i+1); 
        scanf("%d",&(temp->data)); 
        temp->next = NULL; 
        if (head == NULL) { //if list is item 
          head = temp; 
        } else { // this is linking the items. 
          p = head; 
          while (p->next) 
            p=p->next; 
          p->next=temp; 
        } 
      } else { 
        printf("\n oops malloc !! "); 
      } 
    } 
    return head; 

}

関連する問題