연결 리스트 개념 잡는 것 좀 도와주세요ㅠ
역곡중
#include stdio.h
#include stdlib.h
struct Node
{
int nData; //데이터
Node *pNext; //다음 노드에 대한 링크
};
//함수 정의부
void InsertNode (Node *pPrev, int nData)
{
//새로운 노드를 생성한다.
Node *pNode = NULL;
pNode = (Node *) malloc (sizeof(Node));
pNode-nData = nData;
//이전 노드의 링크를 저장한다.
pNode-pNext = pPrev-pNext;
//이전 노드의 링크에 새로운 노드 주소를 저장한다.
pPrev-pNext = pNode;
}
void DeleteNode (Node *pPrev)
{
//삭제할 노드
Node *pDelNode = pPrev-pNext;
//삭제할 노드 링크 정보를 저장한다.
pPrev-pNext = pDelNode-pNext;
//노드를 삭제한다.
free(pDelNode);
}
void TraverseNode (Node *pNode)
{
Node *pPointer = pNode;
//노드의 데이터를 출력한다.
printf(%d , pPointer-nData);
//다음 노드 정보가 있으면 반복한다.(재귀호출)
if (pPointer-pNext != NULL)
TraverseNode(pPointer-pNext);
}
//메인 프로그램 실행부
int main()
{
//최초 머리노드와 꼬리노드 구성
Node head, tail;
head.nData = 10;
tail.nData = 20;
head.pNext = &tail;
tail.pNext = NULL;
TraverseNode (&head);
printf(\n);
InsertNode(&head, 2);
InsertNode(&head, 4);
InsertNode(&head, 1978);
TraverseNode (&head);
printf(\n);
DeleteNode(&head);
DeleteNode(&head);
DeleteNode(&head);
TraverseNode (&head);
printf(\n);
return 0;
}
헐..그저 노드 삽입하고 삭제하고, 탐색하는 가장 기본적인 프로그램을 적은건데 꽤 길어 보이네요 -_-;
다름이 아니라, 개념 자체에서 헷갈리고 있습니다. 우선, InsertNode()함수의 첫번째 문장에 있는Node *pNode = NULL;의 정확
한 의미를 알고 싶습니다. 제가 생각하기로는 pNode라는 노드를 생성하여 그 노드의 링크값이 저장되는 영역이 아닌 데이터 영역에 null값을 저장한다 라고 생각하는데 맞는지 모르겠습니다. 두번째 질문은 InsertNode함수는 pNode란 이름의 노드를 새로 생성하는 함수인데, main함수에서 InsertNode 함수를 세 번 연달아 실행했는데 그렇게 되면 메모리상에 pNode란 이름을 가진
노드가 3개가 생성이 되는데, 결론은 같은 이름(위에서는 pNode) 가진 노드가 계속 생성되도 괜찮은지 알고 싶습니다. 노드의
이름이 같게 되면 충돌하지 않을까요? 마지막 질문은, InsertNode 함수에서pNode = (Node *) malloc (sizeof(Node)); 이 문장이 왜 필요한지 모르겠습니다. 위에서 Node *pNode = NULL;의 의미가 노드를 새로 생성했다는의미인데노드가 새로 생성되었으면 그냥pNode-nData = nData; 해서 데이터값을 넣으면 될텐데, 굳이 왜 동적메모리를 할당하는지 모르겠습니다. 참고로
동적메모리 할당 라인을 지워보니 에러가 나더군요ㅜ
이건 뭐.. 글재주가 없다보니질문조차 이해하실지 모르겠네요ㅜ글이 좀 길더라도 도서관에서 5시간째 해매고 있는불쌍한
이를 위해 답변 좀 부탁드립니다. 1시간 뒤에 도서관에 문 닫네요 -_-;
-
수예
혹시 pNode가 사라지면 노드도 사라지는 게 아니냐? 라는 생각을 할지도 모르시겠군요..
하지만 그건 아닙니다. pNode는 일회용(?) 변수 이라고 생각하시면 되겠습니다.
malloc으로 메모리를 할당받은 주소를 잠깐 pNode 변수에 담아두었다가
그 주소를 pPrev-pNext = pNode로 pPrev-pNext에 저장하기 때문에
잠깐 주소를 담아두었던 pNode는 사라져도 노드(메모리)는 아무 문제 없는 것입니다..^^ -
지음
아..야메떼님 답변 덕분에 완전 이해^^.. 그러니까 선언만 해주었을 뿐이지 malloc에 의해 공간이 생성되는 거네요.. 아.. 정말 감사드립니다!!!... 아.. 감동 ㅋ
-
지은
2. pNode 포인터 변수는.. 지역변수 이기 떄문에 몇번을 호출해도 문제가 없습니다.
지역변수에 대한 개념이 잘 잡혀 있으시면 쉽게 이해하시리라 생각되네요.
간단하게 설명하자면, 지역변수는 { } 로 묶여있는 지역에서만 의미있고,
그 지역을 빠져나오게되면 사라지게 됩니다. InsertNode함수도 하나의 지역이라고 볼 수 있죠.
메인에서 처음으로 InsertNode 함수를 실행해서 pNode 변수를 만들고,
InsertNode 함수가 종료하는 -
알찬마루
1. Node *pNode = NULL 은 노드를 새로 생성하는 코드가 아닙니다..
Node형 구조체를 가리킬 수 있는 포인터를 선언하는 겁니다.
거기에 NULL을 대입해 주는 이유는, 쓰레기값으로 초기화된 pNode가
이상한 주소를 가리키지 않도록 안전빵(?)으로 NULL로 초기화 해 주는 거죠..ㅎ
노드를 생성하는 코드는 pNode = (Node *) malloc (sizeof(Node)); 이 부분입니다.
malloc함수로 Node구조체의 크기
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2676474 | 함수 수행시간 측정에 대해서 질문 할께요 | 핑크빛애교 | 2024-11-27 |
2676443 | 이상해요!! (2) | 다온 | 2024-11-27 |
2676415 | scanf 함수 | Creator | 2024-11-26 |
2676357 | 질문있어요..ㅜㅜ (1) | 일진누나 | 2024-11-26 |
2676326 | exit문으로 프로그램 종료가 되지 않습니다. (4) | 달달한캔디 | 2024-11-26 |
2676298 | 코드 해석좀 부탁 드려요 | 남 | 2024-11-25 |
2676182 | 숫자 순서대로 배열하는법 | 권뉴 | 2024-11-24 |
2676152 | 기본적인거 하나 질문드립니다. | 개미 | 2024-11-24 |
2676124 | 함수선언관련 질문이에요~...털썩..수정완료 (2) | 가지 | 2024-11-24 |
2676092 | C언어 책 (2) | 아서 | 2024-11-24 |
2676065 | 웹사이트 또는 메신저 등에서 원하는 텍스트를 검사하는방법?? (1) | 모든 | 2024-11-23 |
2676033 | 배열 기초연습중 발생하는 에러 ㅠㅜ... | Creative | 2024-11-23 |
2676005 | keybd_event 게임 제어 | 영글 | 2024-11-23 |
2675900 | 진짜기본적인질문 | 글길 | 2024-11-22 |
2675845 | 수정좀해주세요ㅠㅠㅠ | 해골 | 2024-11-21 |
2675797 | 병합 정렬 소스 코드 질문입니다. (2) | 도래솔 | 2024-11-21 |
2675771 | 큐의 활용이 정확히 어떻게 되죠?? | 해긴 | 2024-11-21 |
2675745 | 도서관리 프로그램 질문이요 | 도리도리 | 2024-11-20 |
2675717 | 2진수로 변환하는것! (3) | 동생몬 | 2024-11-20 |
2675599 | for문 짝수 출력하는 법 (5) | 널위해 | 2024-11-19 |