안녕하세요. 몇날 며칠을 머리 싸매다 답답해서 질문드리는 모 대학 2학년 재학중인 소프트웨어 학부생입니다.
1학년때도 설렁설렁 따라가다 포인터부턴 손놓고..그러고 2학년때도 조금 공부하다 군대를 갔다와버려서 머릿속이 새하얗네요.
지식의 한계를 느끼고 이곳 저곳 검색해봐도 속시원한 답이 없어 이 곳에 질문을 올립니다.
문제는 다음과 같습니다.
참고하라는 예제소스는 우선 파일로 올렸습니다.
일단 최대한 만들어 본건 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_SIZE 10 // 이름이 저장될 크기 지정
typedef struct stackNode{ // 스택의 노드를 구조체로 정의
char name[MAX_NAME_SIZE];
int student_no;
struct stackNode *link;
} stackNode;
stackNode *top = NULL; // 스택의 top 노드를 지정하기 위해 포인터 top 선언
// 스택의 top에 원소를 삽입하는 연산
void push(stackNode *name, char *n, int num) {
stackNode* temp = (stackNode *)malloc(sizeof(stackNode));
strcpy(temp->name, n);
temp->student_no = num;
temp->link = top; // 삽입 노드를 top의 위에 연결
top = temp; // top 위치를 삽입 노드로 이동
}
// 스택의 top에서 원소를 삭제하는 연산
void pop() {
stackNode name;
stackNode* temp = top;
if (top == NULL) { // 스택이 공백 리스트인 경우
printf("\n\n Stack is empty !\n");
return 0;
}
else{
n = temp->name;
top = temp->link; // top 위치를 삭제 노드 아래로 이동
free(temp); // 삭제된 노드의 메모리 반환
}
}
// 스택의 top 원소를 검색하는 연산
void peek_top() {
if (top == NULL) { // 스택이 공백 리스트인 경우
printf("\n\n Stack is empty !\n");
return 0;
}
else { // 스택이 공백 리스트가 아닌 경우
return(top->data); // 현재 top의 원소 반환
}
}
// 스택의 원소 전체 출력
void printStack() {
stackNode *temp = top;
printf("name stdudent_no \n\n");
while (p) {
printf("%s %d", p->name, p->student_no);
p = p->link;
}
}
int main(void) {
push("니은", 100);
push("디귿", 101);
push("미음", 102);
printStack(); // 현재 스택 출력
getchar();
printf("스택의 TOP에 있는 학생 이름 출력\n");
peek_top();
getchar();
printf("미음이 제거하고 리을이 추가후 전체 출력\n");
pop(); //맨 나중 미음 제거
push("리을", 103);
printStack();
getchar();
retrun 0;
}
뭔가 할 수 있을 것 같은데 안 돌아가니 미치겠습니다.
¹®Á¦ º¸¸é °£´ÜÇÑ ½ºÅà ±¸¼ºÀε¥...
½ºÅà ±¸¼º½Ã »õ·Î¿î °ªÀ» Áß°£¿¡ ÀÔ·ÂÇÏ·Á¸é Ãß°¡Àü ÀÚ·á±îÁö »© ³»¾î ±â¾ïÇÏ°í Ãß°¡µÈ Çà »ðÀÔÈÄ ±× ÀÌÈÄ ÀÚ·á ³Ö¾î¾ß ÇÏ´Â°Ç ¾Æ´ÑÁö..
¼Ò½º¸¦ º¸¸é ¿ì¼± temp¶ó´Â º¯¼ö´Â ¾îµð¿¡ ¼±¾ðÀÌ µÇ¾î ÀÖ³ª¿ä?
º£ÀÌÁ÷°ú ´Þ¸® C´Â º¯¼ö ¼±¾ð ¾øÀÌ º¯¼ö »ç¿ëÀÌ ¾ÈµÇ´Â°Å ¾Æ´Ñ°¡¿ä?
// ½ºÅÃÀÇ top ¿ø¼Ò¸¦ °Ë»öÇÏ´Â ¿¬»ê
stackNode* peek_top() {
if (top == NULL) { // ½ºÅÃÀÌ °ø¹é ¸®½ºÆ®ÀÎ °æ¿ì
printf("\n\n Stack is empty !\n");
return NULL;
}
// ½ºÅÃÀÌ °ø¹é ¸®½ºÆ®°¡ ¾Æ´Ñ °æ¿ì
return(top->data); // ÇöÀç topÀÇ ¿ø¼Ò ¹Ýȯ
}
strcpy ÇÔ¼öº¸´Ü strncpy ¾²´Â°Ô ÁÁ±¸¿ä
visual studio¿¡¼± ´ÙÀ½°ú °°Àº ¿À·ù°¡, DevC++¿¡¼µµ µ¿ÀÏÇÑ ¿À·ù°¡ ¹ß»ýÇÕ´Ï´Ù.
error C2440: 'return': 'char [10]'¿¡¼ 'stackNode *'(À¸)·Î º¯È¯ÇÒ ¼ö ¾ø½À´Ï´Ù.
49 19[Error] cannot convert 'char*' to 'stackNode*' in return
// ½ºÅÃÀÇ top ¿ø¼Ò¸¦ °Ë»öÇÏ´Â ¿¬»ê
stackNode* peek_top() {
if (top == NULL) { // ½ºÅÃÀÌ °ø¹é ¸®½ºÆ®ÀÎ °æ¿ì
printf("\n\n Stack is empty !\n");
return NULL;
}
// ½ºÅÃÀÌ °ø¹é ¸®½ºÆ®°¡ ¾Æ´Ñ °æ¿ì
return(top); // ÇöÀç topÀÇ ¿ø¼Ò ¹Ýȯ
}
void push(char *n, int num) {
stackNode* temp = (stackNode *)malloc(sizeof(stackNode));
strcpy(temp->name, n);
temp->student_no = num;
temp->link = top; // »ðÀÔ ³ëµå¸¦ topÀÇ À§¿¡ ¿¬°á
top = temp; // top À§Ä¡¸¦ »ðÀÔ ³ëµå·Î À̵¿
}
http://jangpd007.tistory.com/54
gcc ·Î ÄÄÆÄÀÏ ¹× ¸µÅ©ÇÒ¶§ -g ¿É¼ÇÀ» Ãß°¡·Î ³ÖÀ¸¸é µË´Ï´Ù.
void pop() {
stackNode name;
stackNode* temp = top;
if (top == NULL) { // ½ºÅÃÀÌ °ø¹é ¸®½ºÆ®ÀÎ °æ¿ì
printf("\n\n Stack is empty !\n");
}
else{
top = temp->link; // top À§Ä¡¸¦ »èÁ¦ ³ëµå ¾Æ·¡·Î À̵¿
free(temp); // »èÁ¦µÈ ³ëµåÀÇ ¸Þ¸ð¸® ¹Ýȯ
}
}
±×·¯°ï inline µé¾î°¬´ø...
Á¤¸» °¨»çµå¸³´Ï´Ù. ¾îµòÁö ¸ô¶ó¼ Çì¸Å±â¸¸ ÇÏ°í ²þ²þ ¾Î°í ÀÖ¾ú´Âµ¥ ¼ÓÀÌ ´Ù ½Ã¿øÇϳ׿ä.
¸¸¾à Áö±ÝÀº ½ºÅÃÀÇ ¾Æ·¡¼ºÎÅÍ Top ¼øÀ¸·Î Ãâ·ÂµÇ´Âµ¥, ¹®Á¦°¡ ¿øÇÏ´Â ½ÄÀ¸·Î ÇÑ´Ù¸é(TopºÎÅÍ ¾Æ·¡ ¼øÀ¸·Î)
while ¹® ´ë½Å¿¡ for¹®À¸·Î ·çÇÁ¸¦ µ¹·Á¾ß ÇÒ±î¿ä? ¾Æ´Ï¸é whileÀÇ Á¶°ÇÀ» ¼öÁ¤ÇØ¾ß ÇÒ±î¿ä?
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_SIZE 10 // À̸§ÀÌ ÀúÀåµÉ Å©±â ÁöÁ¤
typedef struct stackNode{ // ½ºÅÃÀÇ ³ëµå¸¦ ±¸Á¶Ã¼·Î Á¤ÀÇ
char name[MAX_NAME_SIZE];
int student_no;
struct stackNode *link;
} stackNode;
stackNode *top = NULL; // ½ºÅÃÀÇ top ³ëµå¸¦ ÁöÁ¤Çϱâ À§ÇØ Æ÷ÀÎÅÍ top ¼±¾ð
// ½ºÅÿ¡ ÀÚ·á Ãß°¡
void push(char *n, int num) {
stackNode* temp = (stackNode *)malloc(sizeof(stackNode));
strncpy(temp->name, n, MAX_NAME_SIZE);
temp->student_no = num;
temp->link = top; // »ðÀÔ ³ëµå¸¦ topÀÇ À§¿¡ ¿¬°á
top = temp; // top À§Ä¡¸¦ »ðÀÔ ³ëµå·Î À̵¿
}
// ½ºÅÃÀÇ ¸¶Áö¸· ÀڷḦ »èÁ¦ÇÏ´Â ¿¬»ê
void pop() {
if (top == NULL) { // ½ºÅÃÀÌ °ø¹é ¸®½ºÆ®ÀÎ °æ¿ì
printf("\n\n Stack is empty !\n");
return;
}
stackNode* temp = top;
while(temp->link)
{
temp = temp->link;
}
free(temp); // »èÁ¦µÈ ³ëµåÀÇ ¸Þ¸ð¸® ¹Ýȯ
}
// ½ºÅÃÀÇ top ¿ø¼Ò¸¦ °Ë»öÇÏ´Â ¿¬»ê
void peek_top() {
if (top == NULL) { // ½ºÅÃÀÌ °ø¹é ¸®½ºÆ®ÀÎ °æ¿ì
printf("\n\n Stack is empty !\n");
}
printf("top name = %s\n\n", top->name);
}
// ½ºÅÃÀÇ ¿ø¼Ò Àüü Ãâ·Â
void printStack() {
stackNode *p = top;
printf("name stdudent_no \n\n");
while (p) {
printf("%s %d\n", p->name, p->student_no);
p = p->link;
}
}
int main(void) {
push("´ÏÀº", 100);
push("µð±Ú", 101);
push("¹ÌÀ½", 102);
printStack(); // ÇöÀç ½ºÅà Ãâ·Â
getchar();
printf("½ºÅÃÀÇ TOP¿¡ ÀÖ´Â Çлý À̸§ Ãâ·Â\n");
peek_top();
getchar();
printf("¹ÌÀ½ÀÌ Á¦°ÅÇÏ°í ¸®À»ÀÌ Ãß°¡ÈÄ Àüü Ãâ·Â\n");
pop(); //¸Ç ³ªÁß ¹ÌÀ½ Á¦°Å
push("¸®À»", 103);
printStack();
getchar();
retrun 0;
}
°¨»çÇÕ´Ï´Ù.
´Ù½ÃÂ¥´Â°Ô ³ªÀ» Áöµµ..
p.s. ´Ù½Ãº¸´Ï.. Á¦´ë·Î ¸µÅ©´Â ³»·Á°¬°í ¸¶Áö¸· Ç׸ñ pop ÇÏ´Â ºÎºÐ¸¸ À߸øµÇ¾î ÀÖ¾ú³×¿ä.
#include <stdio.h>
#include <string.h>
#define MAX_NAME_SIZE 10
typedef struct stack_node {
char name[MAX_NAME_SIZE];
int student_no;
struct stack_node *prev;
struct stack_node *next;
} stack_node;
stack_node *addStack ( stack_node *, char *, int );
void delStack ( stack_node * , char *);
void printStack ( stack_node * );
int main( int argc, char *argv[] )
{
stack_node *e = NULL;
e = addStack( e, "´ÏÀº",100);
e = addStack( e, "µð±Ú",101);
printf("ÇöÀç À§Ä¡ Ãâ·Â : NAME : [%s] [%d]\n",e->name,e->student_no);
e = addStack( e, "¹ÌÀ½",102);
printf("Àüü Ãâ·Â\n");
printStack( e );
/* delStack( e, "¹ÌÀ½" );*/
delStack( e, "µð±Ú");
printf("Àüü Ãâ·Â\n");
printStack( e );
}
stack_node *addStack( stack_node *p , char *name , int student_no )
{
stack_node *pp;
stack_node *next;
stack_node *curr;
if ( p == NULL )
{
p = (stack_node *)malloc( sizeof(stack_node));
strcpy(p->name,name);
p->student_no = student_no;
return p;
}
pp = p;
while ( pp != NULL )
{
curr = pp;
pp = pp->next;
}
next = (stack_node *)malloc ( sizeof(stack_node));
if ( next == NULL ) return;
strcpy(next->name, name);
next->student_no = student_no;
next->prev = curr;
curr->next = next;
return next;
}
void delStack( stack_node *p , char *name )
{
stack_node *next;
stack_node *prev;
stack_node *pp;
/* node óÀ½À¸·Î À̵¿ */
pp = p;
while ( pp != NULL )
{
prev = pp;
pp = pp->prev;
}
pp = prev;
while ( pp != NULL )
{
if ( strcmp( pp->name, name ) == 0 )
{
printf("»èÁ¦ : [%s]\n",pp->name);
prev = pp->prev;
next = pp->next;
if ( next != NULL )
{
next->prev = prev;
}
prev->next = next;
free(pp);
pp = next;
} else {
pp = pp->next;
}
}
}
void printStack( stack_node *p )
{
stack_node *first;
stack_node *pp;
pp = p;
while ( pp != NULL )
{
first = pp;
pp = pp->prev;
}
printf("[PRINT] ===================================\n");
pp = first;
while ( pp != NULL )
{
printf("name : [%s] [%d] point : [%p]\n",pp->name, pp->student_no,pp->next);
pp = pp->next;
}
printf("[PRINT] ===================================\n");
}
[[[[[[[[[[[[[[ ½ÇÇà °á°ú ÀÔ´Ï´Ù. ]]]]]]]]]]]]]]]]]]]]
ÇöÀç À§Ä¡ Ãâ·Â : NAME : [µð±Ú] [101]
Àüü Ãâ·Â
[PRINT] ===================================
name : [´ÏÀº] [100] point : [8060d30]
name : [µð±Ú] [101] point : [8060d50]
name : [¹ÌÀ½] [102] point : [0]
[PRINT] ===================================
»èÁ¦ : [µð±Ú]
Àüü Ãâ·Â
[PRINT] ===================================
name : [´ÏÀº] [100] point : [8060d50]
name : [¹ÌÀ½] [102] point : [0]
[PRINT] ===================================
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_SIZE 10
typedef struct element{
char name[MAX_NAME_SIZE];
int student_no;
};
typedef struct linked_stack{
struct element data;
struct linked_stack *link;
};
struct linked_stack *Top;
void push(char *iname,int inum);
struct element pop();
void stack_print();
int main(){
Top = NULL;
struct element student_data;
push("°¡",100);
push("³ª",101);
push("´Ù",102);
stack_print();
student_data = pop();
stack_print();
student_data = pop();
stack_print();
student_data = pop();
stack_print();
}
void push(char *iname,int inum){
struct linked_stack *temp = (linked_stack *)malloc(sizeof(linked_stack));
strncpy(temp->data.name,iname,MAX_NAME_SIZE);
temp->data.student_no = inum;
if(Top == NULL){
Top = temp;
temp->link = NULL;
}else{
temp->link = Top;
Top = temp;
}
}
struct element pop(){
struct element data_temp;
struct linked_stack *link_temp = NULL;
if(Top != NULL){
memcpy(&data_temp,&Top->data,sizeof(struct element));
link_temp = Top;
Top = Top->link;
free( link_temp );
return data_temp;
}
return data_temp;
}
void stack_print(){
struct linked_stack *link_temp = Top;
if(Top == NULL) printf("ºñ¾îÀÖ´Â ½ºÅÃÀÔ´Ï´Ù.");
while(link_temp != NULL){
printf("[%s , %d]", link_temp->data.name,link_temp->data.student_no);
link_temp = link_temp->link;
}
printf("\n---------------------\n");
}
±¸Á¶Ã¼°¡ À߸øµÈ°ÍÀÌ ¾Æ´Ò±î »ý°¢ÇÕ´Ï´Ù.. ±¸Á¶Ã¼ºÎÅÍ ´Ù½Ã ÀÛ¼ºÇÏ¿´½À´Ï´Ù..
POPÀÌ ¹«ÇÑÁ¤ °¡´ÉÇÑ ¹ö±×°¡ ÀÖ½À´Ï´Ù..
±³¼ö´ÔÀÌ ¿øÇϽô°Ŵ ¾Æ¸¶..
1. Æ÷ÀÎÅ͸¦ ÀÚÀ¯·Ó°Ô ¾µ¼ö Àִ°¡.
2. ±¸Á¶Ã¼¿Í ÁÖ¼Ò¿¬»êÀÚ¸¦ ÀÚÀ¯·Ó°Ô ¾µ¼ö Àִ°¡.
Á¤µµÀÇ Àǹ̷ΠºÐ¼®µË´Ï´Ù...
strcpy(char * , char *) 1¹ø ÁÖ¼Ò¿¡ 2¹ø ÁÖ¼ÒÀÇ 0¹øºÎÅÍ NULL±îÁö º¹»çÇÑ´Ù.
strncpy(char *, char * , int) 1¹ø ÁÖ¼Ò¿¡ 2¹ø ÁÖ¼ÒÀÇ 0¹øºÎÅÍ N¹ø±îÁö º¹»çÇÑ´Ù.
memcpy(void *, const void *, size_t n) 1¹ø ÁÖ¼Ò¿¡ 2¹ø ÁÖ¼Ò·Î n¸¸Å º¹»çÇÑ´Ù.