수다닷컴

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

c언어를 이용한 단순연결리스트 구현에대해 질문합니다. (급)

알버트

2023.04.01

질문 제목 : c언어를 이용한 단순연결리스트 구현에대해 질문합니다.가져 온 코드에서 addlastnod함수에서 쓰는 listnod* p가 지역변수 처럼 이용된게 아닌가요?질문 내용 :

#includestdio.h
#includestdlib.h
#includestring.h
typedef struct listnode{
char date[10];
struct listnode* link;
} listnode;
typedef struct{
listnode* head;
} linkedlist_h;
linkedlist_h* createlinkedlist_h();
void freelinkedlist_h(linkedlist_h*);
void addlastnode(linkedlist_h*, char*);
void reverse(linkedlist_h);
void deletelastnode(linkedlist_h*);
void printlist(linkedlist_h);

linkedlist_h* createlinkedlist_h(){
printf(링크 헤드 생성\n);
linkedlist_h* l;
l = (linkedlist_h*)malloc(sizeof(linkedlist_h));
l - head = null;
return l;
}
void addlastnode(linkedlist_h* l, char* x){
printf(마지막 노드 추가\n);
listnode* newnode;
listnode* p;
newnode = (listnode*)malloc(sizeof(listnode));
strcpy(newnode - date, x);
newnode - link = null;
if(l - head == null){
l - head = newnode;
printf(0\n);
printf(%s %d\n,newnode-date,newnode-link);
printf(%d\n,l - head);
return;
}
p = l - head;
printf(1\n);
printf(%s %d\n,p-date,p-link);
printf(%s %d\n,newnode-date,newnode-link);
printf(%d\n,l - head);
while (p - link != null){
p = p - link;
printf(2\n);
printf(%s %d\n,p-date,p-link);
printf(%s %d\n,newnode-date,newnode-link);
printf(%d\n,l - head);
}
p - link = newnode;
printf(3\n);
printf(%s %d\n,p-date,p-link);
printf(%s %d\n,newnode-date,newnode-link);
printf(%d\n,l - head);
}
void reverse(linkedlist_h* l){
listnode* p;
listnode* q;
listnode* r;
printf(리버스 함수 시작\n);
p = l - head;
//printf(%d %u\n,p-date,p-link);
q = null;
//printf(%d %u\n,p-date,p-link);
r = null;
//printf(%d %u\n,p-date,p-link);
while (p!=null){
r = q;
//printf(%d %u\n,r-date,r-link);
q = p;
//printf(%d %u\n,q-date,q-link);
p = p-link;
//printf(%d %u\n,p-date,p-link);
q - link = r;
//printf(%d %u\n,q-date,q-link);
}
l - head = q;
printf(%u\n,l-head);
}
void deletelastnode(linkedlist_h* l){
listnode* previous;
listnode* current;
printf(마지막 노드 삭제\n);
if(l-head == null) return;
if(l-head-link == null) {
free(l-head);
l-head = null;
return;
}
else{
previous = l - head;
//printf(%d %u\n,previous-date,previous-link);
current = l - head - link;
//printf(%d %u\n,current-date,current-link);
while(current - link != null){
previous = current;
//printf(%d %u\n,previous-date,previous-link);
current = current - link;
//printf(%d %u\n,current-date,current-link);
}
free(current);
previous - link = null;
}
}
void freelinkedlist_h(linkedlist_h* l){
listnode* p;
printf(전체 노드 삭제\n);
while(l - head != null){
p = l - head;
//printf(%d %u\n,p-date,p-link);
l - head = l - head - link;
//printf(%u\n,l-head);
free(p);
p = null;
//printf(%d %u\n,p-date,p-link);
}
}
void printlist(linkedlist_h* l){
listnode* p;

printf(리스트 출력\n);
printf(l = ();
p = l - head;
//printf(6\n);
//printf(%d %u\n,p-date,p-link);
while(p != null){
printf(%s, p-date);
p = p-link;
if(p != null) printf(,);
}
printf()\n);
}
int main()
{
linkedlist_h* l;
l = createlinkedlist_h();
printf((1) 공백 리스트 생성하기! \n);
printlist(l); getchar();
printf((2) 리스트에 3개의 노드 추가하기! \n);
addlastnode(l, 월);
printf(maind\n);
printf(%d\n,l -head);
addlastnode(l, 화);
printf(maind\n);
printf(%d\n,l -head);
addlastnode(l, 수);
printf(maind\n);
printf(%d\n,l -head);
printlist(l); getchar();
printf((3) 리스트 마지막에 노드 한개 추가하기! \n);
addlastnode(l, 일);
printlist(l); getchar();
printf((4) 마지막 노드 삭제하기! \n);
deletelastnode(l);
printlist(l); getchar();
printf((5) 리스트 원소를 역순으로 변환하기! \n);
reverse(l);
pprintlist(l); getchar();
printf((6) 리스트 공간을 해제하여, 공백 리스트 상태로 만들기! \n);
freelinkedlist_h(l);
printlist(l);
getchar();
return 0;
}

코드 전체는 이렇구요 제가 궁금한건 addlastnod함수에서 사용 동적할당이되서 새로운 구조체가 만들어지고 그 구조체끼리 서로 연결하게 만드는 과정을 수행하는데요... 저기서 이상한게 제가 생각하기로는 listnod* p가 지역변수로 사용되서 함수 호출이 끝나면 사라질텐데... 다음 함수 호출에서 안사라지고 이전에 저장해둔 값을 가지고있다는 겁니다.
제 생각대로라면 이렇게 돌아가야하는데요...

addlastnod(l, 월) 이게 나오면

newnod의 date에는 월이 들어가고 link에는 null이 들어가겠죠 그리고
l의 head에는 월이 들어간 newnod의 주소값이 들어갈 꺼구요.
그리고 다음으로
addlastnod(l,화)이 호출되면
새롭게 newnod가 동적할당되고 date에는 화 link에는 null이 들어가겠죠

그러면 현제 메모리상에 newnod로 동적 메모리 할당된 메모리가 두개 있고
그 두개의 이름을 각 각 a,b라 하면
a date link b date link
월null 화 null
이렇게 되있겠죠
그리고 l의 head는 여전히 a의 주소값을 가지고 있을꺼구요 그러므로 if문에 걸리지 않으니
밑으로 내려와 p를 만나겠죠

p = l - head되있으니
p에 head가 가진 a에 주소값이 들어갈꺼에요.
그럼 p는
p date link
a의주소값 null
이렇게 되있겠죠 실제로 출력해본 결과 이렇게 되있었습니다.
그리고 그 밑에 while문에 걸리지 않으니 곧바로

p - link= newnode
이걸 만납니다.

그럼 결국 함수 끝에서 p는

p date link
a의주소값 b의 주소값
근데 이렇고 함수가 끝나기 때문에
p는 지역변수와 같이 여기서 사라지고

다시 main으로 와서

addlastnode(l, 수)가 호출되죠

그리고 힙영역에는
newnode가 동적 메모리를 할당받아 생성된 3개의 구조체가 있을꺼구요 각각 이름을 a,b,c로 두면

a date link b date link c date link
월null 화 null 수 null

이렇게 잡혀있을꺼구요.

역시 if는 안걸리고
p = l - head를 수행하면
p date link
a주소값 null
이렇게 되서 while에 걸리지 않고

p - link = newnode
가 실행되고

p date link
a의주소값 c의주소값

이렇게 되는거 아닌가요???

근데 프로그램을 실행해보면 참 잘 돌아갑니다 모든 구조체가 연결되어서 말이죠....
p가 지역변수라서 분명히함수가 끝나면 없어 질텐데 안없어지고 저장된 값을 그대로 보존한채로 프로그램이 진행되더군요
그리고 더 의문인건 도대체 어느 부분에서 a,b,c끼리 연결이 되었느냐는 겁니다... 분명 그냥 p만 date의 값이랑 link값을 변경시켰을뿐인데 말이죠...

신청하기





COMMENT

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

번호 제 목 글쓴이 날짜
2695766 달팽이 배열 어디서 틀렸는지 모르겠습니다ㅠㅠ 연분홍 2025-05-23
2695738 fopen과fclose질문~~ (5) 희선 2025-05-23
2695707 3의 배수 나타내기. (2) 수리 2025-05-23
2695626 피보나치수열 과제 때문에 질문 드립니다. (6) 옆집언니 2025-05-22
2695595 포인트공부중입니다 int형에서 4=1 인가요? (3) 족장 2025-05-22
2695567 드라이브 고유번호를 가져오는 함수 (2) 초코맛사탕 2025-05-21
2695533 음수의 산술변환! 질문이요 ㅠㅠ... (4) 꽃여름 2025-05-21
2695506 구조체 배열 이용 도서목록 출력 프로그램 (1) 가을귀 2025-05-21
2695450 c언어 함수 질문이요.... 이슬비 2025-05-20
2695403 VirtualAlloc함수 및 메모리 질문 크리에이터 2025-05-20
2695355 c언어 for함수 미쿡 2025-05-19
2695327 안녕하세요 제가 이번에 좀 큰 프로그램을.. 악당 2025-05-19
2695295 mutex동기화의 thread기반 채팅 서버소스 질문입니다 그루터기 2025-05-19
2695270 질문이요..swap 관한겁니다..ㅠㅠ (3) 콩알녀 2025-05-19
2695244 노땅초보궁금한게 하나 있는데요..반복문(while문)초보자질문 (6) 큰꽃늘 2025-05-18
2695166 do while 문 어떤것이잘못된건지 모르겠어요 (2) 아이폰 2025-05-18
2695122 구조체에 대해 물어보고 싶은게 있습니다 ^^^.. (7) 수련 2025-05-17
2695091 txt 파일 입출력 후 2차 배열에 저장하기입니다. (3) 헛장사 2025-05-17
2695063 수도요금 프로그램좀 짜주세요. 시내 2025-05-17
2695033 답변좀요ㅠㅠ (1) 비사벌 2025-05-16
<<  이전  1 2 3 4 5 6 7 8 9 10  다음  >>

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