2016-09-16 9 views
0

scanfを使用してリンクリストのcharポインタに複数回入力しようとしています。新しい入力を入力するたびにすべてのフィールドにnameの変更が加えられます。ここリンクリストcharポインタscanf入力

は私のリンクリストである:ここ

struct node { 
struct node *next; 
int level; 
char *name; 
}; 

は私の主な機能です:

struct node *root = NULL; 
while (1) { 
    char arrays[12]; 
    char *n; 
    n = arrays; 
    int i = NULL; 
    printf("Enter level: "); 
    scanf("%i", &i); 
    printf("\nEnter name: "); 
    scanf("%s", arrays); 
    insert(&root, i, n, compare); 
    display(root); 
    } 

挿入機能:基本的に

void insert(struct node **head, const int level, char *name, int(*cmp)(struct node *l, struct node *r)) 
{ 
    struct node *new; 
    new = malloc(sizeof *new); 
    new->level = level; 
    new->name = name; 

    /* Find the insertion point */ 
    for (; *head != NULL; head = &(*head)->next) 
    { 
     if ((*head)->level > level || (*head)->level == level && cmp(*head, new) > 0) { break; } 
    } 
    new->next = *head; 
    *head = new; 
} 

I入力の場合:

input:  | expected output: | actual output: 
1  smith | 1  john   | 1  alice 
1  john | 1  smith   | 1  alice 
3  malek | 2  alice   | 2  alice 
2  alice | 3  malek   | 3  alice 

注:私はscanfなどせずに、手動でデータを入力していたときに期待通りの機能が働いている:

insert(&root, 1, "Abbas", compare); 
insert(&root, 1, "Calbass", compare); 
+0

私は尋ねることは許してもらえますが、 'main()'メソッドの無限ループが終わることはありません。また、 'insert'関数のコードを表示してください。 –

+0

挿入機能と表示機能のコードを提供しています.... – Rupsingh

+0

@TimBiegeleisenあなたは正しいですが、無限ループはデバッグのためだけでした。 – Poorya

答えて

1

このライン:

new->name = name; 

だけでポインタの値を変更する - それはありません文字列をコピーしません。したがって、リンクリストのすべての要素はarraysを指します。したがって、arraysの内容を変更すると、リスト内のすべての要素が変更されたように見えます(しかし、変更されていないように見えます)。

あなたはおそらく必要があります。

strcpyの(新規作成]> [名、名);

そして、文字列の場合はmallocのメモリも必要です。

ような何か:

ところで
new = malloc(sizeof *new); 
new->level = level; 
new->name = malloc(12 * sizeof(char)); // Memory for the string 
strcpy(new->name, name);    // Copy the input string 

変更

insert(&root, i, n, compare); 

insert(&root, i, arrays, compare); 

へとn変数を削除します。機能は同じですが、コーダーは読みやすく理解しやすいです。

+0

thanks mateに基づいて書式文字列を作成したいとします。魅力的に働いた – Poorya

0

arraysへのポインタをリストに挿入しているように見えます。あなたが書くとき:

insert(&root, 1, "Abbas", compare); 

何も文字列リテラル「アッバス」を変更しないので、それが仕事だが、arraysのコンテンツはscanf("%s", arrays);が実行されるたびに上書きされます。 char * nameをchar name [12]に変更し、入力を直接のノードに読み込むことを検討してください。

関連する問題