본문 바로가기
코스웨어/15년 스마트컨트롤러

2015-05-13 업무일지 연결리스트

by 알 수 없는 사용자 2015. 5. 13.
728x90
반응형


#include <stdio.h>
#include <stdlib.h>

#pragma pack(1)

typedef struct _Node
{
    int iNum;
    struct _Node * stNext;

}Node;
#pragma pack(4)

void Node_Init(Node * stTemp)
{
    if(stTemp == 0)
    {
        return ;
    }
    printf("숫자를 입력하시오: ");
    scanf("%d"&stTemp -> iNum);

    stTemp -> stNext = 0;
}

void Node_Insert1(Node ** stHead)
{

    Node * stTemp = 0;
    Node * stESeeker  = 0;
    
    if(stHead ==0)
    {
        return;
    }

    stTemp = malloc(sizeof(Node));

    Node_Init(stTemp);
    
    if(0 == *stHead)
    {
        * stHead = stTemp;
        return;
    }

    stESeeker = *stHead;    

    while(1)
    {

        if(stESeeker -> stNext == 0
        {
            stESeeker -> stNext = stTemp;

            break
        }
        stESeeker = stESeeker -> stNext;
    
    }
        
        
        
}
/* ***********역순으로 삽입하는 코드*************** */
void Node_Insert2(Node ** stHead)
{
    Node * stTemp = 0;
    
    if(stHead ==0)
    {
        return;
    }

    stTemp = malloc(sizeof(Node));

    Node_Init(stTemp);

    if(0 == *stHead)    
    {
        * stHead = stTemp;  
        return;
    }

    stTemp -> stNext = *stHead;

    *stHead = stTemp;
}

/* ***********삽입하면서 정렬하는 코드*************** */

void Node_Insert3(Node ** stHead)     
{
    Node * stTemp = 0;
    Node * stESeeker  = 0;
    Node * stHelp = 0;
    
    if(stHead ==0)
    {
        return;
    }

    stTemp = malloc(sizeof(Node));

    Node_Init(stTemp);

    if(0 == *stHead)            //제일처음 노드를 연결해주는 코드 
    {
        * stHead = stTemp;  
        return;
    }
    if(stTemp -> iNum < (*stHead) -> iNum)
    {
        stTemp -> stNext = *stHead;

        *stHead = stTemp;
        
        return;
    }

/* *************20150513 신규 코드*************** */
  stHelp = stESeeker = *stHead; 
//ESeeker를 따라가는 포인터를 하나더 만들어준다.


  while(stESeeker != 0)
  {
    if(stTemp -> iNum < stESeeker->iNum)
    {
      stTemp -> stNext = stESeeker;
      if(*stHead == stESeeker)
      {
        *stHead = stTemp;
        return;
      }
      stHelp -> stNext = stTemp;
      return;
    }
    stHelp = stESeeker;  //ESeeker랑 같은 곳을 가르키고
    stESeeker = stESeeker -> stNext; 
//stESeeker는 한칸뒤로 이동하면서 stHelp는 항상 stESeeker의 뒤로 따라온다.

  }
  
  //Null에 도달했을때 연결리스트를 삽입해주는 코드
  stTemp -> stNext = stESeeker;
  stHelp -> stNext = stTemp;

  return;
}

void Node_Insert4(Node ** stHead)
{

}


void Node_Printf(Node *);

void Node_Free(Node *);

int main()
{
    /*
       Node * head = 0;

       head = malloc(sizeof(Node));

       head->iNum = 100;
       head->stNext = malloc(sizeof(Node));
       head->stNext->iNum = 200;

       head->stNext->stNext = malloc(sizeof(Node));
       head->stNext->stNext->iNum = 300;

       head->stNext->stNext->stNext = 0; 
     */


    Node * head = 0;

    Node_Insert3(&head);

    Node_Insert3(&head);

    Node_Insert3(&head);

    Node_Insert3(&head);

    Node_Insert3(&head);

    Node_Printf(head);

    Node_Free(head);

    return 0;
}

void Node_Printf(Node * temp)  
{
    while(temp != 0)
    {     
        printf("%d -> ",temp->iNum);
        temp = temp -> stNext;
    }

    printf("NULL \n");
}

void Node_Free(Node * head)
{
    Node * temp = 0;

    while(head != 0)
    {
        temp = head -> stNext;
        free(temp);
        head = temp;
    }
}

/* ***********삽입하면서 정렬하는 코드*************** */

void Node_Insert3(Node ** stHead)     
{
    Node * stTemp = 0;
    Node * stESeeker  = 0;
    Node * stHelp = 0;
    
    if(stHead ==0)
    {
        return;
    }

    stTemp = malloc(sizeof(Node));

    Node_Init(stTemp);

    if(0 == *stHead)            //제일처음 노드를 연결해주는 코드 
    {
        * stHead = stTemp;  
        return;
    }
    if(stTemp -> iNum < (*stHead) -> iNum)
    {
        stTemp -> stNext = *stHead;

        *stHead = stTemp;
        
        return;
    }

/* *************20150513 신규 코드*************** */
  // stHelp,stESeeker,stHead는 같은 위치를 가르키게 만든다.
  stHelp = stESeeker = *stHead;
    // stESeeker가 NULL값을 가르킬때까지 while문을 반복한다.
  while(stESeeker != 0)
  {
    if(stTemp -> iNum < stESeeker->iNum)
    {
      stTemp -> stNext = stESeeker;
      if(*stHead == stESeeker)
      {
        *stHead = stTemp;
        return;
      }
      stHelp -> stNext = stTemp;
      return;
    }
    stHelp = stESeeker; 
    //ESeeker랑 같은 곳을 가르키고

    stESeeker = stESeeker -> stNext; 
    //stESeeker는 한칸뒤로 이동하면서 stHelp는 항상 stESeeker의 뒤로 따라온다.

  }
  
  //Null에 도달했을때 연결리스트를 삽입해주는 코드
  stTemp -> stNext = stESeeker;
  stHelp -> stNext = stTemp;

  return;
}


그림으로 설명

먼저 stHelp = stESeeker = *stHead; 를 적어줌으로써 전부다 첫번째 구조체를 가르키게 만들고.

while의 조건이 stESeeker가 NULL값을 가르킬때까지 반복이니 while로 진입한다.

① 첫번째 if에서 ( stTemp -> iNum(5) < stESeeker -> iNum(3) ) 을 비교하지만
거짓이기 때문에if문에 진입하지 않고 바로 다음 코드로 넘어간다.

② stHelp = stESeeker; 를 실행

③ stESeeker = stESeeker -> stNext;를 실행 위의 코드와 이코드를 실행해줌으로서
stESeeker는 앞으로 한칸이동하고 stHelp는 항상 stESeeker 바로뒤의 구조체를 가르킬수 있게된다.

④ 다시 if문으로 돌아가서 ( stTemp -> iNum(5) < stESeeker -> iNum(8) )을 비교

참이기 때문에 if문으로 진입한다.

⑤ stTemp -> stNext = stESeeker;를 실행해서 5다음 8오도록 연결한다.

⑥ stHelp -> stNext = stTemp;를 실행해서 3다음 5가 오도록 연결한다.








      if(*stHead == stESeeker)
      {
        *stHead = stTemp;
        return;
      }

위의 코드의 경우는 3보다 작은수를 넣었을 경우에
stHead가 stTemp 가르키게 함으로써 무한루프를 방지해준다.

  stTemp -> stNext = stESeeker;
  stHelp -> stNext = stTemp;

위의 코드의 경우는 10보다 큰숫자를 넣었을 경우에
NULL값과 10사이에 숫자를 넣어주는 코드이다

오전은 제가 진도를 아직 못빼서 혼자 기본하고 있어서 올리지를 못하겠네요 ㅠㅠ

필력이 조금 딸려도 너그럽게 보시고 피드백 많이 부탁드립니다 오늘도 고생많으셨습니다!

728x90