2013-04-22 3 views
0

요소 후 내가 튜토리얼에서 배운 요소 전에 내가 다음과 같은 기능을 사용하고 일부 데이터를 추가하기 위해 연결리스트를 작성하는 동안 :링크 C의 add_before의 목록과 add_after 기능

struct node *addafter(struct node *start,int data,int item) 
{ 
    struct node *tmp,*p; 
    p=start; 
    while(p!=NULL) 
    { 
     if(p->info==item) 
     { 
      tmp=(struct node *)malloc(sizeof(struct node)); 
      tmp->info=data; 
      tmp->link=p->link; 
      p->link=tmp; 
      return start; 
     } 
     p=p->link; 
    } 
    printf("Item Not Found:\n"); 
    return start; 
} 
struct node *addbefore(struct node *start,int data,int item) 
{ 
    struct node *tmp,*p; 
    if(item==start->info) 
    { 
     tmp=(struct node *)malloc(sizeof(struct node)); 
     tmp->link=start->link; 
     tmp->info=data; 
     start->link=tmp; 
     return start; 
    } 
    p=start; 
    while(p->link!=NULL) 
    { 
     while(p->link->info==item) 
     { 
      tmp=(struct node *)malloc(sizeof(struct node)); 
      tmp->info=data; 
      tmp->link=p->link; 
      p->link=tmp; 
      return start; 
     } 
     p=p->link; 
    } 
     printf("Item Not Found:\n"); 
    return start; 
} 

내 의심의 여지가 addafter 함수에있는 이유는 정지 조건이 p! = NULL이고 addbefore 함수의 경우 p-> link! = NULL입니까? 하나만 설명해주세요!

+1

자신이 어떻게 작동하는지 그래프로 그려 보면 이해에 도움이 될 것입니다. 간단한 설명 : while 루프 'addafter'는'p-> info'에 액세스하므로'p' 유효성 검사를 확인하십시오. 'addbefore'의'while' 루프는'p-> link'에 접근 할 것이므로'p-> link' 검증을 체크하십시오. – MYMNeo

+1

'while (p-> link-> info == item)'잘못된 것입니다. 그 블록의 끝에서 컨트롤이 반환되기 때문에 ('return start;')'while'이 아닌'if'가되어야합니다. – suspectus

답변

2

노드를 단일 링크 목록에 추가하려면 노드를 추가 한 후 노드에 대한 포인터가 있어야합니다.

그래서 세 번째 노드 뒤에 노드를 추가하려면 세 번째 노드에 대한 포인터가 필요합니다. 그리고 세 번째 노드 전에 노드를 추가하려면 두 번째 노드에 대한 포인터가 필요합니다.

그래서 전후에 필요한 포인터가 다릅니다. 따라서 후행의 경우 현재 포인터 (귀하의 경우에는 p)가 항목이 일치하는 노드를 가리켜 야합니다. 반면에 이전의 경우 현재 포인터는 항목이 일치하기 전에 노드를 가리켜 야합니다.

또한 addbefore 케이스는 while(p!=NULL)으로 다시 쓸 수 있습니다.이 포인터는 이전 포인터를 유지 관리합니다.

struct node *addbefore(struct node *start,int data,int item) 
{ 
    struct node *tmp,*p,*prv; 
    if(item==start->info) 
    { 
     tmp=(struct node *)malloc(sizeof(struct node)); 
     tmp->link=start->link; 
     tmp->info=data; 
     start->link=tmp; 
     return start; 
    } 
    p = start->link; 
    prv = start; 

    while(p != NULL) 
    { 
     if(p->info==item) 
     { 
      tmp=(struct node *)malloc(sizeof(struct node)); 
      tmp->info=data; 
      tmp->link=p; 
      prv->link=tmp; 
      return start; 
     } 
     prv = p; 
     p=p->link; 

    } 
     printf("Item Not Found:\n"); 
    return start; 
} 

어느 쪽이든 이전 코드를 작성하는 것이 좋습니다.