2017-01-27 4 views
0

Was ich gefragt wurde: Q) Ein Satz besteht aus einer Liste von Zeichen, die durch einen Punkt beendet werden. Schreiben Sie eine Funktion, die eine verkettete Liste von Zeichen zurückgibt, in denen die Zeichen vom Benutzer eingegeben und zur Liste hinzugefügt werden. Die zurückgegebene Liste sollte den Punkt enthalten. Es soll genannt werden, wie:C++ Funktion, die eine verkettete Liste zurückgibt

LinkedList<char> *sentence; 
sentence = setUpSentence(); 

habe ich versucht, Stücke zu schreiben, aber ich bin zu kämpfen, da dies mein erstes Mal mit verknüpften Listen & Funktionen wie diese arbeitet.

Hauptdatei

#include "LinkedList.h" 
    #include "ListNode.h" 
    #include "Node.h" 
    #include <iostream> 
    #include <stdlib.h> 
    using namespace std; 

    LinkedList<char> *setUpSentence() { 
     //allocate the linked list objet 
     LinkedList<char> *sentence = new LinkedList<char>(); 
     char ch; 
     do { 
      cout << "Enter characters to add, enter full stop to finish adding." << endl; 
      ch = cin.get(); 
      sentence->addAtEnd(ch); 
     } while (ch != '.'); 

     return sentence; 
    } 

    int main() { 

     //call the function, store the returned pointer in sentence variable 
     LinkedList<char> *sentence = setUpSentence(); 
     //working with the linked list 
     sentence = setUpSentence(); 



     cout << sentence->getAtFront() << endl; 

//delete to avoid memory leak 
     delete sentence; 
    } 

Der Fehler, den ich immer bin, wenn versucht wird diesen Versuch am Anfang zu laufen diese Funktion zu schreiben ist:

nach 1 Zeichen in die Konsole eingeben und die Eingabetaste drücken, die Schleife läuft weiter und gibt "Zeichen eingeben zum Hinzufügen ...." aus, aber dies erscheint jedes Mal zweimal nach Eingabe eines Zeichens?

Irgendwelche Ideen?

-Code von Funktionen aus der LinkedList.h-Datei, die in meinem Haupt verwendet:

template <typename T> 
void LinkedList<T>::addAtEnd(T item) 
{ 
    if (size == 0) 
     addAtFront(item); 
    else 
    { 
     // ListNode<T>* temp = findAt(size - 1); 
     ListNode<T> *l = new ListNode<T>(item, last, nullptr); 
     last->next = l; 
     last = l; 
     size++; 
    } 
} 

template <typename T> 
T LinkedList<T>::getAtFront() 
{ 
    if (size > 0) 
    { 
     current = first; 
     return first->item; 
    } 
    else return NULL; 
} 

edit: addAtFront Methode von LinkedList.h

template <typename T> 
void LinkedList<T>::addAtFront(T item) 
{ 
    ListNode<T> *l = new ListNode<T>(item, NULL, first); 
    first = l; 
    if (last == NULL) 
     last = l; 
    size = 1; 
} 
+0

Dieser rekursive Aufruf sollte offensichtlich fragwürdig sein, vor allem wenn man bedenkt, dass das Ergebnis völlig ungenutzt ist. Zweitens haben Sie nicht den relevanten Code * all * zur Verfügung gestellt, so dass wir raten müssen, dass 'addAtFront' korrekt implementiert wurde. – WhozCraig

+0

@whozCraig mein Code aktualisiert mit Alex Petrenkos Vorschläge & addAtFront-Methode enthalten. – Liam

+0

Sie können 'sentence' nicht löschen und dann' cout' später in 'sentence'. – drescherjm

Antwort

2

Ich weiß nicht, warum Datei Sie versuchen, einen rekursiven Aufruf an setUpSentence() in der Return-Anweisung zu machen, macht dies keinen Sinn. Ich denke, es sollte stattdessen so aussehen:

LinkedList<char> * setUpSentence() { 
    // make sure to allocate the linked list object 
    LinkedList<char> *sentence = new LinkedList<char>(); 
    char ch; 
    do { 
     cout << "Enter characters to add, enter full stop to finish adding." << endl; 
     ch = cin.get(); 
     sentence->addAtEnd(ch); 
    } while (ch != '.'); 

    return sentence; 
} 

int main() { 
    // calling the function, store the returned pointer in sentence variable 
    LinkedList *sentence = setUpSentence(); 

    // ... working with the linked list ... 

    delete sentence; // don't forget to delete it to avoid memory leak! 
} 
Verwandte Themen