링크드 리스트로 스택을 구현했다.


/************************************************************************/
/* 파일명 : list.cpp             */
/* 과목명 : 자료구조                                                    */
/* 교수님 : 유 하 진 교수님            */
/* 작성일 : 2008. 04. 10            */
/* 작성자 : 박상현              */
/* 링크드 리스트로 스택을 구현한다.          */
/*                  */
/************************************************************************/

/*
 * 헤더파일 인클루드
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

// 학생구조체 정의
typedef struct 
{
 char name[10];
 int id;
} STUDENT;

// 스택포인터 정의
typedef struct stack *stackPointer;
typedef struct stack
{
 STUDENT data;
 stackPointer link;
};


stackPointer top;   // 스택 선언

/*
 * 함수 선언
 */
void push(STUDENT item);
STUDENT pop();
int checkFlag(char *buf);
void printStack();
void cleanStack();

/************************************************************************/
/* 함수명 : main                                                        */
/* 파일로부터 학생리스트를 읽어온다음 명령에 따라 add, delete, error   */
/* 등을 처리한다.              */
/************************************************************************/
void main()
{
 
 FILE *fp;        // 파일 포인터 선언
 fp = fopen("data.txt", "r");   // 파일오픈
 char buf[100];       // 명령을 받을 임시 버퍼

 STUDENT temp;       // 임시 학생 변수
 int flag = 0;       // 체크플래그
 int i = 0;

 // fin 이 나올때까지 반복
 while(1)
 {
  fscanf(fp, "%s", buf);
  flag = checkFlag(buf);

  // fin 일 경우
  if(flag == 3)
  {
   cleanStack();   // 스택을 비우고
   break;     // break
  }
  // add 일 경우
  else if(flag == 1)
  {
   fscanf(fp, "%s", buf);  // 이름을 입력받음
   strcpy(temp.name, buf);
   
 
   fscanf(fp, "%s", buf);  // id 를 입력받음
   temp.id = atoi(buf);
 
   push(temp);     // temp 를 푸쉬
   printf("add : %s %d\n", temp.name, temp.id);
   
   printStack();    // 스택 출력

  }
  // delete 일 경우
  else if(flag == 2)
  {

   
   temp = pop();        // top 에 있는걸 pop
   printf("delete : %s %d\n", temp.name, temp.id);
   printf("\n");
   printStack();       // 스택 출력
  }
  // 오류 메시지일 경우
  else if(flag == 4)
  {

   printf("오류메시지\n\n");
  }

 

 }
 printStack();    // 스택 출력
 pop();      // 에러를 보기위한 pop


}


/************************************************************************/
/* 함수명 : cleanStack                                                        */
/* 스택을 모두 비운다.             */
/************************************************************************/
void cleanStack()
{
 
 while(top)
 {
   pop();   // top 이 널일때까지 pop
 }
}

/************************************************************************/
/* 함수명 : printStack                                                        */
/* 스택의 내용을 모두 출력한다.             */
/************************************************************************/
void printStack()
{
 printf("The list : \n");
 stackPointer temp = top;   //  temp 를 top 으로 놓고
 for( ; temp ; temp = temp->link) //  temp 가 널이 아닐동안 temp 를 움직이며 출력한다.
 {
  printf("%d ", temp->data.id);
  printf("%s \n", temp->data.name);
 }
 
 printf("\n");
}

/*
 *
 */
/************************************************************************/
/* 함수명 : pop                                                        */
/* 스택의 꼭대기에 있는 것을 꺼낸다.
 * 스택이 비었으면 오류메시지를 출력한다.            */
/************************************************************************/
STUDENT pop()
{

 stackPointer temp = top;  // top 을 임시로 temp 로 놓는다.
 STUDENT item;     // 학생 구조체 선언
 
 if(top)  // top 이 널이 아니면
 {
  item.id = temp->data.id;    // top 의 데이터를 item 에 저장한다.
  strcpy(item.name, temp->data.name);  //
 
  top = temp->link;      // top 을 한칸 내린다.
  free(temp);        // temp 를 free 한다.
 }
 else
 {
  // 스택이 비었으면 오류메시지를 출력한다.
  printf("스택이 비었습니다.\n");
 }
 return item;

}

/************************************************************************/
/* 함수명 : checkFlag                                                        */
/* buf 문자열을 체크한다.           */
/************************************************************************/
int checkFlag(char *buf)
{
 if(strcmp(buf, "add") == 0)  // add 이면 1 리턴
 {
  return 1;
 }
 else if(strcmp(buf, "delete") == 0)  // delete 이면 2 리턴
 {
  return 2;
 }
 else if(strcmp(buf,"fin") == 0)   // fin 이면 3 리턴
 {
  return 3;
 }
 else         // 오류메시지
 {
  return 4;
 }
}

/************************************************************************/
/* 함수명 : push                                                        */
/* item 을 인자로 받아 push 한다.           */
/************************************************************************/
void push(STUDENT item)
{
 stackPointer temp;    // 추가될 노드
 temp = (stackPointer)malloc(sizeof(stack));  // 메모리 할당
 temp->data.id = item.id;     // 데이터를 넣어준다.
 strcpy(temp->data.name, item.name);   //


 
 temp->link = top;   // temp->link 가 top 을 가리키게한다. ( 스택이므로 위에 쌓아야 함 )
 top = temp;     // top 을 temp 로 교체

}


 

Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요