2017-10-25 12 views
1

従業員IDと名前を格納するリンクリストを作成しました。リンクされたリストを印刷中にエラーが発生しました

私はそれを印刷しようとしたときに従業員の名前ではなくidだけを表示し、ユーザーが-1を入力して名前を聞いていないときにプログラムを終了して、単にプログラムを終了してIDと名前私は現在、あなたが実際にname変数に読み込む

#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
struct node 
{ 
    int id; 
    char name[20]; 
    struct node *next; 
}; 

struct node *create() 
{ 
    struct node *p, *r, *n; 
    int s, k; 
    char name[20]; 
    s = sizeof(struct node); 
    printf("Linked List\n"); 
    printf("Enter id:"); 
    scanf("%d", &k); 
    printf("Enter name:"); 
    scanf("%s", name); 
    p = r = NULL; 
    while(k!=-1) 
    { 
     n = (struct node *)malloc(s); 
     n->id = k; 
     n->next = NULL; 
     if(r == NULL) 
      r = n; 
     else 
      p->next=n; 
     p=n; 
     printf("Enter the Id or-1 to stop:"); 
     scanf("%d", &k); 
     printf("Enter the name "); 
     scanf("%s", name); 
    } 
    return(r);  
} 

void display(struct node *r) 
{ 
    printf("\nId    Name \n"); 
    while(r != NULL) 
    { 
     printf("\n %d", r->id); 
     printf("\n %s", r->name); 
     r = r->next;  
    } 
} 

int main() 
{ 
    struct node *ptr; 
    ptr = create(); 
    display(ptr); 
} 
+3

あなたは読み込みの名前を保存しません... –

+1

横:あなたのプログラムの流れは、終了コード-1を入力した後にユーザーが名前を入力するという点で奇妙です。 –

+1

コードのインデントを修正してください。 –

答えて

0

私のコードをコンパイルするため++ DEVCを使用していますが、あなたはあなたの構造でそれを移動しないでください。つまり、あなたが割り当てた構造体を直接読み込むことはできますが、ユーザ入力が大きすぎる(19文字を超える)ときにバッファがオーバーフローしないよう配慮しています。

これは次のようになります。あなたが漏れないように、ボーナスとして

#include<stdio.h> 
#include<stdlib.h> 
struct node { 
    int id; 
    char name[20]; 
    struct node *next; 
}; 

struct node *create(void) { 
    struct node *p, *r; 
    printf("Linked List\n"); 
    p = r = NULL; 
    while (1) { 
     int id; 
     printf("Enter the Id or-1 to stop:"); 
     scanf("%d", &id); 

     if (id == -1) 
      break; // user asked to leave 

     struct node *n = malloc(sizeof(*n)); 
     // if (n == NULL) exit(-1); as you prefere... 
     n->id = id; 
     printf("Enter the name "); 
     // careful of buffer overflow here 
     scanf("%19s%*[^\n]", n->name); 
     n->next = NULL; 

     if (r == NULL) 
      r = n; 
     else 
      p->next = n; 
     p = n; 
    } 
    return r; 
} 

void delete(struct node *r) { 
    while (r != NULL) { 
     struct node *n = r; 
     r = r->next; 
     free(n); 
    } 
} 

void display(const struct node *r) { 
    printf("\nId    Name \n"); 
    while (r != NULL) { 
     printf("%d   %s\n", r->id, r->name); 
     r = r->next; 
    } 
} 

int main(int argc, char **argv) { 
    struct node *ptr = create(); 
    display(ptr); 
    delete(ptr); 
    return 0; 
} 

は、私はまた、無料のパーツを追加しました。

関連する問題