각 노드가 문자열을 저장하는 링크 된 목록을 만들려고합니다. 그러나 각 노드가 모든 동일한 문자열을 저장하는 데 문제가 있습니다. 단일 노드. main()의 끝에서 각 노드에 저장된 단어를 출력하고 항상 전체 목록에 입력 된 마지막 문자열을 반복합니다.링크 된 문자열 목록에는 각 노드에 대해 동일한 문자열이 있습니다.
나는 문자를 문자열로 만들면 각 문자가 올바른 노드에 저장되는 것이므로 완벽하게 작동하기 때문에 어떤 일이 발생하는지 전혀 알지 못합니다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct wordnode {
char *word;
struct wordnode *next;
};
struct wordnode *link = NULL;
void addword(char *aword);
int main(void) {
char *aword;
int i;
for(i = 0; i < 10; i++) {
scanf(" %s", aword);
addword(aword);
}
printf("\n");
for(; link != NULL; link = link->next) {
printf("|%s ", link->word);
}
printf("|\n");
return 0;
}
void addword(char *aword) {
struct wordnode *cur, *prev, *new_node;
new_node = malloc(sizeof(struct wordnode));
new_node->word = aword;
for(cur = link, prev = NULL; cur != NULL; prev = cur, cur = cur->next) {
;
}
new_node->next = cur;
if(prev == NULL) {
link = new_node;
} else {
prev->next = new_node;
}
}
여러 가지 문제가 있습니다. 그것은 초기화되지 않은 포인터를 전달하는'scanf '를 사용하는 방법으로 시작됩니다. 'scanf' 함수는 입력을 기록하기에 충분한 할당 메모리를 필요로합니다. 메모리 자체를 할당하지는 않습니다. –
입력 한 문자열을 복사해야합니다. –
포인터가 마술처럼 메모리를 생성하지 않습니다. 'char * aword'는 초기화되지 않았으며 정의되지 않은 위치를 가리 킵니다. 이와 같이 사용하면 정의되지 않은 동작이 호출됩니다. char 배열을 할당하려면 * char aword [SIZE];를 사용해야한다. 그리고 단순히 포인터 ('new_node-> word = aword;')를 복사해서는 안되며 지시 한 위치를 중복시켜야한다 ('strdup' 참고). 궁극적으로 C에서 할당 된 모든 메모리를 일관되게 * 비우는 것이 좋습니다. C :-) 연습에 행운을 빕니다 ... –