C언어 응용 제6주 실습 해보기 제5장
예제 5-1 실습하기 단순연결 리스트 구현 단순 연결리스트를 구현하고 이와 연관된 함수를 구현 한다. 단순연결리스트를 구현한 소스파일과 헤더파일을 따 로 작성한다. 구현한 함수 목록 createLinkedList_H : 단순연결리스트 생성 freeLinkedList : 단순연결 리스트가 사용하는 메모리 반환 addLastNode : 마지막 노드에 노드 추가 reverse : 리스트의 순서를 역순으로 바꾼다. deleteLastNode : 마지막 노드를 삭제 한다. printList : 연결리스의 내용을 출력한다.
소스 목록 및 내용 linkedlist.h : 연결리스트 구현에 필요한 자료형과 함수의 원형을 선언하는 헤더 파일 linkedlist.c : 연결리스트 구현에 필요한 함수의 내용을 작성한 소스 ex0501.c : 연결리스트를 테스트하는 main 소스 파일
실습하는 순서 Eclipse 를 실행한다. Workspace와 Perspective가 맞는지 확인 하고 맞지 않으면 수정한다. Workspace 는 D:\Lec_hwlee\Capp\y2014 이고 Perspective 는 C/C++ 이어야 한다. 프로젝트 생성 linkedlist.h 파일 작성 linkedlist.c 파일 작성 ex0501.c 작성 빌드 및 실행 결과 확인
소스들 사이의 연관 관계 linkedlist.h ex0501.c 연결리스트 구현에 필요한 구조체와 필요한 함수의 원형을 선언한다. ex0501.c 구현된 연결리스트를 테스트 해보는 main 소스 포함한다. 포함한다. 실제 함수를 호출하여 사용한다. linkedlist.c 연결리스트 구현에 필요한 함수의 내용을 작성한다.
필요한 구조체 노드 구초체 요일을 저장할 것이므로 자료필드는 문자열을 저장할 수 있는 문자배열을 사용한다. 요일을 저장할 것이므로 자료필드는 문자열을 저장할 수 있는 문자배열을 사용한다. 링크 필드는 다음 노드의 주소를 저장하는 노드 구조체 포인터 변수를 사용한다.
필요한 구조체 노드 헤드 구조체 노드의 시작 구조체의 주소를 저장할 노드 구조체 포인터 변수를 멤버로 가지는 구조체이다.
필요한 함수 리턴 타입 함수명 매개변수 기능 LinkeList_H * createLinkedList_H void 새로운 단순 연결 리스트를 생성한다 freeLinkedList LinkedList_H * 해당하는 연결리스를 메모리에서 삭제한다. addLastNode LinkedList_H *, char * 주어진 문자열을 데이터로 갖는 노드를 마지막에 추가한다. reverse 연결리스트의 순서를 뒤집는다. deleteLastNode 마지막 노드를 삭제한다. printList 연결 리스트를 출력한다.
함수 가상 코드 createLinkedList_H() L ← allocate memory for LinkedList_H; return L; End createLinkedList_H
함수 가상 코드 freeLinkedList(LinkedList_H *L) while (L.head ≠ NULL) do { p ← L.head; L.head ← L.head.link; free(p); p ← NULL; } End freeLinkedList
함수 가상 코드 addLastNode(LinkedList_H *L, char *data) node ← allocate memory for ListNode; node.data ← data; if (L.head = NULL) then { L.head ← node; return; } p ← L.head; while (p.link ≠ NULL) do { p ← p.link; p.link ← node; End addLastNode
함수 가상 코드 reverse(LinkedList_H *L) p ← L.head; q ← NULL; r ← NULL; while (p ≠ NULL) do { r ← q; q ← p; p ← p.link; q.link ← r; } L.head ← q; End reverse
함수 가상 코드 deleteLastNode(LinkedList_H *L) if (L.head = NULL) then { rerurn; } if (L.head.link = NULL) then { free(L.head); L.head ← NULL; return; else { previous ← L.head; current ← L.head.link; while (current.link ≠ NULL) do { previous ← current; current ← current.link; free(current); previous.link ← NULL; End deleteLastNode
함수 가상 코드 printList(LinkedList_H *L) write “L=(“; p ← L.head; while (p ≠ NULL) do { write p.data +”->”; p ← p.link; } write “) \n”; End printList
main 소스 코드 연결 리스트를 만들고 구현한 함수들이 정상 동작 하는지를 테스트하는 코드를 작성한다.
main 의 가상 코드 L ← createLinkedList(); write message printList(L); addLastNode(L, “월”); addLastNode(L, “수”); addLastNode(L, “금”); addLastNode(L, “일”);
main 의 가상 코드 deleteLastNode(); write message printList(L); reverse(L); freeLinkedList(L); free(L);
Eclipse 실행 D:\Lec_hwl\CApp\y2014
Eclipse 실행
Workspace 확인 D:\Lec_hwl\CApp\y2014
CDT Perspective 확인 이 버튼을 클릭해서 수정 Java EE 로 되어 있음
CDT Perspective 확인 C/C++ 선택
CDT Perspective 확인 C/C++ 로 되어 있음
새 프로젝트 생성 File->New->C Project 반드시 C Project를 택할 것
프로젝트 명 설정 Ch05Ex01 Empty Project Cygwin GCC D:\Lec_hwl\capp\y2014\Ch05Ex01
프로젝트 구성 설정 Debug 버전과 Release 버전 모두 사용
생성된 빈 프로젝트
linkedlist.h 추가 및 작성 Header File 선택
linkedlist.h 추가 및 작성 linkedlist.h 헤더 파일 명 설정
linkedlist.h 추가 및 작성 자동 생성된 빈 헤더 파일 헤더가 여러 소스에서 포함되었을 때 이중으로 포함되지 않도록 하는 매크로 실제 헤더의 내용이 들어갈 위치
linkedlist.h 추가 및 작성 구조체 및 함수 원형 선언
linkedlist.c 추가 및 작성 Source File 선택
linkedlist.c 추가 및 작성 linkedlist.c 소스 파일명 설정
linkedlist.c 추가 및 작성 자동 생성된 빈 소스 파일
linkedlist.c 추가 및 작성 필요한 코드 작성(빈 함수 작성) 표준 입출력 함수 헤더 메모리 할당 함수 헤더 문자열 복사 함수 헤더 연결리스트 관련 구조체 및 함수 헤더 필요한 각 함수의 원형에 맞게 함수의 몸체를 작성하되, 내용은 모두 빈 것으로 작성한다. 차후에 한 함수씩 코드의 내용을 작성한다.
createLinkedList_H()
freeLinkedList()
addLastNode()
reverse()
deleteLastNode()
printList()
ex0501.c 추가 및 작성 Source File 선택
ex0501.c 추가 및 작성 ex0501.c 소스 파일명 설정
추가된 빈 소스 파일 프로젝트에 3 개의 파일 ex0501.c, linkedlist.c, linkedlist.h 가 추가된 것을 확인할 수 있다.
main 함수 작성 빈 main 함수 작성 표준 입출력 함수 헤더 연결리스트 관련 구조체 및 함수 헤더
main 함수 작성
main 함수 작성
main 함수 작성
빌드 및 실행 결과
도전 문제 연결 리스트의 맨 앞에 노드를 삽입하는 함수 insertNode(LinkedList_H * L, char * data); 를 추가하고 이를 테스트 할 수 있도록 main 함수를 수정하시오.
예제 5-2 실습하기 단순연결 리스트를 이용하여 다항식을 표현하고 계산한다. 단순연결 리스트를 이용하여 다항식을 표현하고 계산한다. 단순연결리스트를 구현한 소스파일과 헤더파일을 따로 작성한다. 구현한 함수 목록 createLinkedList_H : 단순연결리스트 생성 freeLinkedList : 단순연결 리스트가 사용하는 메모리 반 환 addLastNode : 마지막 노드에 노드 추가 addPoly : 두 다항식을 더한다. printPoly : 다항식을 출력한다.
소스 목록 및 내용 polylist.h : 다항식을 표현할 연결리스트 구현에 필요한 자료형과 함수의 원형을 선언하는 헤더 파 일 polylist.c : 연결리스트 구현에 필요한 함수의 내 용을 작성한 소스 ex0502.c : 다항식을 테스트하는 main 소스 파일
실습하는 순서 Eclipse 를 실행한다. Workspace와 Perspective가 맞는지 확인 하고 맞지 않으면 수정한다. Workspace 는 D:\Lec_hwlee\Capp\y2014 이고 Perspective 는 C/C++ 이어야 한다. 프로젝트 생성 polylist.h 파일 작성 polylist.c 파일 작성 ex0502.c 작성 빌드 및 실행 결과 확인
소스들 사이의 연관 관계 polylist.h ex0502.c 연결리스트 구현에 필요한 구조체와 필요한 함수의 원형을 선언한다. 구현된 연결리스트를 테스트 해보는 main 소스 포함한다. 포함한다. 실제 함수를 호출하여 사용한다. polylist.c 연결리스트 구현에 필요한 함수의 내용을 작성한다.
필요한 구조체 노드 구초체 다항식의 계수와 지수를 저장할 것이므로 자료필드는 두 개의 정수 변수를 사용한다. 링크 필드는 다음 노드의 주소를 저장하는 노드 구조체 포인터 변수를 사용한다. − 𝑥 5 +3 𝑥 2 +2
필요한 구조체 노드 헤드 구조체 노드의 시작 구조체의 주소를 저장할 노드 구조체 포인터 변수를 멤버로 가지는 구조체이다.
필요한 함수 리턴 타입 함수명 매개변수 기능 PolyNode_H * createLinkedList_H void 새로운 단순 연결 리스트를 생성한다 freeLinkedList 해당하는 연결리스를 메모리에서 삭제한다. addLastNode PolyNode_H *, int , int 주어진 문자열을 데이터로 갖는 노드를 마지막에 추가한다. addPoly PolyNode_H *, PolyNode_H *, PolyNode_H * 두 다항식을 더한다. printPoly 다항식을 출력한다.
함수 가상 코드 createLinkedList_H() L ← allocate memory for PolyNode_H; return L; End createLinkedList_H
함수 가상 코드 freeLinkedList(PolyNode_H *L) while (L.head ≠ NULL) do { p ← L.head; L.head ← L.head.link; free(p); p ← NULL; } End freeLinkedList
함수 가상 코드 addLastNode(PolyNode_H *L, int c, int e) node ← allocate memory for PolyNode; node.coef ← c; node.expo ← e; if (L.head = NULL) then { L.head ← node; return; } p ← L.head; while (p.link ≠ NULL) do { p ← p.link; p.link ← node; End addLastNode
함수 가상 코드 addPoly(PolyNode_H *p1h, PolyNode_H *p2h, PolyNode_H *p3h) p1 ← p1h.head; p2 ← p2h.head; while( p1 ≠ NULL && p2 ≠ NULL) do { if (p1.expo = p2.expo) then { sum ← p1.coeff + p2.coeff; addLastNode(p3, sum, p1->expo); p1 ← p1.link; p2 ← p2.link; } else if (p1.expo > p2.expo ) then { addLastNode(p3, p1.coeff, p1.expo); p1 ← p1.link; else { addLastNode(p3, p2.coeff, p2.expo); p2 ← p2.link; while (p1 ≠ NULL) do { while (p2 ≠ NULL) do { p2← p2.link; End addLastNode
함수 가상 코드 printPoly(PolyNode_H *L) p ← L.head; while (p ≠ NULL) do { write p.coef, p.expo; p ← p.link; } End printPoly
main 소스 코드 연결 리스트를 만들고 구현한 함수들이 정상 동작 하는지를 테스트하는 코드를 작성한다.
main 의 가상 코드 p1 ← createLinkedList(); p2 ← createLinkedList(); p3 ← createLinkedList(); addLastNode(p1, 4, 3); addLastNode(p1, 3, 2); addLastNode(p1, 5, 1); write message printPoly(p1);
main 의 가상 코드 addLastNode(p2, 3, 4); addLastNode(p2, 1, 3); addLastNode(p2, 2, 1); addLastNode(p2, 1, 0); write message printPoly(p2); addPoly(p1, p2, p3); printList(p3); free(L);
Eclipse 실행 D:\Lec_hwl\CApp\y2014
Eclipse 실행
Workspace 확인 D:\Lec_hwl\CApp\y2014
CDT Perspective 확인 이 버튼을 클릭해서 수정 Java EE 로 되어 있음
CDT Perspective 확인 C/C++ 선택
CDT Perspective 확인 C/C++ 로 되어 있음
새 프로젝트 생성 File->New->C Project 반드시 C Project를 택할 것
프로젝트 명 설정 Ch05Ex02 Empty Project Cygwin GCC D:\Lec_hwl\capp\y2014\Ch05Ex02
프로젝트 구성 설정 Debug 버전과 Release 버전 모두 사용
생성된 빈 프로젝트
linkedlist.h 추가 및 작성 Header File 선택
linkedlist.h 추가 및 작성 polylist.h 헤더 파일 명 설정
polylist.h 추가 및 작성 자동 생성된 빈 헤더 파일 헤더가 여러 소스에서 포함되었을 때 이중으로 포함되지 않도록 하는 매크로 실제 헤더의 내용이 들어갈 위치
polylist.h 추가 및 작성 구조체 및 함수 원형 선언
polylist.c 추가 및 작성 Source File 선택
polylist.c 추가 및 작성 polylist.c 소스 파일명 설정
polylist.c 추가 및 작성 자동 생성된 빈 소스 파일
polylist.c 추가 및 작성 필요한 코드 작성(빈 함수 작성) 표준 입출력 함수 헤더 메모리 할당 함수 헤더 연결리스트 관련 구조체 및 함수 헤더 필요한 각 함수의 원형에 맞게 함수의 몸체를 작성하되, 내용은 모두 빈 것으로 작성한다. 차후에 한 함수씩 코드의 내용을 작성한다.
createLinkedList_H()
freeLinkedList()
addLastNode()
addPoly() 연결된 한 파일
printPoly()
ex0502.c 추가 및 작성 Source File 선택
ex0501.c 추가 및 작성 ex0502.c 소스 파일명 설정
추가된 빈 소스 파일 프로젝트에 3 개의 파일 ex0502.c, polylist.c, polylist.h 가 추가된 것을 확인할 수 있다.
main 함수 작성 표준 입출력 함수 헤더 빈 main 함수 작성 메모리 해제 함수 헤더 연결리스트 관련 구조체 및 함수 헤더
main 함수 작성
main 함수 작성
빌드 및 실행 결과
도전 문제 두 다항식을 곱하는 함수 multiPoly(PolyNode_H *p1h, PolyNode_H *p2h, PolyNode_H *p3h) 를 구현하고 결과를 테스트 하는 프로그램을 작성하 시오. 사용자가 다항식의 계수와 차수를 입력하도록 하 고 받아들인 다항식을 출력하는 프로그램을 작성 하시오.