|
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
|