단방향 연결 리스트(Linked List)


▷ 단방향 연결 리스트(Linked List)


형태





▷구성방법


시작전.

 1). 데이터를 담을 구조체를 만든다.

 2). 헤드(Head)변수를 만든다.



0. 데이터 출력.

 1). 헤드를 가르킬 임시 노드 변수를 만든다.

 2). 노드가 null이 아닐경우 그 노드가 가지고 있는 데이터를 출력한다.

 3). 노드를 한칸 앞으로 이동해준다.

 4). 현재 노드가 null이 나올때까지 2~3번을 반복한다.


1. 데이터 추가

 1). 노드를 생성한다.

 2). 헤드의 포인터를 처음 생성된 노드에 가르킨다.

 3). 노드를 생성한다.

 4). 헤드를 가르킬 임시 노드 변수를 만든다.

 5). 현재 노드가 가르키는게 null이 나올때까지 노드 이동을 한다.

 6). 현재 노드가 가르키는게 null일경우 새롭게 추가한 노드를 가르킨다.

 7). 데이터를 추가 할 때 마다 4~6번을 반복한다.


2. 데이터 모두 삭제.

 1). 헤드를 담을 임시 노드 변수를 생성한다.

 2). 헤드 노드를 한 칸 앞으로 이동시킨다.

 3). 임시 노드 변수를 삭제한다.

 4). 헤드가 가르키는 노드가 null일때까지 1~3번을 반복한다.


3. 데이터 선택 삭제



 1). 자신이 삭제할 데이터를 담을 변수를 하나 만들어서 데이터를 입력받는다

 2). 첫 번째 노드(헤드)가 삭제할 데이터이면 새로운 노드 변수를 만들어 헤드를 담고

     헤드를 한 칸 전진한 뒤 만든 변수를 삭제.

 3). 첫 번째 노드(헤드)가 삭제할 데이터가 아니라면 헤드를 담을 변수와 헤드를 담을 변수의 전 노드를 가르킬 변수를

     만든다.

 4). 노드를 한 칸씩 전진 시키며 자신이 입력한 데이터와 같은지 비교한다. 

 5). 같다면 삭제 전용 변수의 포인터를 처음 만든 노드에 가르키고 두 번째 만든 노드는 처음 만든 노드가 가르키는 노드를 가르      킨다.

 6). 삭제 전용 노드 변수를 삭제한다.


4. 데이터 선택 추가.



  1). 삽입할 데이터를 입력받는다.

  2). 몇 번째에 삽입할건지 인덱스를 입력 받는다.

  3). 첫 번째 인덱스에 데이터를 삽입할 경우 새롭게 만든 노드를 헤드에 연결시킨 뒤

      헤드를 새롭게 만든 노드를 가르킨다.

  4). 첫 번째 인덱스에 데이터를 삽입하는게 아닐경우 입력받은 인덱스 - 1 만큼 노드를 이동한다.

      새롭게 만든 노드를 현재 노드의 다음 노드에 연결 시킨뒤 현재 노드의 포인터를 새롭게 만든 노드에 가르킨다.




0). 데이터 출력 (Data DisPlay)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void DisPlay()
{
    if( pHead == NULL )
    {
        printf("데이터가 존재하지 않습니다. \n");
        return;
    }
 
    NODE* pNode = pHead;
    while(pNode != NULL)
    {
        printf("%d\n", pNode->Num);
        pNode = pNode->pNext;
    }
}




1). 데이터 추가(DataAdd)


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
typedef struct NODE{
    int Num;
    struct NODE* pNext;
}NODE;
 
NODE* pHead = NULL;
 
void AddData()
{
    int Data;
    while(1)
    {
        printf("추가할 데이터를 입력해주세요.( 종료 -1 )");
        scanf("%d", &Data);
 
        if( Data == -1 )  return;
 
        NODE* NewNode = new NODE;
        NewNode->Num = Data;
        NewNode->pNext = NULL;
 
        // 처음 생성되는 노드를 헤드가 가르킨다.
        if( pHead == NULL )
            pHead = NewNode;
        else
        {
            // 헤드를 직접움직이면 시작 데이터를 알수 없으므로
            // 임시 변수를 만들어주어서 노드의 끝으로 이동한다.
            NODE* pNode = pHead;
            while( pNode->pNext != NULL )
                pNode = pNode->pNext;
 
            // 노드를 새롭게 추가한다.(새로운 노드를 가르킨다.)
            pNode->pNext = NewNode;
        }
    }
}




2). 데이터 모두 삭제(Data All Delete)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void AllDataRemove()
{
    // 예외처리.
    if( pHead == NULL )
    {
        printf("데이터가 존재하지 않습니다. \n");
        return;
    }
 
    while(pHead != NULL)
    {
        NODE* pRemove = pHead;
        pHead = pHead->pNext;
        delete pRemove;
    }
    
    pHead = NULL;
}




3). 데이터 선택 삭제(Data Select Delete)


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
void SelectDataRemove()
{
    // 예외처리.
    if( pHead == NULL )
    {
        printf("데이터가 존재하지 않습니다. \n");
        return;
    }
 
    int Data;
    printf("삭제할 데이터를 입력하세요.");
    scanf("%d",&Data);
 
    NODE* pRemove;
    // 처음 노드가 삭제할 데이터일 경우.
    if(pHead->Num == Data)
    {
        pRemove = pHead;
        pHead = pHead->pNext;
    }
    else
    {
        NODE* pNode = pHead;
        NODE* pPrev;
        while( pNode->Num != Data )
        {
            pPrev = pNode;
            pNode = pNode->pNext;
        }
        pRemove = pNode;
        pPrev->pNext = pNode->pNext;
    }
 
    delete pRemove;
}


예외처리 추가.

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
void SelectDataRemove()
{
    // 예외처리.
    if( pHead == NULL )
    {
        printf("데이터가 존재하지 않습니다. \n");
        return;
    }
 
    int Data;
    printf("삭제할 데이터를 입력하세요.");
    scanf("%d",&Data);
 
    NODE* pRemove;
    // 처음 노드가 삭제할 데이터일 경우.
    if(pHead->Num == Data)
    {
        pRemove = pHead;
        pHead = pHead->pNext;
    }
    else
    {
        NODE* pNode = pHead;
        NODE* pPrev;
        while( pNode->Num != Data )
        {
            if(pNode->pNext == NULL)
            {
                printf("삭제할 데이터가 존재하지 않습니다.\n");
                return;
            }
            pPrev = pNode;
            pNode = pNode->pNext;
        }
        pRemove = pNode;
        pPrev->pNext = pNode->pNext;
    }
 
    delete pRemove;
}
cs



4). 데이터 선택 삽입(Data Select Insert)


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
void SelectDataInsert()
{
    int Num = 0;
    int DataRemove = 0;
 
    printf("삽입할 데이터를 입력: ");
    scanf("%d",&Num);
 
    printf("몇번째에 데이터를 넣을건지 입력 : ");
    scanf("%d",&DataRemove);
 
    NODE* p = pHead;                  
    NODE* pNode = new NODE;    
    pNode->Num = Num;           
    pNode->pNext = NULL;        
    
    if( DataRemove == 1 )
    {
        pNode->pNext = pHead;
        pHead = pNode;         
    }
    else 
    {
        // n번 째 노드까지 for문을 통해 이동시킨다. 
        for(int i = 1; i < DataRemove-1; i++)    
            p = p->pNext;
 
        pNode->pNext = p->pNext;   // 데이터가 삽입된 노드의 연결을 n번째의 다음 노드에 연결시킨다.
        p->pNext = pNode;          // n번째의 노드의 연결을 새로 삽입된 노드에 뒤에 연결시킨다.
    }
}
 



'자료구조' 카테고리의 다른 글

큐(Queue)  (0) 2017.01.07
스택(Stack)  (0) 2017.01.07
연결 리스트(Linked List)  (0) 2017.01.06
퀵 정렬 (Quick sort)  (0) 2017.01.04
병합 정렬(Merge sort)  (0) 2017.01.02