동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호, hwlee@inje.ac.kr
사용자로부터 양의 정수를 받아들여서 연결리스트에 저장하고 출력하는 프로그램을 작성하시오. 사용자가 -1을 입력할 때 까지 받아들이도록 하시오. 연결 리스트의 노드 구조체를 작성하여 사용하시오. 연결리스트 관련 함수를 작성하는 소스와 main 소스를 분리하여 다른 파일에 작성 하시오. 프로그램이 종료하기 전에 링크드리스트의 내용을 메모리에서 삭제 하도록 하시오. 다음과 같이 출력하도록 하시오.
알고리즘 : main 다음을 무한히 반복한다. 현재까지 받아들인 연결리스트를 출력한다. 양의 정수를 입력하라는 메시지를 출력한다. 표준 출력 버퍼를 비운다. 정수를 받아들인다. 정수가 -1이면 반복을 종료한다. 정수를 연결 리스트에 추가 한다.(add_data) 현재까지 받아들인 연결리스트를 출력한다.
필요한 변수 : main 양의 정수를 저장하는 링크드 리스트의 노드 구조체 변수 INTEGER_NODE 연결리스트의 헤드 노드(head) 받아들인 정수를 저장할 변수(data) 양의 정수를 저장하는 링크드 리스트의 노드 구조체 변수 INTEGER_NODE
링크드리스트 관리에 필요한 함수들 add 동작 후 새로운 노드를 추가 하는 함수 : add_data() 현재의 리스트 내용을 출력하는 함수 : print_list() 현재 링크드릿트의 메모리를 해제하는 함수 : free_list() add 동작 후
매개변수 및 리턴 값 : add_data 매개변수 리턴 값 헤드 노드 포인터(head) 추가할 자료(d) 함수의 종료 상태 값(0:정상 종료, -1: 오류)
알고리즘 : add_data node 를 head로 설정한다. Node의 next가 NULL 이 아니면 다음을 반복한다. node를 node의 next로 설정한다. 새 노드를 위한 메모리를 할당 받는다. 새 노드의 data에 d를 대입한다. 새 노드의 next를 NULL로 설정한다. node의 next 를 새 노드로 설정한다.
매개변수 및 리턴 값 : print_list 매개변수 헤드 노드 포인터(head) 리턴 값 없음(void)
알고리즘 : print_list node를 head로 설정한다. Node가 NULL이 아니면 다음을 반복한다. 노드의 data를 출력한다. node의 next가 NULL이 아니면 -> 를 출력한다. node를 node의 next로 설정한다.
매개변수 및 리턴 값 : free_list 매개변수 헤드 노드 포인터(head) 리턴 값 없음(void)
알고리즘 : free_list node를 head로 설정한다. node가 NULL이 아니면 다음을 반복한다. temp에 node를 할당한다. node를 node의 next로 설정한다. temp를 메모리 해제한다.
프로젝트 생성 프로젝트명 입력 : linked Empty Project 선택 Cygwin GCC 콤파일러 선택 생성된 빈 프로젝트
소스 작성(1) main 함수 소스파일명 입력 : main.c linked main.c
소스 작성(2) main 함수 소스수정 생성된 빈 소스 파일 실행프로그램이 되기 위한 최소 내용이 추가된 소스 파일 main.c main.c main.c 소스수정 생성된 빈 소스 파일 실행프로그램이 되기 위한 최소 내용이 추가된 소스 파일
소스작성(3) main 함수 링크드리스트 관련 함수에 관한 헤더 파일 헤드노드 포인터를 저장하는 변수 입력한 정수를 저장하는 변수 다음을 무한히 반복한다. 양수를 입력하라는 메시지를 출력하고 정수를 받아들인다. 입력한 정수가 -1이면 반복을 종료 한다. 헤드가 널이면 새로 할당하고 자료를 저장하고 next를 널로 설정한다. 아니면 헤드노드에 자료를 추가한다.
소스작성(4) : 링크드리스트 관련 함수 헤더 및 소스 추가 linked.h linked.c 헤더파일명 입력 : linked.h 소스파일명 입력 : linked.c
소스작성(5) : linked.h Eclipse 가 자동으로 추가해준 헤더 이중 포함 방지 매크로 링크드리스트의 노드를 나타내는 구조체 타입 INTEGER_NODE 선언 링크드리스트에 관련한 함수의 원형 선언
소스작성(6): linked.c 프로그램에 필요한 헤더를 포함한다.
소스작성(7): linked.c add_data() 함수 현재 노드와 새노드를 저장할 포인터 node를 head로 설정한다. node의 next가 널이 아니면 node 를 node의 next로 설정한다. 새노드를 위한 메모리를 할당하고 새노드의 data를 d로 설정하고 next를 널로 설정한다. node의 next를 새노드로 설정하여 노드를 연결한다.
소스작성(8): linked.c print_list() 현재 노드를 저장할 포인터 변수 node를 head로 설정한다. 화면에 메시지를 출력한다. Node가 널이 아니면 node의 data를 출력한다. Node의 next가 널이 아니면 ->를 출력한다.
소스작성(9): linked.c free_list() 현재 노드를 저장할 포인터 변수 node를 head로 설정한다. 현재 노드 포인터를 임시로 저장한다. node를 다음 노드로 설정하고 임시노드를 작제한다.
소스작성(10) 전체 소스 : main.c
소스작성(11) 전체 소스 : linked.h
소스작성(12) 전체 소스 : linked.c
실행 하기 소스 저장 linked 프로젝트 빌드 프로그램 실행
실행 예
스크린샷 예제 724쪽 6번 725쪽 7번