Получение символов из связанного списка - PullRequest
1 голос
/ 10 марта 2012

C ++ вопрос здесь. Я успешно (после некоторых исследований: P) создал реализацию связанного списка для стека целых. У меня возникли проблемы с его изменением для char *, хотя ...

Я думаю, что это может быть просто проблема со ссылками / разыменованием указателей относительно функций, используемых классом linklistCommands, который я определил ниже. (У меня всегда были проблемы с пониманием, когда использовать & или * по отношению к аргументам и возвращаемым значениям.) Я прокомментировал строки в своем коде, которые, вероятно, запутались.

В любом случае, вот мой код:

struct linkc { // one 'link', stores a pointer to a char array
  char * value;
  linkc *next;
};

class linklistCommands 
{
  public:
    linklistCommands()
      {top = NULL;}
    ~linklistCommands() 
      {}
    void push(char * address) // Pretty sure I'm OK here.
      {
      linkc *temp = new linkc;
      temp->value = address;
      temp->next = top;
      top = temp;
      } 
    char* pop() // Pretty sure I have to change something on this line
      {
      if (top == NULL) 
        return 0;
      linkc * temp;
      temp = top;
      char * value;
      value = temp->value;
      top = temp->next;
      delete temp;
      return value;
      }
    bool isEmpty()
      {
      if (top == NULL) 
        return 1;
      return 0;
      }
  private:
    linkc *top; 
};

int main(void)
{

 // pushed strings are of an arbitrary, but always known, length
 char[4] stringA = "foo"; 
 char[6] stringB = "fooba"; 
 char[8] stringC = "foobar "; 

 linklistCommands commandList;

 commandList.push(stringA);    
 commandList.push(stringB);
 commandList.push(stringC);

 while(commandList.isEmpty!=1)
 {
  cout << (*commandList.pop()) << endl;
 }
}

Спасибо за чтение моего вопроса и / или любых разъяснений, которые вы можете предоставить:)

Ответы [ 3 ]

1 голос
/ 10 марта 2012

ваш класс выглядит нормально, но главное нужно изменить:

 // pushed strings are of an arbitrary, but always known, length
 char stringA[] = "foo";
 char stringB[] = "fooba";
 char stringC[] = "foobar ";

 linklistCommands commandList;

 commandList.push(stringA);
 commandList.push(stringB);
 commandList.push(stringC);

 while(commandList.isEmpty()!=1)
 {
  cout << commandList.pop() << endl;
 }

Вы должны рассмотреть использование std :: string вместо char *, это проще и безопаснее.Также char [N] stringA = "...";это синтаксис C # или Java, а не C ++

0 голосов
/ 10 марта 2012

Я отправляю из своей ячейки, так что короткий ответ: & для получения адреса текущего элемента и * для получения значения из адреса.Таким образом, используя * дважды, вы можете получить значение из адреса, указывающего на адрес значения.

0 голосов
/ 10 марта 2012

Вы должны выделить и обработать поле данных char * и скопировать входное значение. :) (или, по крайней мере, используйте strdup ()). Вы также можете посмотреть на const char * как тип входных данных

...