2012-11-12 4 views
0

내 목표는 동적 배열이있는 파일의 텍스트를 읽고 "numline"인수가있는 행을 원하는대로 마지막으로 인쇄합니다. 나는이 작업을 위해 순환으로 연결된 링크 된 목록을 사용해야한다. 함수를 실행할 때 첫 줄 X numline 만 얻습니다. 나는 혼란 스럽다. 노드 파티션을 추가하거나 트래버스 및 프린트 아웃 (printout) 파티션을 추가 할 때 잘못했다.순환 링크 된 목록에 노드를 추가하려면 어떻게합니까?

편집 : 나는

void last(char* numline,char* fileptr) 
{ 

    struct node *start,*newnode,*lastnode; 
    struct node *ptr=start; 
    char *linebuffer; 
    int maxlinelen=512; 
    int i=0; 
    int j; 

    FILE *fp; 
    linebuffer=(char*)malloc(maxlinelen * sizeof(char*)); 
    if(linebuffer==NULL) 
    { 
     fprintf(stderr,"Command: last:Memory allocating failed for linebuffer\n"); 
     exit(1); 
    } 


     if((fp=fopen(fileptr,"r"))!=NULL) 
    { 
     start=NULL; 

     while((fgets(linebuffer,maxlinelen,fp))!=NULL) 
     { 
      while(strlen(linebuffer)==maxlinelen-1) 
     { 
      maxlinelen*=2; 
      linebuffer=realloc(linebuffer,maxlinelen * sizeof(char)); 
      if(linebuffer==NULL) 
      { 
       fprintf(stderr,"Command: last: Memory reallocating failed for linebuffer\n"); 
       exit(1); 
      } 
      fgets(linebuffer+(maxlinelen/2-1),(maxlinelen/2)+1,fp); 
     } 

      if(start==NULL) 
     { 
      newnode=(struct node *)malloc(sizeof(struct node)); 

       strcpy(newnode->data,linebuffer); 
       printf("linebuffer newnoda kopyalandi\n"); 

       start=newnode; 
      newnode->next=newnode; 
      // start=newnode; 
      i++; 
      printf("ikinciburda"); 
     } 
      else{ 
     newnode=(struct node *)malloc(sizeof(struct node)); 
     strcpy(newnode->data,linebuffer); 
     lastnode=start; 
     while(lastnode->next!=start) 
      { 
      lastnode=lastnode->next; 
      } 
     lastnode->next=newnode; 
     newnode->next=start; 
     i++; 
      } 
     } 
     printf("toplam line sayisi :%d\n",i); 
     ptr=start;       //<----- i added this line 
     for(j=i-(atoi(numline));j<i;j++) 
     { 
      ptr=ptr->next; 
     } 
     while(ptr!=start) 
     { 
      printf("%s\n",ptr->data); 
      ptr=ptr->next; 
     } 
     fclose(fp); 
    } 
} 

답변

2

이 라인

while(start->next!=start) 
    { 
     printf("%s\n",start->data); 
     /// especially this one 
     start=start->next; 
    } 

이 의심스러운 ... 파일을 편집했다.

첫 번째 반복에서 start->nextstart으로 지정하면 바로 루프에서 벗어납니다 (분명히 start == start->next이므로).

당신이해야 할 모든이하는 struct node* ptr을 만들 그것을 시작을 할당 한 다음 ptr = ptr->next "totallines"만드는 것입니다 - "numline"시간 : 물론

struct node* ptr = start; 

for(j = atoi(numline) ; j < i ; j++) { ptr = ptr->next; } 

while(ptr != start) 
{ 
    printf("%s\n", ptr->data); 
    ptr = ptr->next; 
} 

을, 당신은 numline <= totaline에 확인해야합니다 - 내가 ' 간결함을 위해이 수 표를 생략했습니다.

중요 편집 :

for(j = i - atoi(numline) ; j < i ; j++) 
    { 
     // debug statement 
     printf("skip %s\n", ptr->data); 
     ptr = ptr->next; 
    } 

를 삽입 한 후 나는 연결리스트가 잘못 구성되어 있는지 나타났습니다 - 위의 반복은 첫 번째 라인을 제공합니다.

EDIT2 (일부 노트) :

귀하의 오류 처리 코드가 좋은과 코드가 매우 긴되고이 문제를 찾을 너무 쉬운 일이 아닙니다 의해 불확정 선 길이에 대한 동적 버퍼도 좋다. 나는 많은 사람들이이 답변을 다뤘다 고 생각한다. 왜냐하면 많은 것들이 쓰여졌 고 그 대부분은 연결된 목록에 아무런 의미가 없다. 은 코드에 정의되어 있지 않다.이다. 내 생각 엔이

struct node 
{ 
    struct node* next; 
    char data[SomeBigNumber]; 
}; 

EDIT3입니다 : "추가 lastnode을"부분적으로 목록 건설

코드도 까다 롭습니다, lastnode/newnode와 혼란은 명확히해야한다.

는 그리고 오류가 여기에 있습니다 :

 /// once again, here lastnode->next IS start, as you want it to be 
     lastnode->next=start; 
     /// and this condition is always false (see the previous line) 
     while(lastnode->next!=start) 
     { 
      lastnode=lastnode->next; 
     } 

당신은 라인 //lastnode = start;을 댓글을 달았지만, 루프가 마지막 요소에 도달하기 전에 바로해야합니다. 마지막 요소마다 노드가 과잉이다 삽입을 찾고 물론,

else { //add additional nodes 
     newnode=(struct node *)malloc(sizeof(struct node)); 
     strcpy(newnode->data,linebuffer); 

     lastnode=start; 
     while(lastnode->next!=start) { lastnode=lastnode->next; } 

     lastnode->next=newnode; 
     newnode->next=start; 
     i++; 
    } 

그리고 :

// add additional nodes

이 있어야합니다. lastnode은 항상 마지막 요소 (또는 목록이 처음 비어있는 경우 NULL)를 항상 가리켜 야합니다.

+0

+1.OP보다 더 읽기 쉬운 코드가 원형 목록의 "첫 번째"항목을 찾기위한 초기 for-loop입니까? 그냥 궁금해서,''ptr = start-> next;로 시작한다고 생각 하겠지만, start가 null이 아니라면 모든 항목을 명확하게 일주 할 것입니다. – WhozCraig

+0

@viktor latypov 내 코드를 편집했습니다. 하지만 메신저 seg지고. 결점. 인스턴트 메신저 정말 순환 링크 된 목록을 혼동. 나는 이미 2를 편집했다. – ccc

+0

@WhozCraig 플래그 출력물을 얻었지만 (j ...) loop seg fault에 도달했을 때 당신의 조언을 들었다. – ccc

관련 문제