양방향 체인 시계를 만드는 함정!!

다음은 양방향 체인 테이블을 만드는 함수입니다. 치명적인 오류를 알 수 있습니까?
 1 Node *create()
 2 {
 3     ElemType data;
 4     Node *head,*p,*s;
 5     head=(Node*)malloc(sizeof(Node));
 6     head->before=NULL;
 7     p=head;
 8     cout<<"input data,type 0 to stop input"<<endl;
 9     while(1)
10     {
11         cin>>data;
12         if(data==0)
13         {
14             p->next=NULL;
15             break;
16         }
17         s=(Node*)malloc(sizeof(Node));
18         s->data=data;
19         p->next=s;
20         s->before=p;
21         p=s;
22     }
23     head=head->next;
24     
25     return head;
26 }

 
답: 23줄에서 헤드헤드헤드헤드에 새로운 값이 부여된 후에 헤드->before는 원래의 헤드 결점을 가리키는데 원래의 헤드 결점은 데이터를 저장하지 않고 NULL과 같지 않기 때문에 아래에서 헤드->before를 사용하면 치명적인 오류가 발생하고 검사하기 어렵다.
 
지침의 기능은 매우 강하지만, 사용 시 매우 조심해야 한다!
수정된 코드
 1 Node *create()
 2 {
 3     ElemType data;
 4     Node *head,*p,*s;
 5     head=(Node*)malloc(sizeof(Node));
 6     p=head;
 7     cout<<"input data,type 0 to stop input"<<endl;
 8     while(1)
 9     {
10         cin>>data;
11         if(data==0)
12         {
13             p->next=NULL;
14             break;
15         }
16         s=(Node*)malloc(sizeof(Node));
17         s->data=data;
18         p->next=s;
19         s->before=p;
20         p=s;
21     }
22     head=head->next;
23     head->before=NULL;
24     return head;
25 }

 

좋은 웹페이지 즐겨찾기