동적메모리 c언어 질문합니다.

김영호@Facebook의 이미지

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 30
typedef struct NODE{
	char name[SIZE];
	char num[SIZE];
	struct NODE *link;
}NODE;
int menu();
void initialize(NODE *p,NODE *list,NODE *next);
void add(NODE *p,NODE *list,NODE *prev);
void search(NODE *p,NODE *next,NODE *list);
int main(void)
{
	NODE *list=NULL;
	NODE *p,*prev,*next;
	int men=0;
	while((men=menu())!=4)
	{
	getchar();
	if(men==1)
		{initialize(p,list,next);}
	else if(men==2)
		{add(p,list,prev);}
	else if(men==3)
		{search(p,next,list);}
	}
	p=list;
		while(p!=NULL)
		{
			next=p->link;
			free(p);
			p=next;
		}
	return 0;
}
int menu()
{
	int a=0;
	printf("연결 리스트를 이용한 전화 번호부 메뉴\n");
	printf("-------------------------\n");
	printf("1. 초기화\n");
	printf("2. 전화 번호 추가\n");
	printf("3. 전화 번호 탐색\n");
	printf("4. 종료\n");
	printf("-------------------------\n");
	scanf("%d",&a);
	return a;
}
void initialize(NODE *p,NODE *list,NODE *next)
{
	p=list;
		while(p!=NULL)
		{
			next=p->link;
			free(p);
			p=next;
		}
		printf("초기화가 완료되었습니다.\n");
}
void add(NODE *p,NODE *list,NODE *prev)
{
	p=(NODE*)malloc(sizeof(NODE));
		printf("이름: ");
		gets(p->name);
		printf("번호: ");
		gets(p->num);
		if(list==NULL)
		{list=p;}
		else
		{prev->link=p;}
		p->link=NULL;
		prev=p;	
}
void search(NODE *p,NODE *next,NODE *list)
{
	char nam[SIZE];
	printf("찾을 이름: ");
	gets(nam);
	p=list;
	while(p!=NULL)
	{
		next=p->link;
		if(strcmp(p->name,nam)==0)
		{printf("전화 번호는 %s입니다.\n",p->num);
		break;}
		p=next;
	}
}

이게 전화번호부 저장 프로그램인데 밑에 intialize, search, add 이런 함수로 안하고 main 함수에 다때려박으면 지극히 정상적으로 실행이되는데
저렇게 기능을 모듈로 분리해놓으면 메인함수에 설정한 p,next,list 가 초기화가 안되었다고 실행이안됩니다.
그렇다고 p,next,list 를(포인터니까_) NULL 로 초기화 시켜버리면 연결리스트 자체가 성립이 안되어버리는데
이럴경우 p,next,list를 어떻게 초기화시켜줘야되는건가요??
일단 main 함수에서 위 세개 를 초기화를 시켜줘야 프로그램이 실행이될텐데... 궁금하네요
익명 사용자의 이미지

1.

코드는 < code> < /code> 태그로 감싸서 올려주세요.

2.

list, p 등을 전역 변수로 만드세요.

3.

또는 호출할 때 주소를 넘기고

add( .... &list .... );

호출받는 쪽에서는

void add( ... NODE **list .... ) {
   *list = ...
}
익명 사용자의 이미지

그리고 코드를 대충 훑어본거라서 잘못 봤을 수도 있긴 한데,
예를 들어 p 변수는 정말 main에서 선언하고 매번 넘겨줘야 하는 건지 매우 의문이군요. 각 함수 내에서 임시로 사용되는 거니까 함수 지역 변수로 선언해서 쓰면 되지 않을까 생각해보시죠.

김영호@Facebook의 이미지

말끔히해결되었습니다

김영호@Facebook의 이미지

계속 헤드포인터로 사용하는 list가 NULL로초기화 되네요.. 한번만초기화되야되는데 add함수 불러올때마다
초기화가되요 왜이런건지 참 ㅜ

라스코니의 이미지

function(NODE *p)로는 함수 내에서 p에 대한 어떤 조작을 해도 그 영향이 밖으로 전파되지 않습니다.

function(NODE **p)로 p의 base address를 넘겨주어야 그 변경사항이 호출한 쪽에 전파됩니다.

김영호@Facebook의 이미지

말끔히 해결되었네요... 변수의 원본을 바꾸려면 포인터를 쓰고 포인터의 원본을 바꾸려면 이중포인터를 써야한다는 진리를 잊고있었네요... 바보같이 참.. 정말감사합니다

shint의 이미지

구현은 했는데... 윈도우10 64비트에서. 작업 관리자를 보니. 메모리 해제가 안됩니다.
뭔가 문제가 있나봅니다.
다시 확인해보니. 다음 주소가 삭제되서 그런거였네요. 거꾸로 삭제하니. 정상 해제 됩니다.
첨부된 소스는. 다시 올렸습니다.

아래 게시글 내용은. 예전에 확인된 예제입니다.
http://kldp.org/node/153885 

http://kldp.org/node/154578

https://kldp.org/node/155176

- 무조건 추가로 입력되는 노드는 tail 꼬리입니다.
- 구조체 값을 함수에서 referece 참조하는 방법을 몰라서 리턴값으로 구현해봤습니다.
- 전체 출력을 위해서. 맨 처음에 생성한 Node 주소를 head로 사용했습니다.

댓글 첨부 파일: 
첨부파일 크기
Package icon 링크드 리스트 - 메모리 해제.zip7.17 KB

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.