본문 바로가기

컴퓨터/언어,프로그래밍

[C언어] 링크드리스트를 이용한 stacklist

  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3.   
  4. typedef int element;   
  5.   
  6. typedef struct stackNode   
  7. {   
  8.     element data;       //해당 노드의 값을 가지고 있는 int형 data변수   
  9.     struct stackNode* link; // 이전 노드의 주소값을 가지고 있게 될 구조체 포인터 변수   
  10.   
  11. }stackNode;   
  12.   
  13. stackNode* top;     // 최상위 값을 가지게 되는 포인터 구조체 변수   
  14. stackNode* cur;     // 현재 위치값을 가지게 될 포인터 구조체 변수   
  15. stackNode* curprev; // 현재 위치값의 이전값을 가지게 될 구조체 변수   
  16.   
  17. int flag = 0;   
  18.   
  19. void push(element num)   
  20. {   
  21.     stackNode* temp = (stackNode*)malloc(sizeof(stackNode));   
  22.   
  23.     if(top == NULL)         // top이 값이 없는 상태에서 값을 넣으면 flag를 1을 가지게 한다.   
  24.         flag = 1;              
  25.     temp->data = num;        // temp의 data에 입력값을 저장한다.   
  26.     temp->link = top;        // 이전 노드를 기억 하기위한 link에 현재 top의 위치를 저장시킨다.   
  27.     top = temp;             // top 구조체 변수에 새로운 top이 될 임시 구조체 변수 temp를 넣는다.   
  28.   
  29. }   
  30.   
  31. element pop()   
  32. {   
  33.     element n;   
  34.     stackNode* temp = top;   
  35.     if(top == NULL)         // 스택에 값이 없으면   
  36.     {   
  37.         printf("\nStack is empty\n");   
  38.         return 0;   
  39.     }   
  40.     else  
  41.     {   
  42.         n = temp->data;   
  43.         top = temp->link;   
  44.         if(top == NULL)     // 스택이 비게되면 flag에 0을 써줘서    
  45.             flag = 0;       // insert입력시에 잘못된 값을 넣는것을 방지한다.   
  46.         free(temp);         // 더이상 사용하지 않는 temp변수를 메모리에서 해제시킨다.   
  47.         printf("pop Num : %d\n", n);   
  48.         return n;   
  49.     }   
  50. }   
  51.   
  52. void printStack()   
  53. {   
  54.     stackNode* p = top;     // 임시 포인터 구조체변수 p를 선언하여 top의 값을 복사한다.   
  55.     printf("\nstack [ ");   
  56.     while(p)   
  57.     {   
  58.         printf("%d ",p->data);       // p의 데이터를 출력한다.   
  59.         p = p->link;             // p의 데이터를 출력후 p를 p의 link값을 가지게 함으로서 앞으로 한칸 가게 한다.   
  60.     }   
  61.     printf("]\n");   
  62. }   
  63.   
  64. void search(element num)   
  65. {   
  66.     cur = top;              // top을 cur변수(위치정보를 가지게 될 변수)에 복사한다.   
  67.     curprev = top->link;   
  68.     while(cur)              // cur가 NULL을 가지게 될때까지    
  69.     {   
  70.         if(cur->data == num) // 만약 값을 찾게 된다면 반복문을 종료한다.   
  71.         {   
  72.             return;   
  73.         }   
  74.         else  
  75.         {   
  76.             cur = cur->link; // 아니라면 cur의 앞의 노드로 cur를 이동 시킨다.   
  77.             curprev = curprev->link;   
  78.         }   
  79.     }   
  80.     printf("not find num\n");   // 값을 찾지 못하면 찾지못하였음을 알리고    
  81.     return;                     // 종료한다.   
  82. }   
  83.   
  84. void insert(element num)   
  85. {   
  86.     stackNode* newnode = (stackNode*)malloc(sizeof(stackNode));   
  87.     int val1 = 0;   
  88.        
  89.     if(flag == 0)       // 만약에 값이 하나도 없다면 insert가 될수 없으므로    
  90.     {   
  91.         push(num);      // push를 한다.   
  92.     }   
  93.     else  
  94.     {   
  95.         printf("Select input position : ");     // 삽입할 위치를 알 수 없으므로    
  96.         scanf("%d",&val1);                      // 삽입할 위치를 입력한다.   
  97.         search(val1);               // 삽입할 위치의 값이 스택에 있는치 찾는다.   
  98.         newnode->data = num;   
  99.         newnode->link = cur->link;   
  100.         cur->link = newnode;   
  101.     }   
  102. }   
  103.   
  104. void del(element num)               // 최상위의 값을 지우는 함수   
  105. {   
  106.     if(top == NULL)         // 만약 스택이 비었으면   
  107.     {      
  108.         printf("stack is empty\n");     // 메시지 출력수   
  109.         return;                         // 종료한다.   
  110.     }   
  111.     else  
  112.     {   
  113.         search(num);   
  114.            
  115.         top = top->link;     // 아니라면 top을 한칸 앞으로 이동 시킨다.   
  116.   
  117.     }   
  118.        
  119. }   
  120.   
  121. element peek(){             // 최상위, 즉 top의 값을 반환하는 함수이다.   
  122.     element item;   
  123.     item = top->data;        // item에  top의 data를 저장한다.   
  124.     return item;            // item을 반호나한다.   
  125. }    
  126.   
  127.   
  128. element main(int argc, char** argv)   
  129. {   
  130.     int num = 0;   
  131.     int val = 0;   
  132.   
  133.     while(1)   
  134.     {   
  135.         printf("select : 1. push, 2.pop, 3.insert, 4. delete, 5. printStack, 0. exit\n");   
  136.         printf(" -> ");   
  137.         scanf("%d",&num);   
  138.   
  139.         if(num == 1)   
  140.         {   
  141.             printf("Enter num :");   
  142.             scanf("%d", &val);   
  143.             push(val);   
  144.         }   
  145.         else if(num == 2)   
  146.         {   
  147.             pop();   
  148.         }   
  149.         else if(num == 3)   
  150.         {   
  151.             printStack();   
  152.             printf("Enter insert Number : ");   
  153.             scanf("%d", &val);   
  154.             insert(val);   
  155.         }   
  156.         else if(num == 4)   
  157.         {   
  158.             printStack();   
  159.             printf("Enter delete Number : ");   
  160.             scanf("%d", &val);   
  161.             del(val);   
  162.         }   
  163.         else if(num == 5)   
  164.         {   
  165.             printStack();   
  166.         }   
  167.         else if(num == 0)   
  168.         {   
  169.             exit(0);   
  170.         }   
  171.         else  
  172.         {   
  173.             printf("That's wrong input");   
  174.         }   
  175.     }   
  176.        
  177. }   

제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...