2014-12-03 2 views
0

C++에서 단독으로 링크 된 목록을 만들려고합니다. 나는 "DiseaseList"구조를 기반으로 항목을 생성하고 목록에 해당 항목을 추가 한 다음 인쇄하는 3 가지 기능으로이 작업을 수행하고 있습니다.링크드리스트의 머리 부분이 목록의 마지막 항목으로 계속됩니다.

저는이 코드를 말 그대로 몇 시간 빗어 봤는데이 목록의 머리를 마지막 항목에 배치하는 것을 막을 수 없습니다. 머리가 바뀔 수있는 지점은 2 개뿐입니다 (머리 = *). 그러나 나는 그것을 이해할 수 없기 때문에 내가 쓰고있는 것의 오해 일뿐입니다.

예를 들어 두 개의 새로운 요소 인 "1"& "2"를 추가합니다. 루프에서 영원히 "2"를 출력합니다. 컴파일러는 보이지 않았다 나의 고통 :(

#include <iostream> 
using namespace std; 

typedef struct DiseaseList 
{ 
    int a; 
    struct DiseaseList *Next; 

}DList; //Not sure if I needed DList here or should have just used DiseaseList 

DList* CreateElement(); 
void printList(DList*); 
DList* AddElement(DList*, DList*); 



int main(void) 
{ 
int choose; 
DList *Head = NULL, *NewElement; 
do { 

cout << "1. Add element" << endl; 
cout << "2. Print list" << endl; 
cout << "3. Exit" << endl; 
cin >> choose; 
switch (choose) 
{ 
    case 1: 
     NewElement = CreateElement(); 
     Head = AddElement(Head, NewElement); 
     break; 
    case 2: printList(Head); break; 
    case 3: return 0; 
} 
} while (1); 

} 

DList* CreateElement() //Creates a new item for the list 
{ 
    DList* temp; 

    cout << "New Number:"; 
    cin >> temp->a; 
    temp->Next = NULL; 
    return temp; 
} 

DList* AddElement(DList *Head, DList *NewElement) //Adds new item from CreateElement to the list 
{ 

if (Head == NULL) 
{ 
    NewElement->Next = NULL; 
    Head = NewElement; 

} 
else{ 

DList *temp = Head; 
while (temp->Next != NULL) 
{ 
    temp = temp->Next; 
} 
    temp->Next = NewElement; 

} 
return Head; 
} 

void printList(DList* Head) 
{ 
    while (Head != NULL) 
{ 
    cout << Head->a << endl; 
    Head = Head->Next; 
} 

} 
+1

괜찮은 디버거를 사용하여 한 줄씩 코드를 단계별로 실행할 때 실제로 어떤 비정상적인 현상이 발생 했습니까? 당신의 서명을 전달하는'Head'는 다음과 같이 보이면 안됩니다 :'DList * AddElement (DList * &, DList *);'? –

답변

2

CreateElement 실제로 요소를 작성하지 않습니다를 종료하십시오!

을이 그것을 반환 (및 사용) 초기화되지 않은 포인터를 의미, 나는 놀랐어요 .

DList* temp; 

과 : 경고

이 라인을 교체

DList* AddElement(DList *Head, DList *NewElement) { 

그것은 다음과 같습니다 당신이 AddElement()의 반환 값을 할당하지 않는 한 값으로 포인터를 전달하고 있기 때문에 @ TheDark의 대답 또한

DList* temp = new Dlist; 
+0

코드에있는 유일한 결함이 아닌가 걱정됩니다. –

+0

아마도. 잘하면 OP가 조언을하고 디버거를 시도합니다. –

+0

그래서 지금 막 동일한 항목을 새로운 항목으로 바꾸어 본적으로 1 개의 항목 목록을 만들었습니까? 그리고 CodeBlocks와 제공된 디버거를 -Wall 및 -g와 함께 사용하고 있습니다. 내가 뭘 더 찾고 있니? –

2

, 당신은 Head 매개 변수 main() 변경되지 않습니다 점에 유의해야한다 참조로 Head 포인터를 전달하는 것이 더 나은 것은 (또한 공백을 정리)이 제대로

void AddElement(DList*& Head, DList *NewElement) { 
        //^Note the & 
    // ... 
} 
+0

사실'Head'는'Head = AddElement (Head)에있는 함수의 반환 값이 할당되어 변경되었습니다 , NewElement); 그 말은, 나는 당신이 함수를 호출 할 때마다 반환 값을 할당하는 것을 기억할 필요가 없다는 것을 의미하는 참조 방법을 선호한다. –

+0

@TheDark THX, 나는 이것을 한 눈에 보지 못했습니다. 내 대답을 편집하여 내 우려 사항을 더 잘 지적했습니다. –

0

그냥 필요한 약간의 수정을 초기화 얻을 :

#include <iostream> 
using namespace std; 

typedef struct DList_ 
{ 
    int a; 
    struct DList_ *Next; 
}DList; 

DList* CreateElement(); 
void printList(DList*); 
DList* AddElement(DList*, DList*); 

int main(void) 
{ 
int choose; 
DList *Head = NULL, *NewElement; 
    do { 
     cout << "1. Add element" << endl; 
     cout << "2. Print list" << endl; 
     cout << "3. Exit" << endl; 
     cin >> choose; 
     switch (choose) 
     { 
     case 1: 
      NewElement = CreateElement(); 
      Head = AddElement(Head, NewElement); 
      break; 
     case 2: printList(Head); break; 
     case 3: return 0; 
     } 
    } while (1); 
    return 0; 
} 

DList* CreateElement() //Creates a new item for the list 
{ 
    DList* temp = new DList; 
    cout << "New Number:"; 
    cin >> temp->a; 
    temp->Next = NULL; 
    return temp; 
} 

DList* AddElement(DList *Head, DList *NewElement) //Adds new item from CreateElement to the list 
{ 
    if(Head == NULL) 
     return NewElement; 
    DList *temp = Head; 
    while (temp->Next != NULL) 
     temp = temp->Next; 
    temp->Next = NewElement; 
    return Head; 
} 

void printList(DList* Head) 
{ 
    while (Head != NULL) 
    { 
     cout << Head->a << endl; 
     Head = Head->Next; 
    } 
} 
관련 문제