C 연결리스트 - 스택
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define IS_FULL(ptr) (!(ptr))
#define IS_EMPTY(ptr) (!(ptr))
/*연결리스트 스택 구조체 선언*/
typedef struct {int key;/* 기타 필드 */}element;
typedef struct stack *stack_pointer;
typedef struct stack {
element item;
stack_pointer link;
}stack;
stack_pointer top=NULL;
/*함수선언*/
void add(stack_pointer *top, element item);
element pop(stack_pointer *top);
void print_list(stack_pointer top);
void main(){
int a;
element item;
/*메뉴창*/
while(1){
printf("***********************************\n");
printf("******* 메 뉴 ******\n");
printf("***********************************\n");
printf(" 1.삽입\n");
printf(" 2.삭제\n");
printf(" 3.출력\n");
printf(" 4.종료\n");
printf(" 선택:");scanf("%d",&a);
if(a==1){ //삽입
printf("DATA INPUT :");
scanf("%d",&item);
add(&top,item);
}else if(a==2){ //삭제
printf("DATA DELETE \n");
pop(&top);
}else if(a==3){ //출력
printf("DATA DISPLAY \n");
print_list(top);
}else if(a>=4){
printf("프로그램이 종료되었습니다.\n");
exit(-1);
}
}//while
}//main
void add(stack_pointer *top, element item) {
/* 스택의 top에 원소를 삽입 */
stack_pointer temp = (stack_pointer)malloc(sizeof(stack)); //새 노드를 생성
if (IS_FULL(temp)) {
fprintf(stderr,"The memory is full\n");
exit(1);
}
temp->item = item;
temp->link = *top;
*top = temp; //top을 temp를 가리키도록 변경
}
element pop(stack_pointer *top){
/* 스택으로부터 원소를 삭제 */
stack_pointer temp = *top;
element item;
if (IS_EMPTY(temp)) {
fprintf(stderr,"The stack is empty\n");
exit(1);
}
printf("DELETE VALUE : %d \n",*temp); //DATA가 삭제되는 값을 출력
item = temp->item; /*item을 반환하고 top은 그의 링크필드에 있는 주소를 가리키도록 변경*/
*top = temp->link;
free(temp);
return item;
}
void print_list(stack_pointer top) { /*top의 item필드 내용을 출력한뒤 top을 그의 link 필드에 있는 주소로 대체한다.*/
/*데이터 출력함수*/ /*리스트의 끝 널이 아닐때까지 item필드의 출력과 다음 노드로 이동을 계속한다.*/
//ptr=top->link;
printf("The list contains:");
for( ; top; top=top->link)
printf("%4d",top->item);
printf("\n");
}
이 포스트는 이전 네이버 블로그를 운영 안 하는 관계로 옮겨왔습니다.