프로그래밍

 3198, 1/160 회원가입  로그인  
   h2spice
   (자료구조 ) SingleList 중간 Node 삽입 함수 구현이 잘안되요!!!

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=2839 [복사]


노드 생성, 연결
부분출력, 전체 출력은 이상없이 구현이 되었는데

중간삽입 이 잘안됩니다

에러는 안나고요. 실행은되는데

예를 들어

중간삽입 메뉴에 들어가면
몇번째 노드에 넣을껀지 묻게되는데

3 이라고 입력하면

3번째 노드로 이동합니다

3번째 노드에 새로운 노드 생성해서

그 노드에 데이터를 입력받습니다 ( ex : 100)

그리고 이 새로운 노드를 이전노드와 다음노드에 연결하고

전체 출력해보면 추가 가 안됩니다...

ㅠㅠ

밑에 코드 있습니다 한번 봐주세요 ㅠㅠ 주석을 뒤늦게 달아놨는데 ,,,,,,, 급한게 단다고

지적해주시면 감사하겠습니다.







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

typedef int ElementType;

typedef struct node{                //노드 구조체 선언 (데이터 필드 , 다음 노드 포인터 필드)
        
        ElementType Data;
        node * NextNode;
}Node;


Node* Create_Node(ElementType a){                // 노드 생성 함수 ( 힙영역에 생성만 한 후에 Append_Node 함수로 노드 연결)
        Node* NewNode = (Node*)malloc(sizeof(Node));
        NewNode -> Data = a;
        NewNode -> NextNode = NULL;

        return NewNode;
}

void Append_Node(Node** Head, Node* NewNode)        //생성된 노드 를 연결 하는 함수 /
{
        if( (*Head) == NULL)                                                // 매개 변수를 2개 가지는데 메인함수 내에 변수 Node* List, 와 Node* NewNode 가 있음
        {                                                                                        // Node* List 는 헤드가 됨 .  예를 들어 Append_Node(&List , Create_Node(1)) 사용
                
                (*Head)=NewNode;                                                 // Head 가 NULL 일때 Head 가 NewNode 를 가르키게함.
        }
        else
        {
                Node* Tail = (*Head);
                        while(Tail->NextNode != NULL)                // Head 가 NULL 이 아닐때 임시로 Tail 노드 생성 후 Head  주소값을 줌
                        {
                                Tail = Tail -> NextNode ;                // 노드에 순차 접근하여  NULL 이 될때까지 이동
                        }
                        Tail->NextNode = NewNode;                        // 다음 노드를 가르키는 포인터가 NULL 인경우 생성된 NewNode 를 가르키게 함
        }
}

void menu (void)                                                                        // 메뉴를 생성
{
        printf("=================================\n");
        printf("@@@ Node 추가 (1) @@@@@@@@@@@@@@@\n");
        printf("@@@ Node 중간삽입 (2) @@@@@@@@@@@\n");
        printf("@@@ Node 지정출력 (3) @@@@@@@@@@@\n");
        printf("@@@ Node 전체출력 (4) @@@@@@@@@@@\n");
        printf("=================================\n");
}
        
void booboon(Node** Head, int count)                // 부분 노드 접근 하여 그 데이터를 출력 하기 위한 함수
{        
        int i = 0;                // for 문을 돌리기 위한 변수
        Node* NewNode;        
        NewNode = (*Head);
        for(i=1 ; i != count ; i++)                                // 사용자가 접근하려는 X번째 노드를 접근 (for문 3번돌리면 3번째노드 접근)
        {
                NewNode= NewNode->NextNode ;
        }
        printf("       %d", NewNode->Data);                // 해당 노드 데이터 출력
        printf("\n\n");
}

void Insert_Node (Node** Head , Node* NewNode, int count)                // 중간 노드를 삽입하기 위한 함수 !!!! ( 이부분에서 막힘!!!)
{
        int i = 0;                                //포문 돌리기 위한 변수
        Node* Find;                                                
        //Node* Temp = NULL;
        Find = (*Head);                                // Find 에 Head 주소값 대입
        for(i=1 ; i != count ; i++)                // 해당 노드 접근
        {
                Find = Find ->NextNode ;
        }
        
        NewNode = Find->NextNode;                // 본래 노드가 가르키고 있는 다음노드를 생성된 NewNode 가 가르키게 함
        //Temp = NewNode;
        
        Find->NextNode = NewNode;                // 본래 노드가 가르기고있는 다음노드를  생성된 NewNode 로 바꿈
}

void main (void)
{
        int Num=0;                        // 메뉴 를 선택하기 위한 변수
        int NNUM=0;                        // 추가 할 노드 개수를 입력받기위한 변수
        int input=0;                //생성된 노드의 데이터를 입력받기 위한 변수
        int i=0;                        //for 문 을 돌리기위 한 변수
        Node* List = NULL;
        Node* NewNode = NULL;
        while(1)
        {
        menu();

        scanf("%d",&Num);

        switch (Num){
        
                case 1 :
                        {        
                                printf(" 노드를 몇개 추가할까요? \n");
                                scanf("%d", &NNUM);
                                printf("\n\n");
                                printf("노드 추가중 .........\n");

                                for(i=1 ; i<= NNUM ; i++)
                                {
                                        printf("새로운 노드 입니다. 데이터를 입력해주세요 \n",i);
                                        scanf("%d",&input);
                                        Append_Node(&List , Create_Node(input));
                                        printf("노드 추가 완료. \n", i);
                                        printf("\n\n");
                                }
                                break;
                        }

                case 2 :
                        {        int count = 0 ;
                                int input = 0;

                                printf("몇번째 노드에 삽입 하시겠습니까? \n");
                                scanf("%d",&count);
                                printf("중간 삽입 할 새로운 노드 입니다. 데이터를 입력해주세요. \n");
                                scanf("%d", &input);
                                Insert_Node(&List, Create_Node(input), count);
                                printf("노드 삽입 완료 되었습니다 \n\n");


                                break;
                        }



                case 3 :
                        {        
                                int count = 0;
                                printf(" 몇번째 노드에 접근 하시겠습니까 ? \n");
                                scanf("%d",&count );
                                printf(" %d번째 노드 Data : \n ", count);
                                booboon(&List, count);

                                break;
                        }


                case 4 :
                        {
                                printf(" 노드를 출력 합니다. \n");
                                printf(" 현재 노드는 : \n");
                                for(NewNode = List ; NewNode != NULL; NewNode = NewNode->NextNode)
                                {
                                        printf("        %d        \n",NewNode->Data);
                        
                                }
                                printf("\n");
                        }
        }
        }


        
}


        


  Hit : 8649     Date : 2011/01/06 04:47



    
sonogongx Insert_Node 함수에서
NewNode = Find->NextNode; <-- 이 부분이 잘 못 된것 같은데요...

NewNode->NextNode = Find->NextNode; 이렇게 되야 될것 같습니다.
2011/01/06  
gamja Insert_Node함수 소스대로라면 새로 추가한 노드는 예를들어

3번째 위치에 넣는다고 가정하면,
결과물은 아래처럼 될텐데요
1번노드 -> 2번노드 -> 본래노드(3번노드) -> 생성된 노드 -> 4번노드

소스대로라면 3번째 위치에 추가되지않고 4번째 위치에 추가될껍니다. 추가하려는 위치 다음노드에 저장되지 않았나 확인해보세요.
2011/01/08