1 | 31 | (1장 링크드 리스트 예제 오탈자) 장 링크드 리스트 예제 오탈자
p31, p39, P42에서
SLL_DestoryNode -> SLL_DestroyNode
| 2010-02-09 | 1 |
1 | 40 | (1장 40 페이지 48번 줄 코드 오류) 40 페이지 48번 줄
void SLL_InsertNewHead(Node** Head, Node* NewHead) { if( Head == NULL) // --> (*Head) == NULL 이 되어야 함. (*Head) = NewHead; else { NewHead->NextNode = (*Head); (*Head) = NewNode; } } | 2010-02-09 | 1 |
1 | 43 | (43페이지 2번째줄 실행 결과 부터) 실행결과가 아래와 같이 정정되어야 합니다. 아래 [실행결과]가 맞는 값입니다.
List[0]: -2 List[1]: -1 List[2]: 0 List[3]: 1 List[4]: 2 List[5]: 3 List[6]: 4
Inserting 3000 After [2]...
List[0] : -2 List[1] : -1 List[2] : 0 List[3] : 3000 List[4] : 1 List[5] : 2 List[6] : 3 List[7] : 4 | 2009-10-04 | 1 |
1 | 44 | (44p 비타민 퀴즈 오류) 1. 다음 문장 삭제 요. 본문 예제에 사용된 SLL_InsertNewHead() 함수가 이미 있기 때문임.
"아쉽게도, 헤드 앞에 새로운 헤드를 삽입하고 싶어도 이 함수로는 할 수가 없습니다."
2. SLL_DestroyAllNodes() 함수 원형 오류. 다음과 같이 변경되어야 함.
SLL_InsertBefore(Node** Head, Node* Current, Node* NewNode)
| 2010-02-09 | 1 |
1 | 49 | (49page) void DLL_InsertAfter(Node* Current, Node* NewNode) { NewNode->NextNode = Current->NextNode; NewNode->PrevNode = Current;
if(Current -> NextNode != NULL) { Current->NextNode->PrevNode = NewNode; Current->NextNode = NewNode; } // else // Current->NextNode = NewNode; }
->
void DLL_InsertAfter(Node* Current, Node* NewNode) { NewNode->NextNode = Current->NextNode; NewNode->PrevNode = Current;
if(Current -> NextNode != NULL) { Current->NextNode->PrevNode = NewNode; } Current->NextNode = NewNode; }
| 2010-03-04 | 1 |
2 | 80 | (80P) 80쪽 아래 그림에서
우측에 상자 네 개가 있습니다.
"klm" "def" "ghi" "abc"
이 순서를 아래처럼 변경합니다.
"abc" "def" "ghi" "klm"
| 2010-01-14 | 1 |
2 | 95 | (p 95 3번 동그라미.) 기 처리되어 있는 오탈자임.
-> 검사 작업이 끝난 후에는 토큰을 스택에 삽입한다. | 2011-02-01 | 2 |
2 | 95 | (95) 다익스트라 후위 표기식 변환 알고리즘의 절차 설명 중 (3)번 과정이 다음과 같이 보완되어야 합니다.
-------------------------------------------------------
(3) 토큰이 연산자(괄호 포함)일 때, 이 토큰이 스택의 최상위 노드에 저장되어 있는 연산자보다 우선순위가 높으면(왼쪽 괄호는 우선순위가 가장 낮지만 예외적으로 항상 스택에 삽입해야 합니다.) 스택에 삽입하고, 그렇지 않다면 결과에 출력한다. | 2010-09-05 | 2 |
2 | 97 | (5쇄 p96~p97 3군데) Node* Popped = LLS_Pop (&Stack);
수정 Node* Popped = LLS_Pop (Stack);
| 2013-03-24 | 5 |
2 | 102 | (102) 192행의 gcvt와 198행의 atof 의 설명이 바뀌어야 합니다.
<맞는 표기>
192행 주석 : 소수로 되어 있는 계산 결과를 문자열로 반환 198행 주석 : 문자열로 되어 있는 계산 결과를 소수로 반환 | 2010-09-05 | 2 |
2 | 103 | (103페이지) 2장/Calculator/Test_Calculator.h
->
2장/Calculator/Test_Calculator.c
| 2011-04-10 | 2 |
3 | 115 | (4쇄발행, p115) 다음과 같이 수정
22 void CQ_Enqueue( CircularQueue* Queue, ElementType Data) 23 { 24 int Position=0; 25 26 if(Queue->Rear==Queue->Capacity) 27 { 28 Position=Queue->Rear; 29 Queue->Rear=0; 30 } 31 else 32 Position=Queue->Rear++; 33 34 Queue->Nodes[Position].Data=Data; 36 }
| 2012-09-13 | 5 |
3 | 115 | (5쇄 115p~116p) 다음과 같이 수정
22 void CQ_Enqueue( CircularQueue* Queue, ElementType Data) 23 { 24 int Position=0; 25 26 if(Queue->Rear==Queue->Capacity) 27 { 28 Position=Queue->Rear; 29 Queue->Rear=0; 30 } 31 else 32 Position=Queue->Rear++; 33 34 Queue->Nodes[Position].Data=Data; 36 }
| 2013-03-24 | 5 |
3 | 115 | (115p) /* 115p및 Circular Queue 예제 프로그램의 CQ_Enqueue() 함수는 다음과 같이 변경되어야 합니다. */
void CQ_Enqueue( CircularQueue* Queue, ElementType Data) { int Position=0;
if(Queue->Rear==Queue->Capacity) { Position=Queue->Rear; Queue->Rear=0; } else Position=Queue->Rear++;
Queue->Nodes[Position].Data=Data; }
| 2010-07-15 | 2 |
3 | 119 | (4쇄발생 119p) 다음과 같이 수정
22 void CQ_Enqueue( CircularQueue* Queue, ElementType Data) 23 { 24 int Position=0; 25 26 if(Queue->Rear==Queue->Capacity) 27 { 28 Position=Queue->Rear; 29 Queue->Rear=0; 30 } 31 else 32 Position=Queue->Rear++; 33 34 Queue->Nodes[Position].Data=Data; 36 }
| 2012-09-13 | 5 |
3 | 119 | (5쇄 119p) 다음과 같이 수정
22 void CQ_Enqueue( CircularQueue* Queue, ElementType Data) 23 { 24 int Position=0; 25 26 if(Queue->Rear==Queue->Capacity) 27 { 28 Position=Queue->Rear; 29 Queue->Rear=0; 30 } 31 else 32 Position=Queue->Rear++; 33 34 Queue->Nodes[Position].Data=Data; 36 }
| 2013-03-24 | 5 |
3 | 120 | (p.120 Test_CirCularQueue.c) 기 반영되어 있음. | 2011-11-15 | 3 |
3 | 121 | (121p) Circular Queue 예제 프로그램의 결과는 다음과 같이 수정되어야 합니다.
Dequeue: 1, Front:0, Rear:4 Dequeue: 2, Front:1, Rear:4 Dequeue: 3, Front:2, Rear:4 Capacity: 10, Size: 10
Dequeue: 4, Front:3, Rear:2 Dequeue: 100, Front:4, Rear:2 Dequeue: 101, Front:5, Rear:2 Dequeue: 102, Front:6, Rear:2 Dequeue: 103, Front:7, Rear:2 Dequeue: 104, Front:8, Rear:2 Dequeue: 105, Front:9, Rear:2 Dequeue: 106, Front:10, Rear:2 Dequeue: 107, Front:0, Rear:2 Dequeue: 108, Front:1, Rear:2 | 2010-07-09 | 2 |
3 | 125 | (P125) 소스코드 024 라인
Node* LQ_CreateNode(char* Data);
->
Node* LQ_CreateNode(char* NewData); | 2010-07-15 | 3 |
4 | 137 | (137) 페이지 중간에 중첩된 괄호 표기 예제 그림에 오타가 있습니다. C와 D는 형제 노드인데, D가 C의 자식 노드인 것처럼 표기가 되었습니다.
* 변경전 (A(B(C(D(E)(F)))(G(H))(I(J(K))))
* 변경 후 (A(B(C)(D(E)(F)))(G(H))(I(J(K))))
| 2010-09-05 | 2 |
4 | 143 | (143P) 143P 트리 출력하기의 소스코드에서, 세 번째 줄을 정정합니다.
nt i=0;
->
int i=0;
아래처럼 말이죠....
void LCRS_PrintTree(LCRSNode* Node, int Depth) { int i=0; 으로 바껴야 될것 같습니다. | 2010-01-14 | 1 |
4 | 145 | (p.145) 오류 아님. 독자의 Left Child, Right Sibling 구조체로 트리를 표현하는 방법에 대한 학습 부족. | 2012-07-23 | 4 |
4 | 147 | (147 쪽 비타민 퀴즈) 이 예제 프로그램에서 특정 레빌의 모든 로드를 출력하는 함수 LCRS_PrintNodesAtLevel(int Level)를 작성하세요.
->
이 예제 프로그램에서 특정 레빌의 모든 로드를 출력하는 함수 LCRS_PrintNodesAtLevel(LCRSNode* Root, int Level)를 작성하세요. | 2010-07-16 | 3 |
4 | 157 | (p157 > ET_DestroyTree(ETNode* Root) 함수) ET_DestroyTree(ETNode* Root) { if(Node==NULL) return;
->
ET_DestroyTree(ETNode* Root) { if(Root==NULL) return;
| 2010-07-19 | 3 |
4 | 166 | (p166, p170) 1) 166쪽 소스코드에서
void ET_BuildExpressionTree(char* PostfixExpression, ETNode**Node) { ETNode* NewNode=NULL;
->
void ET_BuildExpressionTree(char* PostfixExpression, ETNode**Node) {
세 번째 줄인 ETNode* NewNode=NULL; 을 삭제합니다.
2) 170쪽 소스코드에서 065 라인의 ETNode* NewNode=NULL; 을 삭제합니다.
| 2010-07-20 | 3 |
5 | 207 | (207) 207페이지의 예제 프로그램 소스 코드 중 10번~34번줄의 소스 코드가 다음과 같이 변경되어야 합니다.
int Partition( int DataSet[], int Left, int Right ) { int First = Left; int Pivot = DataSet[First];
++Left;
while( Left <= Right ) { while( DataSet[Left] <= Pivot && Left < Right ) ++Left;
while( DataSet[Right] >= Pivot && Left <= Right ) --Right;
if ( Left < Right ) Swap( &DataSet[Left], &DataSet[Right]); else break; }
Swap( &DataSet[First], &DataSet[Right] );
return Right; } | 2010-09-05 | 2 |
5 | 212 | (212p 드무므로) 드무므로 -> 드물므로
| 2010-02-09 | 1 |
6 | 223 | (p. 223) Seqeuntial -> Sequential (eu -> ue) | 2012-07-24 | 5 |
6 | 240 | ((4쇄발행) 240p 코드부분, 246p 코드부분의 037라인) 기 수정 완료. | 2012-09-13 | 5 |
6 | 240 | (p.240, p. 246, SearchTree.c, 32~43 라인,) 기 반영되어 있음. | 2011-11-19 | 3 |
6 | 244 | (244p) 244p의 예제 코드 중 가운데 부분에서 다음 코드를 다음과 같이 고쳐야 합니다.
------------- 변경 전 ---------------- /* 최소값 노드를 찾아 제거한 뒤 현재의 노드에 위치시킨다. */ BSTNode* MinNode = BST_SearchMinNode( Tree->Right ); MinNode = BST_RemoveNode( Tree, NULL, MinNode->Data ); Tree->Data = MinNode->Data;
------------- 변경 후 ---------------- /* 최소값 노드를 찾아 제거한 뒤 현재의 노드에 위치시킨다. */ BSTNode* MinNode = BST_SearchMinNode( Tree->Right ); Removed = BST_RemoveNode( Tree, NULL, MinNode->Data ); Tree->Data = MinNode->Data; | 2010-09-05 | 2 |
6 | 262 | (262) 레드 블랙 트리에 대한 설명 및 그림을 다음 링크의 내용과 같이 변경되어야 합니다. 아래 링크를 참고하세요.
http://www.hanb.co.kr/brain/board/view.html?id=algorithm&ma_id=14505&pg | 2010-09-05 | 1 |
6 | 263 | (4판(4쇄 발행), 263페이지 위에서 2번째 줄) 해당 문구 삭제 필요. | 2012-09-13 | 5 |
8 | 321 | (321p,322p) 기수정되어 있음. | 2011-11-04 | 3 |
8 | 328 | (328쪽 소스코드 아래 부분) if ( TheList->Next == NULL ) break; else TheList = TheList->Next; }
-> if ( TheList->Next == NULL ) return NULL; else TheList = TheList->Next; }
| 2015-02-24 | 7 |
8 | 331 | (331) 331쪽의 Chaining.c 코드, "006" 라인
HT->Table = (List*)malloc(sizeof(Node) * TableSize);
다음과 같이 변경합니다.
HT->Table = (List*)malloc(sizeof(List) * TableSize); | 2010-09-05 | 2 |
8 | 333 | (333쪽 소스코드 079 라인) 079 break;
->
079 return NULL;
| 2015-02-24 | 7 |
8 | 344 | (344쪽 11라인) 11 enum ElementStatus ;
->
11 enum ElementStatus | 2015-02-24 | 7 |
8 | 345 | (4쇄 발행, 345p 041 Line, 044 Line) 다음과 같이 수정
041 (*HT)->Table[Address].Key = (char*)malloc( sizeof(char) * (KeyLen + 1) ); 042 strcpy( (*HT)->Table[Address].Key, Key ); 043 044 (*HT)->Table[Address].Value = (char*)malloc( sizeof(char) * (strlen(Value) + 1) ); | 2012-09-20 | 5 |
9 | 360 | (p360) 360p 최상단의 의 방향성 그래프 인접 행렬 그림 수정 | 2013-11-26 | 5 |
9 | 382 | (4쇄 발생 382p 첫번째 그림) 정점 B와 모든 진출 간선 제거 | 2012-09-24 | 5 |
9 | 390 | (67라인 ~ 71라인) 67 /* 그래프 소멸 */ 68 DestroyGraph( graph ); 69 70 return 0; 71 }
->
67 /* 그래프 소멸 */ 68 DestroyGraph( graph ); 69 70 /* 44페이지 비타민 퀴즈를 푼 경우 아래의 코드 사용 가능 */ 71 /* SLL_DestroyAllNodes(&SortedList); */ 72 73 return 0; 74 } | 2015-02-24 | 7 |
9 | 395 | (4쇄 발행, 395p 첫번째 그림) 395 페이지 첫 번째 그림에서 C-F 간선을 굵은 회색에서 가는 검은색 실선으로 변경 | 2012-09-24 | 6 |
9 | 400 | (P400 중간 부분 AddEdge() 함수 호출 부분) P400 중간 부분 AddEdge() 함수 호출 부분 오탈자 내용 AddEdge(MSTVertices[ToIndex], CreateEdge(MSTVertices[ToIndex], STVertices[FromIndex], Weights[i]));
->
AddEdge(MSTVertices[ToIndex], CreateEdge(MSTVertices[ToIndex], MSTVertices[FromIndex], Weights[i])); 로 변경되어야 함.
| 2010-02-09 | 1 |
9 | 410 | (p410, 9장/MinimumSpanningTree/Test_MST.h) p410, 9장/MinimumSpanningTree/Test_MST.h
-> 9장/MinimumSpanningTree/Test_MST.c 로 변경되어야 함.
| 2010-02-09 | 1 |
10 | 437 | (4쇄 437p 코드 16라인, 첨부 예제코드 모두) HashText = ReHash(Text, i, PatternSize , HashText, Coefficient); | 2012-09-28 | 5 |
10 | 439 | (4쇄 발행 439p 실행결과 1번째줄) righteousness | 2012-09-28 | 5 |
10 | 440 | (4쇄 발행 440p 밑부분표의 1행) BAABABAAA -> BAABABAA | 2012-09-28 | 5 |
10 | 444 | (p444 중간 부분) 이동 거리 = 일치 접두부의 길이 + 최대 경계 너비
->
이동 거리 = 일치 접두부의 길이 - 최대 경계 너비
| 2014-06-11 | 7 |
10 | 444 | (3쇄 - 444p 테이블) 기 수정되어 있음. | 2011-05-10 | 3 |
10 | 455 | (455쪽 두 번째 테이블 아래) 455쪽 두 번째 테이블 아래 문단부터 ~ 456쪽 <보이어-무어 알고리즘의 구현> 전까지. 아래 텍스트로 변경합니다.
----------------------------------------------------------------------------------------------------- 이제 두 번째 경우를 다룰 차례가 됐습니다. 두 번째 경우는 가장 넓은 경계의 시작 위치가 곧 이동 거리가 됩니다. 첫 번째 경우에 대한 이동 거리는 이미 처리를 했으므로 이제 우리는 테이블 내에서 이동 거리가 0인 항목에 대해서만 처리를 하면 됩니다.
가장 넓은 경계의 시작 위치를 이동 거리로 입력할 때의 규칙은 다음과 같습니다. (1) 첫 “접미부의 가장 넓은 경계의 시작 위치”를 이동 거리로 입력한다(위 예제에서는 5). (2) 경계의 너비보다 접미부가 짧아지기 전까지 나타나는 모든 경계는 동일한 이동 거리를 입력한다. (3) 경계의 너비보다 접미부가 짧아지면 “접미부의 시작 위치 - 1”에 있는 “접미부의 가장 넓은 경계의 시작 위치”를 이동 거리로 입력한다.
자, 패턴을 왼쪽부터 읽으면서 각 경계의 이동 거리를 입력해보겠습니다. 먼저 첫 접미부의 가장 넓은 경계의 시작 위치가 5이므로 A(테이블[0])의 이동 거리를 5로 입력합니다. 이 이동 거리는 경계의 길이가 5가 되기 전까지 계속 사용합니다. AA(테이블[1]), AAB(테이블[2]), AABAB(테이블[4]) 모두 5를 입력합니다.
접미부의 시작 위치 0 1 2 3 4 5 6 문자열 A A B A B A 접미부의 가장 넓은 경계의 시작 위치 5 3 4 5 6 6 7 이동 거리 5 5 5 2 5 4 1
테이블[6] 이후에는 이동 거리가 6으로 변경됩니다. 접미부의 가장 넓은 경계의 시작 위치[5]가 6이기 때문입니다. 하지만 이 예제 테이블에는 이동 거리가 0으로 남아있는 곳이 없으므로 이것으로 처리가 완료되었습니다. -----------------------------------------------------------------------------------------------------
보이어-무어 알고리즘의 구현 | 2015-02-24 | 7 |
12 | 505 | (제3쇄 12장 pp. 505) 기 수정되어 있는 내용임. | 2011-05-16 | 3 |
13 | 526 | (4쇄발행 526p 그림) 그림에 굵은선으로 사각형 표시 된 부분이 있는데 3,4,5의 왼쪽위(↖)로 가도록 되어있는 칸에 굵은 사각형 표시 | 2012-10-10 | 5 |
14 | 538 | (p. 538) 버그 아님. 독자의 예제 실행 오류로 판단됨. | 2012-08-13 | 5 |
14 | 547 | (P 547 그래프 그림 오탈자) 547 페이지 아래쪽 그림 G 노드의 비용이 364에서 346으로 바뀌어야 함. | 2010-02-09 | 1 |
15 | 580 | (6쇄 15장 백트레킹 MazeSolver.c (580~582 p)) 20 Start.X = i; → Start.X = j; 21 Start.Y = j; → Start.Y = i; 40 Maze->Data[Start.X][Start.Y] = START; → Maze->Data[Start.Y][Start.X] = START; 53 if ( Maze->Data[Current->X][Current->Y] == GOAL ) → if ( Maze->Data[Current.Y][Current.X] == GOAL) 56 Maze->Data[Current->X][Current->Y] = MARKED; → Maze->Data[Current->Y][Current->X] = MARKED; 67 Maze->Data[Current->X][Current->Y] = WAY; → Maze->Data[Current->Y][Current->X] = WAY; 106 if ( Maze->Data[Next->X][Next->Y] == WALL ) return FAIL; → if ( Maze->Data[Next->Y][Next->X] == WALL) return FAIL; 107 if ( Maze->Data[Next->X][Next->Y] == MARKED ) return FAIL; → if ( Maze->Data[Next->Y][Next->X] == MARKED ) return FAIL;
| 2013-12-02 | 6 |
|