2011-03-09 4 views
0

순환 연결 목록에 대해 작성한 코드에 다음은 link입니다. 아래 코드도 붙여 넣습니다.단일 연결 목록에서 순환 연결 목록으로의 변환

typedef struct node 
{ 
    int value; 
    struct node *next; 
}mynode; 

mynode *head, *tail, *temp,*sp,*fp; 

void add(int value); 
void iterative_reverse(); 
void print_list(); 
void findcycle(); 

int main() 
{ 
    head=(mynode *)0; 
    add(1); 
    add(2); 
    add(3); 
    //print_list(); 
    findcycle(); 
    return(0); 
} 

void add(int value) 
{ 
    temp = (mynode *) malloc(sizeof(struct node)); 
    temp->value=value; 
    temp->next=(mynode *)0; 
    if(head==(mynode *)0) 
    { 
     head=temp; 
     tail=temp; 
    } 
    else 
    { 
     tail->next=temp; 
     tail=temp; 
     tail->next=head; 
     temp->next=head; 
    } 
} 

void findcycle() 
{ 
    if (head == NULL || head->next == NULL) 
     printf("null"); 
    sp=head; 
    fp=head->next; 
    while (fp != NULL && fp->next != NULL) 
    { 
     if ((fp == sp) || (fp->next == sp)) 
       printf("Cycle"); 
     sp = sp->next; 
     fp = fp->next->next; 
    } 
    printf("Not a Cycle"); 
} 

void print_list() 
{ 
    for(temp=head; temp!=tail; temp=temp->next) 
     printf("[%d]->",(temp->value)); 
} 

필자는 처음에는 싱글 용으로 작성한 다음 몇 개의 포인터를 원형으로 변경했습니다. 나는 그것을 추적 할 수 없으므로 시간 초과를받을 수있는 실수를하고있다. 제발 제안 해주세요.

고마워요.

답변

1

이 잘못 같습니다

tail->next=temp; 
tail=temp; 
tail->next=head; 
temp->next=head; 

(당신이 목록의 마지막에 새로운 노드를 추가하고 여기 가정 것 같은, 그것은 원형리스트가되고 싶어요 경우) 그것은해야한다 :

tail->next=temp; 
temp->next=head; 
tail=temp; 

어쨌든 중복 할당입니다.

진짜로 심각한 문제

은 여기에 있습니다 : 모든

void findcycle() 
{ 
if (head == NULL || head->next == NULL) 
      printf("null"); 
sp=head; 
fp=head->next; 
while (fp != NULL && fp->next != NULL) 
{ 
     if ((fp == sp) || (fp->next == sp)) 
       printf("Cycle"); 
     sp = sp->next; 
     fp = fp->next->next; 
} 
printf("Not a Cycle"); 
} 

첫째, 당신이 달성하기 위해 노력하고있다? 명확하지 않으므로 수정 방법을 제안하는 것이 쉽지 않습니다. 어쨌든 가장 명백한 버그는 목록이 실제로 인 경우 순환 번호가 인 경우 종료 조건이 없으므로 루프가 계속 진행됩니다 (아무도 포인터가 NULL이되지 않음).

+0

나쁘다! 실수를 많이 .. 고마워. – Ava

+0

@vartika : 그러면 가장 좋은 대답을 upvote 및/또는 받아 들여야합니다. – Massimo

+0

두 답변 모두 똑같다고 제안했지만 예 자세한 설명이었습니다. 내가 어떻게 upvote합니까? – Ava

0

findcycle이주기를 찾으면 종료하지 않고 그냥 계속 진행합니다. (마찬가지로 0 또는 1 요소가있는 목록을 가져 오는 경우에도 마찬가지입니다.)이 코드가 유일한 오류라고 보장 할 수는 없지만 제대로 작동하지 않는 것으로 충분합니다.

+0

예. 알았습니다. 고마워. – Ava