본문 바로가기
알고리즘-자료구조

[개탱][C][컴공과제][자료구조][원형 Linked_List 를 이용 한 포로 처형시키기]

by 개탱 2017. 12. 21.
728x90
문제 ::  원형으로 N명 만큼 둘러 앉아서 K번째 사람을 한명씩 처형시킬 때 처형되는 순서를 출력

입력 : 포로수 처형위치 (ex)
N K
5 1 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
//.cpp
 
typedef struct tag_list
{
    int iData; // integer 형을 저장하는 변수
    struct tag_list* p_Link;
 
}List;
 
 
void push(List** p_Head, List** p_Cur, int iData);
int pop(List** p_Cur, List* p_Prev);
int iArray[1000];
void main() //.cpp
{
    List* p_Head = NULL// LIST의 시작점
    List* p_Cur= NULL// 리스트의 현재 사용할 위치를 가리킬 커서역활
    // Push 때는 추가된 곳을 가리키고, POP 때는 삭제 된 노드의 이전을 가리킨다.
    List* p_CurPrev; // pop연산을 위하여 현재 가리키는 위치의 전 노드를 가리킴
 
    int N, K; // N 포로 수 , K 처형 위치 값
 
    int iCount = 0// 남은 인원수 카운트용
 
    scanf("%d %d"&N, &K);
    for(int i = 0; i < N; i++)
    {
        push(&p_Head, &p_Cur, i+1);
    }
    p_Cur = p_Head;
    while(iCount != N-1)
    {
        for(int i = 0; i < K-1; i++)
        {
            p_CurPrev = p_Cur;
            p_Cur = p_Cur->p_Link;
            
        }
        iArray[iCount] = pop(&p_Cur, p_CurPrev);
        iCount++;
    }
 
    printf("%d\n",p_Cur->iData);
    for(int i = 0; i < N-1; i++)
    {
        printf("%d ",iArray[i]);
    }
}
 
void push(List** p_Head, List** p_Cur, int iData)
{
    List* p_NewNode = new List;
    
    p_NewNode->iData = iData;
    if(*p_Head == NULL)
    {
        *p_Head = p_NewNode;
        p_NewNode->p_Link = *p_Head;
 
    }
    else
    {
        p_NewNode->p_Link  =  (*p_Cur)->p_Link;
        (*p_Cur)->p_Link = p_NewNode;
        
    }
        *p_Cur = p_NewNode;
 
}
 
int pop(List** p_Cur, List* p_CurPrev)
{
    int remove_data;
    List* p_removeNode;
    p_removeNode = *p_Cur;
    remove_data = p_removeNode->iData;
 
    p_CurPrev->p_Link = p_removeNode->p_Link;
    *p_Cur = p_CurPrev->p_Link;
    delete(p_removeNode);
    
 
    return remove_data;
}
 
cs


혹여 과제기간은 지났지만 궁금할수도 있는 후배님들을 위해 올려봅니다.

댓글