2013-08-06 5 views
0

이제 연결된 목록이 이전 질문에서 업데이트되지 않은 이유를 알았습니다. x의 좌표를 반복해야한다는 것이 밝혀졌지만,이 질문은 중요하지 않습니다.링크드 목록에 요소를 삽입하십시오.

링크 된 목록에 요소를 삽입 할 때 값을 삽입 할 위치 앞에있는 요소가 사라집니다. 예를 들어 나는 "HELO"인쇄 할 요소가 나는, 출력은 "것이다 (공간)여보세요 여기 내 삽입 코드와 구조 전자 이후 또 다른 'L'을 삽입 할 :.

struct node { 
struct node *previous; 
int c; 
int x; 
int y; 
struct node *next; 
}*head; 

void checker(int ch, int xpos, int ypos) 
{ 
    int flag=0; 
    struct node *temp,*temp1,*var,*insert_node; 
    var=(struct node *)malloc(sizeof(struct node)); 
    temp=(struct node *)malloc(sizeof(struct node)); 
    insert_node=(struct node*)malloc(sizeof(struct node)); 
    temp=head; 
    while(temp!=NULL) 
    { 
     if(temp->x==xpos && temp->y==ypos) 
     { 
      insert_node->c=ch; 
      insert_node->x=xpos; 
      insert_node->y=ypos; 
      insert_node->next=NULL; 
      temp1=temp; 
       while(temp1!=NULL) 
       { 
        if(temp1->y==ypos) 
        temp1->x++; 
        temp1=temp1->next; 
       } 
       var->next=insert_node; 
       insert_node->next=temp; 
       head=var; 

      flag=1; 
      break; 
     } 
      var=temp; 
      temp=temp->next; 
    } 
    if(flag==0) 
     characters(ch,xpos,ypos); 
} 

이 VAR 내부 대신이 단 하나의 요소가 보인다, 그것은 forgranted 헬기에서 "H"를 취

+0

temp 또는 var에 malloc을해서는 안됩니다. malloc을 temp에 겹쳐 쓰면 머리를 할당 할 수 있습니다. – Jiminion

답변

1

당신은 최대 원래 머리에서 목록을 던져 당신이 일치하는 것을 가리 키도록 x와 y는 head = var을 할당하면 목록에 나타납니다. 앉아서 두 사진을 그려 자신이 틀렸다는 것을 확신시킵니다.

목록에 일치하는 노드 앞에 새 노드를 삽입하려면 : 목록의 현재 노드와 이전에 방문한 노드를 추적하십시오. 당신이 current_node 앞에 새 노드를 삽입 할 준비가되면 다음을 수행하십시오

코드에서
insert_node->next = current_node; 
if (previous_node == NULL) 
    head = insert_node; 
else 
    previous_node->next = insert_node; 

tempcurrent_node의 역할 (당신이 검사하는 일)를한다. 이전 노드에 대한 포인터가 없으므로이를 선언하십시오. current_node를 head, previous_node를 NULL로 설정 한 다음 목록 실행을 시작하고 목록에서 노드 앞에 insert_node을 넣으려는 경우 위 코드를 사용하십시오. 목록의 맨 앞에 삽입 할 때 특별한 경우를 주목하십시오. current_node 뒤에 새 노드를 삽입하려는 경우 어떻게해야하는지 알아 내려고 연습으로 남깁니다.

+0

이것은 훌륭하게 작동하지만, 왜 아직도 작동하는지 혼란 스럽습니다. 나는 이것에 대한 자체 연구를하고있어서 몇 가지 사항을 놓쳤을 수도있다. 내가 마지막 노드에 대한 포인터 만 가지고 있더라도 이전 노드의 값을 여전히 가지고 있는지 묻고 싶습니다. 여기에서 이해하는 것과 같이 previous_node는 노드를 삽입하기 전에 마지막 요소를 가리 킵니다. 그래서 이전 노드를 인쇄한다면, 노드를 삽입하기 전에 모든 값을 가질 수 있습니까? (혼란 스러울 경우 미안해) 고마워. – buzzcarla

+0

포인터는 매우 혼란 스럽지만 계속 사용하면 "아하!" 순간. 귀하의 질문에, 목록 자체는 머리를 제외한 목록의 모든 노드에 대한 포인터를 포함합니다. 헤드 포인터가이를 해결합니다. 목록에서 작업 할 때는 작업중인 노드 (current_node)와 current_node (previous_node) 바로 앞의 노드를 가리 키는 것이 좋습니다. Current_node는 하나의 노드를 가리키고, previous_node는 루프를 둘러싼 마지막 시간 (첫 번째 반복 동안은 NULL)이었던 current_node를 가리키고 있습니다. 따라서이 포인터를 가진 노드는 최대 2 개만 있습니다. – Fred

+0

목록에서 current_node 앞에 insert_node가 있으면 insert_node-> next가 current_node를 가리 키도록 설정해야합니다. 목록의 어느 부분도 insert_node를 가리 키지 않기 때문에 Insert_node는 여전히 목록에 없습니다. insert_node를리스트의 일부로 만들려면 previous_node-> next를 current_node에서 insert_node로 변경해야합니다 (head가 current_node를 가리킨 다음 head를 insert_node로 변경해야한다는 것을 제외하고). 루프를 다시 작성하여 목록에 * current_node 뒤에 insert_node *를 배치하면 포인터에 대해 알아볼 수 있습니다. – Fred

0
 var->next=insert_node; 
     insert_node->next=temp; 

은 다음과 같아야합니다.

 insert_node->next=temp->next; 
     temp->next=insert_node; 
관련 문제