수다닷컴

  • 해외여행
    • 괌
    • 태국
    • 유럽
    • 일본
    • 필리핀
    • 미국
    • 중국
    • 기타여행
    • 싱가폴
  • 건강
    • 다이어트
    • 당뇨
    • 헬스
    • 건강음식
    • 건강기타
  • 컴퓨터
    • 프로그램 개발일반
    • C언어
    • 비주얼베이직
  • 결혼생활
    • 출산/육아
    • 결혼준비
    • 엄마이야기방
  • 일상생활
    • 면접
    • 취업
    • 진로선택
  • 교육
    • 교육일반
    • 아이교육
    • 토익
    • 해외연수
    • 영어
  • 취미생활
    • 음악
    • 자전거
    • 수영
    • 바이크
    • 축구
  • 기타
    • 강아지
    • 제주도여행
    • 국내여행
    • 기타일상
    • 애플
    • 휴대폰관련
  • 프로그램 개발일반
  • C언어
  • 비주얼베이직

연결 리스트 개념 잡는 것 좀 도와주세요ㅠ

역곡중

2023.04.01

#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시간 뒤에 도서관에 문 닫네요 -_-;

신청하기





COMMENT

댓글을 입력해주세요. 비속어와 욕설은 삼가해주세요.

  • 수예

    혹시 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구조체의 크기

번호 제 목 글쓴이 날짜
2694646 안녕하세요 파일 합치기 함수! (1) 연블루 2025-05-13
2694618 잘몰라서 설명부탁드립니다. scanf 관련 (3) 파라 2025-05-12
2694590 이 코드가 뭐하는 코드일까요? #2 빵순 2025-05-12
2694559 동적할당으로 배열(2차원열)을 만드는데 있어 그걸 함수화시키는데... (1) 늘솔길 2025-05-12
2694532 네트워크에 관하여... (4) 황소자리 2025-05-12
2694503 프로그램 연산 후 바로 종료되는 현상 (6) Judicious 2025-05-11
2694450 while문질문입니다. (1) 허리품 2025-05-11
2694420 C언어 질문할게요(유니코드,자료형,버퍼,캐스트연산자) 은새 2025-05-11
2694370 내일까진데 함수호출 제발 도와주세요!!!!!!!!!11 들찬 2025-05-10
2694339 putchar()의 괄호 안에 int c=10;로 전에 선언된 c를 넣으면 안되는 이유에서 제가 생각한 것이 그 이유가 되는지 확인하고 싶습니다. (3) 미르 2025-05-10
2694316 이 코드 어디가 잘못되었는지 고수분들 ㅠㅠ (2) 나빛 2025-05-10
2694285 언어 공부하는 과정 좀 추천해주세요! (1) 아빠몬 2025-05-09
2694258 카운터.. 질문입니다. (4) 하늘빛눈망울 2025-05-09
2694229 단순한 질문이요 (8) 여름 2025-05-09
2694202 용돈을 가지고 할 수 있는 일을 여러가지로 출력하는 방법 좀 알려주세요! (2) 미나 2025-05-09
2694145 화면깜빡임을 없애고 싶은데요... (1) 어서와 2025-05-08
2694069 unsigned 질문입니다. 힘차 2025-05-07
2694012 전공 비전공자 개발자 (10) 말글 2025-05-07
2693984 오버로딩이 무엇인가요? (2) 헛매질 2025-05-07
2693956 PlaySound재생이 안됩니다!(C에 음악넣기) 지존 2025-05-06
<<  이전  1 2 3 4 5 6 7 8 9 10  다음  >>

수다닷컴 | 여러분과 함께하는 수다토크 커뮤니티 수다닷컴에 오신것을 환영합니다.
사업자등록번호 : 117-07-92748 상호 : 진달래여행사 대표자 : 명현재 서울시 강서구 방화동 890번지 푸르지오 107동 306호
copyright 2011 게시글 삭제 및 기타 문의 : clairacademy@naver.com