C¾ð¾î ÄÚµù Áú¹®ÀÔ´Ï´Ù.

   Á¶È¸ 4110   Ãßõ 0    

ch05-2.c (2.1K), Down : 1, 2018-11


안녕하세요. 몇날 며칠을 머리 싸매다 답답해서 질문드리는 모 대학 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;

}


뭔가 할 수 있을 것 같은데 안 돌아가니 미치겠습니다. 

ªÀº±Û Àϼö·Ï ½ÅÁßÇÏ°Ô.
µð¹ö°Å µ¹¸®¸é ³»¿ëÀÌ ³ª¿Ãµí ½ÍÀºµ¥ Àúµµ C ¼Õ ³õÀºÁö ¿À·¡µÇ¼­(Æ÷ÀÎÅÍÂÊ µé¾î°¡¸é Çì·ÕÀÌ°¡ µÇ¼­¸®)
¹®Á¦ º¸¸é °£´ÜÇÑ ½ºÅà ±¸¼ºÀε¥...
½ºÅà ±¸¼º½Ã »õ·Î¿î °ªÀ» Áß°£¿¡ ÀÔ·ÂÇÏ·Á¸é Ãß°¡Àü ÀÚ·á±îÁö »© ³»¾î ±â¾ïÇÏ°í Ãß°¡µÈ Çà »ðÀÔÈÄ ±× ÀÌÈÄ ÀÚ·á ³Ö¾î¾ß ÇÏ´Â°Ç ¾Æ´ÑÁö..
¼Ò½º¸¦ º¸¸é ¿ì¼± temp¶ó´Â º¯¼ö´Â ¾îµð¿¡ ¼±¾ðÀÌ µÇ¾î ÀÖ³ª¿ä?
º£ÀÌÁ÷°ú ´Þ¸® C´Â º¯¼ö ¼±¾ð ¾øÀÌ º¯¼ö »ç¿ëÀÌ ¾ÈµÇ´Â°Å ¾Æ´Ñ°¡¿ä?
¹«¾Æ 2018-11
¿ì¼± º¸À̴°Ô. ÄÄÆÄÀÏÀÌ µÇ·Á¸é
// ½ºÅÃÀÇ top ¿ø¼Ò¸¦ °Ë»öÇÏ´Â ¿¬»ê
stackNode* peek_top() {
 if (top == NULL) {  // ½ºÅÃÀÌ °ø¹é ¸®½ºÆ®ÀÎ °æ¿ì
  printf("\n\n Stack is empty !\n");
  return NULL;
 }
  // ½ºÅÃÀÌ °ø¹é ¸®½ºÆ®°¡ ¾Æ´Ñ °æ¿ì
  return(top->data);  // ÇöÀç topÀÇ ¿ø¼Ò ¹Ýȯ
 
}

strcpy ÇÔ¼öº¸´Ü strncpy ¾²´Â°Ô ÁÁ±¸¿ä
     
½ºÅÃÀÇ top¿¡ ÀÖ´Â À̸§À» Ãâ·ÂÇÏ°í ½Í¾î¼­ data¿¡¼­ nameÀ¸·Î ¹Ù²å´Âµ¥ ´ÙÀ½°ú °°Àº ¿À·ù°¡ ¹ß»ýÇϸç ÄÄÆÄÀÏ ÀÚü°¡ ¾ÈµÇ³×¿ä.
visual studio¿¡¼± ´ÙÀ½°ú °°Àº ¿À·ù°¡, DevC++¿¡¼­µµ µ¿ÀÏÇÑ ¿À·ù°¡ ¹ß»ýÇÕ´Ï´Ù.
error C2440: 'return': 'char [10]'¿¡¼­ 'stackNode *'(À¸)·Î º¯È¯ÇÒ ¼ö ¾ø½À´Ï´Ù.
49 19[Error] cannot convert 'char*' to 'stackNode*' in return
          
¹«¾Æ 2018-11
½º¸¶Æ®ÆùÀ¸·Î º¸´Ùº¸ÀÌ À߸øºÃ³×¿ä
// ½ºÅÃÀÇ top ¿ø¼Ò¸¦ °Ë»öÇÏ´Â ¿¬»ê
stackNode* peek_top() {
 if (top == NULL) {  // ½ºÅÃÀÌ °ø¹é ¸®½ºÆ®ÀÎ °æ¿ì
  printf("\n\n Stack is empty !\n");
  return NULL;
 }
  // ½ºÅÃÀÌ °ø¹é ¸®½ºÆ®°¡ ¾Æ´Ñ °æ¿ì
  return(top);  // ÇöÀç topÀÇ ¿ø¼Ò ¹Ýȯ
 
}
¹«¾Æ 2018-11
// ½ºÅÃÀÇ 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 À§Ä¡¸¦ »ðÀÔ ³ëµå·Î À̵¿

}
µð¹ö±ë ÇÏ·Á¸é gdb ¸¦ ÀÌ¿ëÇØ º¸¼¼¿ä.

http://jangpd007.tistory.com/54

gcc ·Î ÄÄÆÄÀÏ ¹× ¸µÅ©ÇÒ¶§ -g ¿É¼ÇÀ» Ãß°¡·Î ³ÖÀ¸¸é µË´Ï´Ù.
¹«¾Æ 2018-11
// ½ºÅÃÀÇ top¿¡¼­ ¿ø¼Ò¸¦ »èÁ¦ÇÏ´Â ¿¬»ê
void pop() {
 stackNode name;
 stackNode* temp = top;

  if (top == NULL) {  // ½ºÅÃÀÌ °ø¹é ¸®½ºÆ®ÀÎ °æ¿ì
  printf("\n\n Stack is empty !\n");
   
 }
  else{
   
    top = temp->link; // top À§Ä¡¸¦ »èÁ¦ ³ëµå ¾Æ·¡·Î À̵¿
    free(temp);  // »èÁ¦µÈ ³ëµåÀÇ ¸Þ¸ð¸® ¹Ýȯ 
      }
}
¼ÛÁøÇö 2018-11
°í¼öºÐµé²²¼­ ºÐ¼®ÇØÁÖ½Ã´Ï ±×³É Àú´Â Æ÷±âÇÕ´Ï´Ù ÇÏÇÏ
Èì³Ä 2018-11
¿À... Àúµµ À̰ź¸°í °øºÎÁ» ÇغÁ¾ß°Ú³×¿ä. ¤¾¤¾
¹«¾Æ 2018-11
¿¹Àü¿¡ c ¹è¿ï¶§ ¾ç¹æÇâ linked list °ÇµéÁÙ ¾Ë¸é Æ÷ÀÎÅÍ Á¹¾÷Çß´Ù°í Çß´ø ±â¾ïÀÌ ³ª³×¿ä.
±×·¯°ï inline µé¾î°¬´ø...
     
¤¾îÁֽŠºÎºÐµé ¼öÁ¤Çؼ­ ½ÇÇàÇغ¸´Ï ±¸ÇöÇÏ°í ½Í¾ú´ø ´ë·Î Àß ÀÛµ¿Çϳ׿ä.

Á¤¸» °¨»çµå¸³´Ï´Ù. ¾îµòÁö ¸ô¶ó¼­ Çì¸Å±â¸¸ ÇÏ°í ²þ²þ ¾Î°í ÀÖ¾ú´Âµ¥ ¼ÓÀÌ ´Ù ½Ã¿øÇϳ׿ä.

¸¸¾à Áö±ÝÀº ½ºÅÃÀÇ ¾Æ·¡¼­ºÎÅÍ Top ¼øÀ¸·Î Ãâ·ÂµÇ´Âµ¥, ¹®Á¦°¡ ¿øÇÏ´Â ½ÄÀ¸·Î ÇÑ´Ù¸é(TopºÎÅÍ ¾Æ·¡ ¼øÀ¸·Î)

while ¹® ´ë½Å¿¡ for¹®À¸·Î ·çÇÁ¸¦ µ¹·Á¾ß ÇÒ±î¿ä? ¾Æ´Ï¸é whileÀÇ Á¶°ÇÀ» ¼öÁ¤ÇØ¾ß ÇÒ±î¿ä?
          
¹«¾Æ 2018-11
#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 ¼±¾ð


// ½ºÅÿ¡ ÀÚ·á Ãß°¡

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;

}
               
Âü°íÇؼ­ Çغ¸°Ú½À´Ï´Ù.

°¨»çÇÕ´Ï´Ù.
¹«¾Æ 2018-11
±×·±µ¥ ÀÌ°Å ´Ù½Ãº¸´Ï top ¿¡¼­ link ´Â ÀÚ½ÄÀ¸·Î °¡¾ßÇϴµ¥ °Å²Ù·Î ®³×¿ä. top ÀÌ top ÀÌ ¾Æ´Ñ.
´Ù½ÃÂ¥´Â°Ô ³ªÀ» Áöµµ..

p.s. ´Ù½Ãº¸´Ï.. Á¦´ë·Î ¸µÅ©´Â ³»·Á°¬°í ¸¶Áö¸· Ç׸ñ pop ÇÏ´Â ºÎºÐ¸¸ À߸øµÇ¾î ÀÖ¾ú³×¿ä.
     
¼ÛÁøÇö 2018-11
+1..
±èÀÎö 2018-11
Çѹø ÇغýÀ´Ï´Ù. Âü°í¸¸ Çϼ¼¿ä.

#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] ===================================
¼ÛÁøÇö 2018-11
#include <stdio.h>
#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¸¸Å­ º¹»çÇÑ´Ù.
¼ÛÁøÇö 2018-11
¿Ö ÅÇÀÌ ´Ù ³¯¶ó°£°ÍÀΰ¡...


QnA