#c #data-structures
#c #структуры данных
Вопрос:
Я читал следующий код из руководства, когда застрял со следующим кодом:
#include <iostream>
#include <string>
using namespace std;
struct Node {
int roll;
string name;
Node *next;
};
void append (Node *front, Node *newnode) {
Node *n = front;
if (n==NULL) return;
while (n->next != NULL) n = n->next;
n->next=newnode;
}
int main (int argc, char *argv[]) {
int choice;
int roll;
string s;
Node *front = NULL;
Node *n;
while (true) {
cout << "choice? (0:create and append, 1:find 2:exit)" << endl;
cin >> choice;
switch (choice) {
case 0: cout << "roll?"; cin >> roll;
cout <<"name?"; cin >> s;
n = new Node();
n->roll=roll; n->name=s;
n->next=NULL;
if(front==NULL) front = n;
else append (front, n);
break;
case 1: cout << "roll?"; cin >> roll;
n=front;
if (n==NULL) break;
while ((n->next != NULL)amp;amp;(n->roll!=roll)) n = n->next;
if (n->roll==roll) cout << n->name << endl;
else cout << "not foundn";
break;
case 2: return 0;
default: cout << "unrecognized choicen";
}
}
}
Я не понимаю, как они создают разные записи, используя одну и ту же структуру «node».
Также что new node()
делает?
также может кто-нибудь, пожалуйста, объяснить, как работает функция append? Как он добавляет новые записи в конце??
Комментарии:
1. Подумал о чтении книги по C , с таким языком, как этот, это очень рекомендуется
2. Знакомы ли вы вообще с указателями? Если нет, я рекомендую ознакомиться с этим, поскольку вы, вероятно, не поймете никаких объяснений без этого.
3. Я прочитал книгу — cohoon Davidson, но в большинстве книг не говорится о структурах в мельчайших подробностях, особенно указателях…
4. @Разочарованный: в любой ХОРОШЕЙ книге по C будет рассказано об указателях, иначе ее не стоит читать!
5. Хорошо, кажется, другие уже объяснили. В качестве дополнительного замечания я бы посоветовал не использовать однострочные
if
иwhile
блоки (особенно без скобок), поскольку это затрудняет читаемость кода и может привести к путанице.
Ответ №1:
В C структура — это то же самое, что и класс, за исключением «общедоступного» доступа по умолчанию. Разница в основном связана с предпочтениями разработки; большинство разработчиков рассматривают класс как объект с методами, членами и наследованием, тогда как структура просто связывает вместе несколько элементов.
Этот код создает новые записи путем создания новых «узлов». Вист использует одну и ту же структуру для каждого узла, он связывает каждый из них со следующим в списке (через указатель «next» — он указывает на следующий узел в памяти).
Что касается new node()
раздела, это просто выделяет память (и еще несколько вещей, но я предполагаю, что, поскольку вы новичок в C , вам не нужны скучные подробности!
Возможно, вам нужен учебник? Попробуйте это!
Ответ №2:
Это связанный список. Каждый объект node (new создает новый экземпляр узла struct, который затем является объектом типа Node). Передний узел устанавливается первым, если не был установлен ранее. Обычно это называется заголовком связанного списка. После этого каждому новому значению «roll» будет присвоен новый экземпляр и добавлено к списку.
Ответ №3:
Простое объяснение:
void append (Node *front, Node *newnode) {
Node *n = front; // assign front to a tempory Node pointer called n
if (n==NULL) return; // if n == NULL (points to nothing) then get out of here.
while (n->next != NULL) n = n->next; // loop through all node's starting from n, until n->next is NULL (points to nothing)
n->next=newnode; // assign newnode to last n->next which is the end of the node tree
}