C언어 자료구조 연결리스트(3) LinkedList

저번시간에 이어서

이번시간은 

1)어떤 노드 뒤에 새로운 노드 삽입하기
2)첫번째 노드의 삭제
3)어떤 노드의 다음 노드 삭제하기
4)연결리스트 순회란 그리고 목적




1)어떤 노드 뒤에 새로운 노드 삽입하기

순서를 명확히 지켜서 노드를 삽입하자.
그렇지않으면 노드의 next를 잃어버려서 연결이 끊어지게 된다

//새로운 노드 생성  
Node *tmp = (Node *)malloc(sizeof(Node));
tmp->data = data_to_store;
tmp->next = prev->next;
prev->next = tmp; 


/*연결리스트에 새로운 노드를 삽입할때 삽입할 위치의 바로 앞 노드의
주소가 필요하다. 즉 어떤 노드의 뒤에 삽입하는 것은 간단하지만, 
반대로 어떤 노드의 앞에 삽입하는 것은 간단하지 않다.
그러므로 최대한 그런 경우가 안발생하도록 만드는것이 현명한 선택이다.*/
int add_after(Node *prev, char *item)
{
if(prev ==NULL)
return 0;
Node *tmp = (Node *)malloc(sizeof(Node));
tmp->data = item;
tmp->next = prev->next;
prev->next = tmp;
return1;
 } 


2)첫번째 노드의 삭제



:head가 현재 head노드의 다음노드를 가리키게 만든다면 
자연스럽게 첫번째 노드와는 링크가 끊어지고 첫번째 노드는 삭제하면 된다.

//연결리스트의 첫번째 노드를 삭제하고 ,그 노드의 주소를 반환한다.

head = head->next;

//head 전역변수일때 가정하고  
 Node * remove_first() {
  if(head == NULL){ //예외처리  
  return NULL;
  }
  else {
  Node *tmp = head;
  head = head->next; //한칸 전진하면서 이전 헤드 삭제하는 코드  . 
  return tmp;
}
 } 
 //동적 할당받은거기 때문에  삭제해도 메모리에 여전히 남아 있게된다 
 //그래서 free함수로 가비지제거를 하자.  

3)어떤 노드의 다음 노드 삭제하기





어떤 노드를 삭제할려면 
삭제할 노드의 앞노드의 Next 필드를 
변경 한다는 의미이다. 그러므로  삭제 노드의 이전 Next필드가 중요하다
!삭제할 노드의 주소만으로는 삭제할 수 없다.


if(prev->next != NULL)
  prev->next = prev->next->next;



 Node *remove_after (Node *prev) {
  Node *tmp = prev->next; //바로 앞노드의 주소를 tmp에 저장한 
  if(tmp == NULL) {
  return NULL;
}
  else {  //tmp가 다음 next주소를 가지고 있고 prev에 저장한다 
  prev->next = tmp->next;  
                  return tmp;
}
 }
/*
연결리스트 순회한다는 의미는 처음부터 순서대로 체크하는것을 순회(traverse)
한다고 말한다. 순회의 목적은 함수는 입력된 문자열 word와 동일한 단어를 저장한 노드를 찾아서 그 노드의 주소를 반환한다.  

*/
 Node *find(char *word) {
Node *p = head;
while(p != NULL) { //NULL이 아닐때 까지 체크한다. 
if(strcmp(p->data, word) ==0)  //비교한다
return p;                   //그 노드의 주소를 리턴한다. 
p = p->next;                     //다음 노드를 넘어간다. 
}
return NULL;
}




0 comments:

Post a Comment