2016-09-16 7 views
0

scanf을 사용하여 연결된 목록의 char 포인터에 여러 번 입력하려고합니다. 그러나 새 입력을 입력 할 때마다 모든 필드에서 name 변경됩니다.linked list char pointer scanf 입력

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); 
    } 

삽입 기능 : 여기

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

내 주요 기능입니다 : 여기

내 링크 목록입니다 기본적으로

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 메모리가 필요합니다. 같은

뭔가 : BTW

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

감사 메이트를 기반으로 포맷 문자열을 만들고 싶습니다. 매력처럼 일했다. – Poorya

0

arrays에 대한 포인터를 목록에 삽입하는 것 같습니다. 당신이 쓸 때 :

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

아무것도 문자열 리터럴 "압바스"를 수정하지 않기 때문에이 작품은, 그러나 arrays의 내용이 scanf("%s", arrays);이 실행될 때마다 덮어 씁니다. char * 이름을 char name [12]로 변경하고 입력을 직접 노드로 읽는 것을 고려하십시오.