[완료] 링크드리스트 전화번호부 짜봤습니다 한번 봐주실수있으실까요
글쓴이: sacredone / 작성시간: 월, 2012/07/09 - 10:45오전
#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 로 초기화하면 에러가 나는데 어떤 부분때문에 그러한지 궁금합니다
Forums:
음 ..
만약 같은 팀원이라면, 이런 사항들을 체크해 보라고 권할 것 같습니다.
- 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 』
single link 는 귀찮아요...
single link 는 귀찮아요...
ㅋ
헤더 구조체에 메모리 할당(동적이던 정적이던) 않을 경우 현재 해더를 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 프로그래머가 될 것 같네요.
답변해주신 두분 감사합니다!
답변해주신 두분 감사합니다!
댓글 달기