728x90
계절 알고리즘 수업을 듣는데, 2일 간은 자료 구조 수업을 한다고 하셔서 이번 주 과제는 연결리스트였다.
지금까지 연결리스트 입력을 숫자로만 받아봤는데, 이번에는 문자열을 받는 과제였다.
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
char* name;
char* depart;
char* grade;
char* gender;
struct Node* next;
} Node;
void insertNode(Node *student, char*name, char*depart, char*grade, char*gender ) {
Node* nextStudent = (Node*)malloc(sizeof(Node));
nextStudent->name = name;
nextStudent->depart = depart;
nextStudent->grade = grade;
nextStudent->gender = gender;
nextStudent->next = student->next;
student->next = nextStudent;
}
int main()
{
Node* student = (Node*)malloc(sizeof(Node));
student->next = NULL;
int i;
for (i = 0; i < 6; i++) {
char name[20], depart[100], grade[20], gender[20];
scanf_s("%s", name, sizeof(name));
scanf_s("%s", depart, sizeof(depart));
scanf_s("%s", grade, sizeof(grade));
scanf_s("%s", gender, sizeof(gender));
insertNode(student, name, depart, grade, gender);
}
Node* curr = student->next;
while (curr != NULL) {
printf("%s %s %s %s\n", curr->name, curr->depart, curr->grade, curr->gender);
curr = curr->next;
}
}
처음 코드이다. 이렇게 하면 반복문에서 새롭게 배열들을 선언하니, 변수의 주소가 계속 바뀔 줄 알았는데, 전혀 아니었다. 변수의 주소가 바뀌지 않아서 계속 입력받을 때마다 첫 노드인 student의 이름, 과 등이 바뀌었다. 반복문 안에서 변수를 새롭게 선언한다고 해서 주소가 변하는 건 아니라는 것을 알게 되었다.
이를 해결하기 위해서는 직접 변수를 구조체 변수에 대입하지 않고, 복사해서 넣어야 한다.
해결한 코드는 다음과 같다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
char name[20];
char depart[100];
char grade[20];
char gender[20];
} Node;
Node* student[6];
int main()
{
int i;
for (i = 0; i < 6; i++) {
char name[20], depart[100], grade[20], gender[20];
scanf_s("%s", name, sizeof(name));
scanf_s("%s", depart, sizeof(depart));
scanf_s("%s", grade, sizeof(grade));
scanf_s("%s", gender, sizeof(gender));
Node* newStudent = (Node*)malloc(sizeof(Node));
strcpy(newStudent->name, name);
strcpy(newStudent->depart, depart);
strcpy(newStudent->grade, grade);
strcpy(newStudent->gender, gender);
student[i] = newStudent;
}
for (i = 0; i < 6; i++) {
printf("%s %s %s %s\n", student[i]->name, student[i]->depart, student[i]->grade, student[i]->gender);
}
}
strcpy로 값을 넣어주면 주소가 같아서 발생하는 문제가 일어나지 않는다.
728x90
'School Lecture Study > 과제를 해보자' 카테고리의 다른 글
[소프트웨어프로젝트] 과제 6 (0) | 2021.06.20 |
---|---|
[자료구조] max heap 응용 (0) | 2021.05.28 |
[자료구조] Family tree 구현하기 (0) | 2021.05.17 |