2012-12-12 3 views
0

안녕하세요 저는 파스칼을 배우고 일부 함수를 테스트하고 있습니다.
이렇게 재귀 삽입 절차를 만들었습니다. 노드가있는 경우 두 키를 비교하고 그렇지 않은 경우 새 노드를위한 공간을 만드십시오.포인터를 사용하여 while 루프로 파스칼을 변경하는 방법

procedure INSERT (KEY : integer; var NODE : NODEPTR); 
begin 
    if NODE = Nil then 
    begin 
     New (NODE); 
     NODE^.KEY := KEY; 
     NODE^.LEFT := Nil; 
     NODE^.RIGHT := Nil 
    end 
    else    
     if KEY < NODE^.KEY then 
      INSERT (KEY, NODE^.LEFT) 
     else 
      INSERT (KEY, NODE^.RIGHT) 
end; 

그리고 재귀 함수를 while 루프로 변경하려고합니다. 이렇게 절차를 만들었습니다.
노드가 있으면 노드가 루프 할 때까지 노드가 비어 있습니다. 및 루프가 위에있을 때, 첫 번째 노드가 루트 때 루프가 사실이지만, 새로운 노드

procedure INSERT (KEY : integer; var NODE : NODEPTR); 
begin 
    while NODE <> nil do 
    begin 
     if KEY < NODE^.KEY then 
      NODE:=NODE^.LEFT 
     else 
      NODE:=NODE^.RIGHT 
    end; 

    New (NODE); 
    NODE^.KEY := KEY; 
    NODE^.LEFT := Nil; 
    NODE^.RIGHT := Nil 

end; 

을하고이 코드 를 실행하지만,이 후, 동안 false로 루프를 변경하고 새 노드를 한 후에.

 if KEY < NODE^.KEY then 
      NODE:=NODE^.LEFT 
     else 
      NODE:=NODE^.RIGHT 

결국 노드 연결이없고이 프로그램은 새 노드를 계속 만듭니다.
내가 놓친 것이 있습니까? 또는 두 번째 코드에 대해 즉흥적으로 작업 할 수 있습니까? 미리 감사드립니다.

답변

1

놓친 것은 노드를 연결하지 않는다는 것입니다 (현재 설정에서는 실제로 노드를 연결할 수 없습니다). 레코드의 필드에 노드의 왼쪽 및 오른쪽 노드에 대한 필드가 있지만 할당하지는 마십시오. 결국 노드들을 연결하지 않고 노드를 생성하게됩니다. 링크가없는 링크드리스트가 있습니다.

한순간에 NODE^.RIGHT := NEWNODE (또는 물론 NODE^.LEFT := NEWNODE) 줄이 필요합니다.

당신의 방법을 따라 뭔가가 필요합니다은 (내 파스칼은 약간 녹슨, 그래서 구문 오류에주의)) :

procedure INSERT(key: Integer; var NODE: NODEPTR) 
    begin 
     NODEPTR root := NODE; 
     if (key < root^.KEY) then begin 
      while (root^.LEFT <> nil) do begin 
       root := root^.LEFT; 
      end; 
      new(NODE); 
      NODE^.KEY := key; 
      root^.LEFT := NODE; 
      node^.RIGHT := root; 
     end else begin 
      while (root^.Right <> nil) do begin 
       root^ := root^.RIGHT; 
      end; 
      new(NODE); 
      NODE^.KEY := key; 
      root^.RIGHT := NODE; 
      NODE^.LEFT := root; 
     end; 
    end; 

위의 예에서 만들어 질 개선 및 beautifications 많이있다 , 그러나 나는 그것이 일반적인 생각을 보인다라고 생각한다.

관련 문제