연결리스트 입력받기 - yeongyeolliseuteu iblyeogbadgi

#include <stdio.h>

#include <malloc.h>

typedef int DATA;

typedef struct NODE {

	DATA data;

	struct NODE *link;

}

NODE;

void print_list(NODE *plist);

int get_integer();

int main(void) {

	NODE *plist;

	NODE *curr = NULL, *prev = NULL;

	int i;

	plist = NULL;

	while(1) {

		i = get_integer();

		if(i < 0)

		break;

		curr = (NODE *)malloc(sizeof(NODE));

		curr->data = i;

		curr->link = NULL;

		if(prev == NULL)

		plist = curr; else prev->link = curr;

		prev = curr;

	}

	print_list(plist);

	return 0;

}

void print_list(NODE *plist) {

	NODE *p;

	p = plist;

	while(p) {

		printf("%d->",p->data);

		p = p->link;

	}

	printf("NULL\n");

}

int get_integer() {

	int num;

	printf("양의 정수를 입력하세요(종료 -1): ");

	scanf("%d",&num);

	return num;

}

5명의 학생 정보를 저장하는 단순연결리스트를 구현해봤습니다.

첫노드, 특정 노드의 앞,뒤, 맨 끝 노드 삽입 등의 경우를 고려하지않고 단순히 입력데이터를 맨 끝에 추가하였습니다.

주의

아래 코드와 같은 구현의 insert함수에서 이중 포인터가 아닌 단순1차원 포인터를 사용하면 정답이 출력되지않습니다.

이유는 1차원 포인터 사용 시 insert함수 내부에서 main문의 head가 아닌 새로운 head변수를 이용하므로

즉, 주소값이 아닌 값을 이용한 call by value 형식이므로 함수내부에서 함수내부의 새로운 head로 연산이 진행될 뿐

main문의 head에는 영향이 없습니다.

즉, 최초에 비어있는 리스트에 1차원포인터로 insert함수에 인자를 넘겨주면 연산 후 main문의 head는 여전히 NULL상태가 됩니다. 

따라서 2차원 포인터로 주소값을 받아 함수 내부에서 head를 변경 시킬 수 있도록 해야합니다.

1차원 포인터를 쓰고싶다면 insert 함수에서 사용한 head를 ListNode*형으로 반환하여 main문에서 사용하면됩니다.

코드

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

#pragma warning(disable:4996)

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef struct {

char name[10];

int age;

int height;

} element;

typedef struct ListNode {     // 노드 타입

element data;

struct ListNode* link;

} ListNode;

// 오류 처리 함수

void error(char* message)

{

fprintf(stderr, "%s\n", message);

exit(1);

}

void insert_last(ListNode** head, element value)

{

ListNode* p = (ListNode*)malloc(sizeof(ListNode));

if (p == NULL)return;

p->data = value; p->link = NULL;

if (*head == NULL)

*head = p;

else

{

ListNode* temp = *head;

while (temp->link != NULL)

temp = temp->link;

temp->link = p;

}

}

void print_list(ListNode* head)

{

for (ListNode* p = head; p != NULL; p = p->link)

printf("이름:%s 나이:%d 키%d \n", p->data.name, p->data.age, p->data.height);

}

// 테스트 프로그램

int main(void)

{

ListNode* head = NULL;

element data;

//5명의 학생 정보 입력받기

for (int i = 0; i < 5; i++)

{

scanf("%s %d %d", data.name, &(data.age), &(data.height));

insert_last(&head, data);

}

print_list(head);

return 0;

}

cs

결과