[완료] 링크드리스트 전화번호부 짜봤습니다 한번 봐주실수있으실까요

sacredone의 이미지

#include <stdio.h>
 
typedef struct NodeLink{
	struct NodeLink* link; //싱글링크
	int p_number; //전화번호
	char* name; //이름
	char* email; //이메일
}NodeLink;
 
void show_menu()
{
	printf("\n----menu----");
	printf("\ninsert (1)\nremove (2)\nsearch (3)\ndisplay(4)\nexit   (5)\n");
	printf("------------\n");
}
 
//노드 초기화
void init(NodeLink* head)
{
	head->link = NULL;
}
 
//항목 추가
void insertNode(NodeLink* head, NodeLink* target)
{
	printf("%d\n", target->p_number);
	target->link = head->link;
	head->link = target;
	printf("\n	insulting success!!\n");
}
 
//항목 제거
void removeNode(NodeLink* head, NodeLink* target)
{
	NodeLink* p;
	NodeLink* tmp;
	for(p=head;p->link!=NULL;p=p->link){
		if(p->link->p_number==target->p_number){
			tmp = p->link->link;
			free(p->link->name);
			free(p->link->email);
			free(p->link);
			p->link = tmp;
			printf("\n	removing success!!\n");
			break;
		}
	}
	if(p==NULL){
		printf("\n	that number is not exist..\n");
	}
	free(target);
}
 
//항목 한개 출력. 직접사용할 수 없고 searchNode(),displayAll()에서 호출
void displayNode(NodeLink* head, NodeLink* target)
{
	printf("-----------------------\n");
	printf("Phone Number : 0%d\n", target->p_number);
	printf("Name : %s\n", target->name);
	printf("Email : %s\n", target->email);
	printf("-----------------------\n");
}
 
//저장되어있는 모든 항목 출력
void displayAll(NodeLink* head)
{
	int count=0;
	NodeLink* p;
	for(p=head->link;p!=NULL;p=p->link){
		displayNode(head, p);
	}
}
 
//전화번호로 항목 검색
void searchNode(NodeLink* head, NodeLink* target)
{
	NodeLink* p;
	for(p=head->link;p!=NULL;p=p->link){
		if(p->p_number==target->p_number){
			displayNode(head, p);
			break;
		}
	}
	if(p==NULL){
		printf("\n	that number is not exist..\n");
	}
	free(target);
}
 
//항목추가를 위해 사용자로부터 전화번호, 이름, 메일주소 입력
void input_inserting(NodeLink* target)
{
	target->name = (char*)malloc(30*sizeof(char));
	target->email = (char*)malloc(30*sizeof(char));
	if(target->name == NULL || target->email == NULL){
		printf("taking memory couldn't allowed\n");
		return ;	
	}
 
	printf("Phone Number : ");
	scanf("%d", &target->p_number);
	getchar();
	printf("Name : ");
	fgets(target->name, 30, stdin);
	*(target->name+strlen(target->name)-1)=NULL;
	printf("Email : ");
	fgets(target->email, 30, stdin);
	*(target->email+strlen(target->email)-1)=NULL;
}
 
//항목제거, 항목검색을 위한 전화번호 입력
void input_number(NodeLink* target)
{
	printf("Phone number : ");
	scanf("%d", &target->p_number);
	getchar();
}
 
int main(void)
{
	NodeLink* head = (char*)malloc(sizeof(char));
	NodeLink* target;
	char input=0;
 
	init(head);
 
	for(;;){
		show_menu();
 
		target = (NodeLink*)malloc(sizeof(NodeLink));
		if(target == NULL){
			printf("taking memory couldn't allowed\n");
			exit(1);
		}
		printf(">>");
		input = getchar();
		getchar(); 
		switch(input){
			case '1':
				printf("\n--inserting mode--\n");
				input_inserting(target); //사용자로부터 입력받은 값으로
							 //target노드설정
				insertNode(head,target); //설정된 target노드를 추가
				break;
			case '2':
				printf("\n--removing mode--\n");
				input_number(target); 	 //사용자로부터 입력받은 삭제할번호로
							 //target노드설정
				removeNode(head,target); //설정된 target노드 제거
				break;
			case '3':
				printf("\n--searching mode--\n");
				input_number(target); 	 //사용자로부터 입력받은 검색할번호로
							 //target노드 설정
				searchNode(head,target); //설정된 target노드 검색
				break;
			case '4':
				printf("\n--displaying mode--\n");
				displayAll(head);
				free(target);
				break;
			case '5':
				printf("\n--exit--\n\n");
				free(target);
				return 0;
			default :
				printf("\n	wrong number, try again\n");
				break;
		}
	}
	free(head);
}

인턴중이라 회사에서 몇가지 과제를 내주면서 짜보라고 해서 짜본
링크드리스트 전화번호부 입니다

저는 지금껏 학교다니면서 저만 볼거고 저한테만 동작되게 코딩했었는데
앞으로는 함수도 나눠쓰고 다른사람들이 코드를 보는 등
여러가지 일이 생길거 같은데

제가 짠 저 위의 코드가
어떤문제가 있는지 , 이렇게 했으면 더 좋을 꺼라던지 , 함수는 더 추가해야된다던지 더 줄여야된다던지
등등 아무거나 보시는분의 생각을 많이 알고싶어서 글을 올리게 되었습니다

-----------------------------------------------------------

이 코드를 짜면서 궁금한 점은
메인함수에서

헤드노드를 생성해줄 때
malloc 으로 동적메모리 할당 해주지 않고
그냥 선언하고 NULL 로 초기화하면 에러가 나는데 어떤 부분때문에 그러한지 궁금합니다

ymir의 이미지

만약 같은 팀원이라면, 이런 사항들을 체크해 보라고 권할 것 같습니다.

- compiler warning 모두 켜서 잡을 것
- naming convention 통일 할 것.
- comment 를 문서화 할 수 있는 방안을 검토해 볼 것. (eg. doxygen)
- magic number/string 줄이고, 가급적 매크로로 뺄 것.
- module 함수들이 정확하게 동작하는지 검증할 수 있는 코드 삽입할 것. (test case, assert 적극 활용)
- NULL 과 NUL 을 구별할 것.
- internal/external linkage 를 구별 할 것.
- 재사용 하는 pointer 는 free 후에 가급적 NULL 로 초기화 할 것.
- indent 를 적극 활용해서 coding style 을 많이 익혀 둘 것.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

bushi의 이미지

single link 는 귀찮아요...

댓글 첨부 파일: 
첨부파일 크기
Plain text icon sl.c.txt2.96 KB
Plain text icon sl.h.txt994바이트
익명 사용자의 이미지

헤더 구조체에 메모리 할당(동적이던 정적이던) 않을 경우 현재 해더를 NULL 포인터 값을 가르키고 있습니다.

헤더 노드를 초기화 하는 함수

void init(NodeLink* head)
{
head->link = NULL; //head가 Null 인 상태죠
}

당연히 Null에 link 멤버에 라는 접근에서 Null 포인터 참조 에러가 납니다.
NodeLink* head = (char*)malloc(sizeof(char));
이것 자체도 구문상은 에러가 안나지만
왜냐면 head 의 처음 포인터가 link 이기 때문입니다. 1바이트라 할당이 되어 있죠
하지만 다른 멤버에 접근하면 베드 메모리 엑서스 에러가 날것 같네요
그냥 정적으로 선언NodeLink head 또는 NodeLink 크기 만큼 메모리 할당을 해야 될것 같네요.
value, pointer, reference 의 개념과 메모리 관리에 대해 더 공부하시면 좋은 C 프로그래머가 될 것 같네요.

sacredone의 이미지

답변해주신 두분 감사합니다!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.