Есть пара вещей, которые, я думаю, в основном умаляют производительность вашей программы. В вашей функции printList
у вас есть строка cout << n->firstName->middleI->lastName->phoneNum << endl;
, и я предполагаю, что вы намереваетесь напечатать всю информацию для пользователя. Однако здесь происходит то, что программа берет указатель n
, пытается найти свойство firstName
объекта, на который указывает объект, затем принимает это свойство и пытается найти свойство middleI
этого свойства, затем свойство lastName
, свойство и т. д. c. Эти поля, конечно, не существуют, поэтому ваша программа, скорее всего, будет иметь sh. Скорее, я думаю, что использование что-то вроде cout << n->firstName << " " << n->middleI << " " << n->lastName << " " << n->phoneNum << endl;
будет работать лучше.
Кроме того, в вашей функции readData
ваше время, пока l oop будет продолжать обновлять единственный узел p
вместо создания новых узлов. поэтому (при условии, что ваш входной файл правильно отформатирован и все такое джазовое) ваш головной узел, который передается в эту функцию при вызове main()
, будет равен только последнему контакту в вашем файле и вашему список будет иметь длину 1.
Кстати, я вижу, что у вас есть только Node
класс. Если вы хотите работать со списками, вам, вероятно, следует создать второй класс (например, LinkedList
), который принимает еще один уровень абстракции. Ваш класс Node
затем будет обрабатывать установку / отчетность по своим данным и отвечать на то, какой узел следует за ним, а ваш класс LinkedList
будет следить за списком (помня, где находится голова), добавляя / удаляя из list и поиск указанных c узлов в списке.
Некоторые другие соображения:
- Переменные, содержащиеся в классе, почти всегда должны быть private вместо публикации c. Причина инкапсуляции информации, в первую очередь, помимо ее организации, заключается в том, чтобы другие части программы, не имеющие отношения к изменению этой части вашего кода, не могли ее коснуться, и вы теряете эту защиту, когда вы все публикуете. c.
- Функции, которые вы используете для создания / добавления узлов, списков печати и т. Д. c., Должны быть методами (т. Е. Функциями определенного класса). Скажем, у меня есть некоторый класс
Foo
, который имеет функцию, которая действует на него с именем bar
. Чтобы реализовать это, я мог бы написать что-то вроде:
class Foo {
private:
//Foo's variables
public:
void bar() {
//bar's implementation
}
}
Вы сможете использовать метод bar()
в другом месте, потому что он помечен public
, и bar()
будет нести ответственность за обработку любых необходимых манипуляций с информацией Foo
.
Использование
using namespace std;
считается плохой практикой, поскольку иногда это может привести к неоднозначным вызовам функций, а добавление
std::
является более явным. См.
здесь для получения дополнительной информации. Использование ключевого слова
NULL
очень C -стиль, тогда как
nullptr
считается более правильным (и даже более безопасным) в C ++. Если вам любопытно,
этот , кажется, дает довольно подробное объяснение этого изменения. Использование
while(!fin.eof())
также считается неправильным, поскольку
!fin.eof()
вернет только true
после вы закончили чтение входного файла. Таким образом, вы попытаетесь прочитать файл за концом, и это довольно опасно. См.
здесь для получения дополнительной информации.
Немного долго, но я надеюсь, что это немного прояснит вам! Не стесняйтесь комментировать, если у вас есть какие-либо вопросы.