2016-04-17 2 views
0

Wenn ich einen Knoten in C++ erstelle, muss ich den Operator new verwenden, um sicherzustellen, dass Speicher zugewiesen werden kann.Wann muss ich den neuen Operator bei der Deklaration von Knoten in C++ verwenden?

Zum Beispiel verwendet diese Funktion new nicht bei der Deklaration des Knotenzeigers NewNode, der das Ende einer vorhandenen verketteten Liste zum Hinzufügen eines Knotens am Ende der Liste verwendet, verwendet jedoch new beim tatsächlichen Hinzufügen der Knoten bis zum Ende der Liste. Liegt dies daran, dass der Knotenzeiger als nicht dynamische Speicherzuweisung verwendet wird, die auf anderen Speicher verweist, der bereits dynamisch zugewiesen wurde, oder aus einem anderen Grund? Wäre es inkorrekt, dass Syntax oder Logik das Neue (Notch) vor der NewNode-Deklaration verwenden?

typedef Node* NodePtr; /*a type definition for NodePtr for ease of use in `the larger program this function is a part of*/` 

void AddNode(char NewChar, NodePtr List) 
{ 
    NodePtr NewNode = List; //make NewNode point to List 

    while (NewNode->Link != NULL)  //find end of linked list 
     NewNode = NewNode->Link; 

    NewNode->Link = new (nothrow) Node; //create a new Node at the end of the list 

    if (NewNode->Link == NULL) //make sure Node was created 
     return; 

    NewNode = NewNode->Link; //make NewNode point to the Node just created 
    NewNode->Ch = NewChar; //fill Ch part of NewNode 
    NewNode->Link = NULL;  //make sure the list ends with NULL 
} 
void TestAddNode(NodePtr List) 
{ 
    char NewChar; 

    cout << "\n\n---------------- Testing AddNode -------------------\n\n"; 

    cout << "Character to be added? "; 
    NewChar = cin.get(); 
    cin.ignore(); 

    if (NewChar == '\n') // User pressed just enter key. 
    { 
     cout << "Aborting AddNode..."; 
     return; 
    } 

    cout << NewChar; 
    cout << " -- Adding \'" << NewChar << "\'"; 

    AddNode(NewChar, List); 

    cout << "\n\nThe new list: "; 
    ShowList(List); //show list is another function that outputs the list 
} 
+1

Es ist generell keine gute Idee, 'typedef' einen rohen Zeigertyp einzugeben. Es wird prägnanter und präziser mit der Notation '*' oder einer 'Ptr_'-Vorlage bezeichnet. Mit dem 'typedef 'muss man nach einer Definition des Namens suchen. –

+1

'NewNode' wird irreführend benannt. Es ist weder ein neuer Knoten noch ein Zeiger auf einen neuen Knoten. Ein besserer Name wäre nur "p", was nicht mehr bedeutet als dass es ein Zeiger ist. –

+1

ein besserer Name wäre ListIter – Pemdas

Antwort

2

Sie new nur verwenden würden, wenn neue Speicher dynamisch-Zuweisung für einen neuen Knoten zu speichern. In Ihrem Fall zeigt NewNode nur auf den vorhandenen Speicher, auf den List zeigt, also ist dies nicht der richtige Ort für die Verwendung des new Operators.

Verwandte Themen