2017-09-09 6 views
0
typedef struct node{ 
int data; 
struct node *link; 
}nd; 

nd *head=NULL , *ahead=NULL; 

void create_node(int item) { 
    nd *new, *temp; 
    new = (nd*)malloc(sizeof(nd)); 
    new->data=item; 
    new->link=NULL; 
    if(head==NULL) { 
     head=new; 
    } 
    else { 
     temp=head; 
     while(temp->link!=NULL) { 
      temp=temp->link; 
     } 
     temp->link=new; 
    } 

} 

void alpha_check(int size) { 
    int i,j,num; 
    nd *ti , *tj; 
    ti=tj=head; 
    for(i=1 ; i<=size ; i++) { 
     for(j=1 ; j<=size ; j++) { 
      num = ((ti->data)*10)+(tj->data); 
      tj=tj->link; 

      /*if(num>=65 && num<=90) { 
        printf("\n->%d",num); 
       }*/ 
     } 
    //ti=ti->link; 
    } 
} 

void traverse(nd *thead) { 
    while(thead->link!=NULL) { 
     printf("%d ",thead->data); 
     thead=thead->link; 
    } 
    printf("%d ",thead->data); 
} 

그래서 위의 코드의 유일한 문제는 기능 alpha_check 난 다음 노드 변수 TJ 포인트를 원하는()에있다. 다음 노드를 가리키는 대신 분할 결함 (코어 덤프 됨). tj가 다음 노드를 가리킬 수없는 이유를 설명하십시오.링크 목록 세그먼트 오류

+0

(I = 1; i가 크기 = <; 내가 ++) (, J <= 크기, J = J ++ 1) 미국 {{ . 문제가된다. thread-> link! = NULL이 될 때까지 트래버스 할 플래그를 추가 할 필요가있다. –

+0

리스트의 생성 방법이나'alpha_check '의 호출 방법을 알 수 없다. 이 '크기'가 틀린 것 같습니다. 또한 end-of-list 때까지 while 루프가 아닌 크기를 사용하여리스트를 트래버스하는 것은 이상하다. 디버거를 사용하십시오. 그것은 무엇이 잘못되었는지 그리고 그것이 어디서 일어 났는지를 알려줍니다. –

+0

함수 alpha_check에 전달할 크기는 무엇입니까? – Ganeshdip

답변

1

세그먼트 결함은 커널이 프로그램을 종료하게하는 권한이없는 메모리에 프로그램이 액세스한다는 신호입니다. 이는 대개 배열의 범위를 초과하고 있거나 포인터가 가리켜서는 안되는 것을 가리키는 포인터를 역 참조하는 경우를 의미합니다. 주석에 언급 된 다른 것과 마찬가지로 배열을 탐색 할 때와는 다른 링크 된 목록을 가로 지르는 동안 다른 유형의 제약이 필요합니다. for 루프에서 고정 된 크기를 수행하는 대신 노드 포인터가 NULL이 아닌지 확인하는 동안 트래버스해야합니다.

alpha_check 절차를 변경하고이를 테스트하기 위해 메인을 추가했습니다. 그것은 예상대로 작동합니다. 위한

#include <stdio.h> 
#include <stdlib.h> 

typedef struct node { 
    int data; 
    struct node* link; 
} nd; 

nd *head=NULL , *ahead=NULL; 

void create_node(int item) { 
    nd* new,* temp; 
    new = (nd*)malloc(sizeof(nd)); 
    new->data = item; 
    new->link = NULL; 

    printf("%d %p\n", new->data, new); 

    if(head == NULL) { 
     head = new; 
    } 
    else { 
     temp = head; 
     while(temp->link) 
      temp = temp->link; 
     temp->link = new; 

    } 
} 

void alpha_check(int size) { 
    int i,j,num; 
    nd* ti ,* tj; 
    ti = tj = head; 

    for(i = 1 ; i <= size ; i++) { 
     while(tj) { 
      num = ti->data * 10 + tj->data; 
      tj = tj->link; 

     //if(num>=65 && num<=90) 
     //{ 
      printf("\n->%d",num); 
      printf(" %p\n", tj); 
     //} 
    } 
    //ti=ti->link; 
    } 
} 

void traverse(nd* thead) { 
    while(thead->link) { 
     printf("%d ", thead->data); 
     thead = thead->link; 
    } 
    printf("%d ", thead->data); 
} 

int main(void) { 
    create_node(10); 
    create_node(1); 
    create_node(5); 

    alpha_check(2); 
    return 0; 
} 
+0

머리글 포인터가 포함 된 구조체와 목록의 크기를 추적하는 변수를 만들면 크기가있는 for 루프를 사용할 수 있습니다. 'struct 목록 { size_t 크기; nd * head; } while 루프 대신 for 루프를 사용하여 포인터가 null이 아닌지 확인하십시오. for (tj = head; tj; tj = tj-> link)' –

+0

도와 주셔서 감사합니다. 그것은 작동합니다. –