범용큐, 범용스택을 구현할 줄 알아야 되는데.. 흠..
큐는 FIFO 이고, 스택은 LIFO 입니다.
링크드 리스트로 구현하면 realloc 필요없습니다.
큐는 자료를 tail(rear) 에 삽입하고, head(front) 에서 빼옵니다.
뒤에서 넣고 앞으로 나오는 빨대(대롱)같은거죠.
반면 스택은 통 같은 겁니다. 통에 넣고 빼면 맨 마지막에 넣은게 먼저 빠지죠.
그러면 큐를 수정하여 스택을 만들 수 있는데,
자료를 tail(rear) 에 넣고, tail(rear) 에서 꺼내면 스택이 되겠죠?
스택 자료구조는 제가 아직 필요하지 않아서 만들지를 않았습니다. 님께서 함 만들어보세요.
structure frame:
data : item
next : frame or nil
이것은 TianNode 에 해당하는 부분입니다.
structure stack:
head : frame or nil
size : integer
이것은 struct TianStack ... 이런 구조체를 만들면 되겠고,
procedure initialize(stk : stack):
stk.head ← nil
stk.size ← 0
이것은 TianStack *tian_stack_new () 함수를 만들면 되고,
대응되는 void tian_stack_free (TianStack *stack) 함수도 만들어주면 좋겠죠?
procedure push(stk : stack, x : item):
newhead ← new frame
newhead.data ← x
newhead.next ← stk.head
stk.head ← newhead
stk.size ← stk.size + 1
void tian_stack_push (TianStack *stack, void *data) 이런 함수를 만들어야겠고,
procedure pop(stk : stack):
if stk.head = nil:
report underflow error
r ← stk.head.data
stk.head ← stk.head.next
stk.size ← stk.size - 1
return r
void *tian_stack_pop (TianStack *stack) 이런 함수를 만들면 되겠죠.
void * 자료형은 모든 자료형을 다룰 있습니다.
소스코드를 exam.c 라 저장하고 터미널에서 단순히 make exam 이라고 치면 exam 이라는 실행파일이 만들어집니다.
아래처럼 실행시킵니다. 귀찮아서 a, b, c, d, e 를 입력했습니다.
님께서는 TianQueue 소스코드 설명할 때 사용한 main() 함수와 TianStack 소스코드 설명할 때 사용한 main() 함수를 수정해야겠죠. main() 함수는 1개만 존재해야 합니다. 그리고
free_func 함수를 지정하도록 했는데, 그것 때문에 이중 free 문제가 발생할 수 있습니다.
그렇다고해서 free_func 를 지정하지 않으면 student item 을 일일이 메모리 해제(free)해줘야 하는 불편함이 따르겠습니다.
이렇게 하면 어떤 문제가 발생할 것 같습니까?
이런 문제를 해결하는 방법으로 ref_count 를 두는 방법이 있습니다. 나중에 서서히 알아보시고,
초보자분께 그런것까지 바라기는 무리인 거 같고, 일단은, free_func 를 NULL 로 지정해서 사용하시되,
student 를 일일이 메모리 해제(free)해줘야 합니다. 공부용 예제 코드에서는 안 해도 별 문제가 안 됩니다만,
나중에 계속 c 공부하시면서 메모리 할당/해제에 대해 신경을 쓰셔야 됩니다.
포인터 모르시면 c 책에서 포인터 부분만 열심히 보세요. 봐서 이해 안 되면 도서관에 다른 c 책 펴서 포인터 부분을 열심히 보세요. 그렇게 포인터 익숙해진 후, c 포인터 예제 책이 있습니다. 그 책으로 포인터 열심히 보세요.
나중에 결국 컴퓨터 구조를 배우시게 될텐데... 아... 진작에 배울 걸.. 아하~~ 이 생각 들겁니다.
[hodong@nimfsoft ~]$ ./exam
이름1: a
학번1: a
이름2: b
학번2: b
이름3: c
학번3: c
이름4: d
학번4: d
이름5: e
학번5: e
-- stack -------------------------------
e: e
d: d
c: c
b: b
a: a
-- stack after tian_stack_pop (stack) --
d: d
c: c
b: b
a: a
중간중간에 printf 넣어보셔요.
제대로 하려면 디버거 사용법도 공부해 보시고요.
컴파일 할 때 에러 메시지 뿐 아니라 경고 메시지도 보시고요.
scanf_s 함수를 꼭 써야 하나요? MS 전용인 거 같은데...
http://www.cplusplus.com/forum/beginner/2300/
세벌 https://sebuls.blogspot.kr/
범용큐, 범용스택을 구현할 줄 알아야 되는데.. 흠.
범용큐, 범용스택을 구현할 줄 알아야 되는데.. 흠..
큐는 FIFO 이고, 스택은 LIFO 입니다.
링크드 리스트로 구현하면 realloc 필요없습니다.
큐는 자료를 tail(rear) 에 삽입하고, head(front) 에서 빼옵니다.
뒤에서 넣고 앞으로 나오는 빨대(대롱)같은거죠.
반면 스택은 통 같은 겁니다. 통에 넣고 빼면 맨 마지막에 넣은게 먼저 빠지죠.
그러면 큐를 수정하여 스택을 만들 수 있는데,
자료를 tail(rear) 에 넣고, tail(rear) 에서 꺼내면 스택이 되겠죠?
스택 자료구조는 제가 아직 필요하지 않아서 만들지를 않았습니다. 님께서 함 만들어보세요.
그리고 위 질문자님, return 에서 포인터를
그리고 위 질문자님, return 에서 포인터를 넘겨주고, 함수 return 형이 포인터가 되어야 하는데... 포인터에 대한 이해가 없으신거 같네요. c 책에서 포인터 부분 펴서 보세요. 포인터 모르면 위에 TianQueue 가 뭐하는 건지 아예 이해 안 되요
위에 stack 설명이 잘못된 부분이 있습니다.
위에 stack 설명이 잘못된 부분이 있습니다.
위키 문서를 보니 tail 에 넣고 tail 에서 빼는게 아니라,
head 에 넣고 head 에서 뺍니다.
https://en.wikipedia.org/wiki/Stack_(abstract_data_type)
스택을 구현하면 다음과 같습니다.
스택을 구현하면 다음과 같습니다.
아래 코드는 TianQueue, TianStack 를 포함한 소스코드입니다.
main() 함수에 TianStack 을 활용한 예가 있습니다.
소스코드를 exam.c 라 저장하고 터미널에서 단순히 make exam 이라고 치면 exam 이라는 실행파일이 만들어집니다.
아래처럼 실행시킵니다. 귀찮아서 a, b, c, d, e 를 입력했습니다.
님께서는 TianQueue 소스코드 설명할 때 사용한 main() 함수와 TianStack 소스코드 설명할 때 사용한 main() 함수를 수정해야겠죠. main() 함수는 1개만 존재해야 합니다. 그리고
free_func 함수를 지정하도록 했는데, 그것 때문에 이중 free 문제가 발생할 수 있습니다.
그렇다고해서 free_func 를 지정하지 않으면 student item 을 일일이 메모리 해제(free)해줘야 하는 불편함이 따르겠습니다.
이렇게 하면 어떤 문제가 발생할 것 같습니까?
이런 문제를 해결하는 방법으로 ref_count 를 두는 방법이 있습니다. 나중에 서서히 알아보시고,
초보자분께 그런것까지 바라기는 무리인 거 같고, 일단은, free_func 를 NULL 로 지정해서 사용하시되,
student 를 일일이 메모리 해제(free)해줘야 합니다. 공부용 예제 코드에서는 안 해도 별 문제가 안 됩니다만,
나중에 계속 c 공부하시면서 메모리 할당/해제에 대해 신경을 쓰셔야 됩니다.
포인터 모르시면 c 책에서 포인터 부분만 열심히 보세요. 봐서 이해 안 되면 도서관에 다른 c 책 펴서 포인터 부분을 열심히 보세요. 그렇게 포인터 익숙해진 후, c 포인터 예제 책이 있습니다. 그 책으로 포인터 열심히 보세요.
나중에 결국 컴퓨터 구조를 배우시게 될텐데... 아... 진작에 배울 걸.. 아하~~ 이 생각 들겁니다.
열공하십쇼
만들고 보고 아래 함수에 메모리 누수 버그가 있네요.
만들고 보고 아래 함수에 메모리 누수 버그가 있네요. 어떻게 고쳐야 할까요?
아래처럼 고쳐줍니다.
고친 후 테스트해보니 잘 되네요 ㅋㅋ
scanf_s("%d %c ", st[i].no,
scanf_s("%d %c ", st[i].no, st[i].name);
위 코드를 아래와 같이 수정하시고 실행해 보세요.
scanf_s("%d %s", &(st[i].no), st[i].name, sizeof(st[i].name));
아래 함수는 리턴값이 없는데 에러 안 나요?
아래 함수는 리턴값이 없는데 에러 안 나요?
댓글 달기