Итак, у меня есть эта простая структура данных, и я хочу вывести из нее все символы, но я не могу назначить n для n.next. Я немного программировал на java, и такие вещи работали. Что не так с этим кодом?

#include <iostream>
using namespace std;

struct node{
    char c;
    struct node *next;
    struct node *prev;
};

typedef struct node NODE;

void printnode(NODE n){
    while(n.next){
        cout << n.c;
        n=n.next;
    }
}
0
zbyshekh 5 Май 2014 в 02:32

4 ответа

Лучший ответ

Попробуй это:

void printnode(NODE* n){
  while(n->next){
    cout << n->c;
    n=n->next;
  }
}

Он использует указатель для доступа к NODE.

В своей версии вы пытаетесь назначить указатель на тип, не являющийся указателем:

void printnode(NODE n){    
  ...
  n = n.next; // error: n.next is of type NODE*, but n is a non-pointer NODE
3
Philipp Claßen 4 Май 2014 в 22:40

n - это NODE, которое равно struct node, но n.next равно struct node *, поэтому вы не можете назначить n.next на n.

Чтобы заставить его работать, вы можете изменить свой аргумент функции на:

void printnode(NODE *n) {
    while (n->next != NULL) {
        cout << n->c;
        n = n->next;
    }
}

Обратите внимание, что мы используем оператор -> для доступа к членам структуры, на которую указывает указатель.

5
rullof 4 Май 2014 в 22:40

Использование данных, на которые указывает указатель (для разыменования указателя)

node* p;

Вы должны ввести:

p->next;

Это правильная версия вашего кода:

void printnode( NODE *n) {
    while ( n->next != NULL) {
        cout << n->c;
        n = n->next;
    }
}
2
4pie0 4 Май 2014 в 22:54

Ваш фрагмент кода больше похож на C, чем на C ++. Вот как вы можете скомпилировать свой код:

#include <iostream>
using namespace std;

struct node{
    char c;
    struct node *next;
    struct node *prev;
};

typedef struct node NODE;

void printnode(NODE* n){
    while(n->next){
        cout << n->c;
        n=n->next;
    }
}

... и вот то, что вам действительно нужно, и которое делает то же самое с оптимальной эффективностью и правильностью.

#include <iostream>
#include <forward_list>

using namespace std;

using mylist_t = std::forward_list<char>;

void printList(const mylist_t& list){
    for(const auto& c : list) {
        cout << c;
    }
}
0
Richard Hodges 4 Май 2014 в 22:46