2013-09-21 3 views
1

У меня есть из положить:Как поменять индекс для связанного списка C++

узел 1: Боб Джо Джилл Джефф Джилл

, но я хочу его туда, где, если имя повторы, что получает отправлен на фронт в односвязный список, так что он стал бы

узел 1: Jill Боб Джо Джефф

И у меня возникли проблемы с возможностью реализовать это.

Вот мой код:

string employers[] = {"Jill", "Jeff", "Bob", "Joe", "Monica", "Luis"}; 

struct node { 
    node(string name="") {data=name; next=NULL; } 

    string data; 

    node *next; 
    node *prev; 
}; 


class list { 
public: 
    list(int N=0, int value=0); 
    ~list(); 

    void put(int); 
    friend ostream & operator << (ostream &, const list &); 

private: 
    int N; 
    node *head; 

}; 



void list::put(int i) { 
    string employee_name = employers[i]; 
    node * p = new node(g); 
    node * pp = head; 

    while (pp - > next) { 


     pp = pp - > next; 
     for (int b=6; b<6; b++) { 
      if (p-> data == names[b] 
      cout << "found"; 
    } 

    pp - > next = p; 

    N++; 

}

Трудность у меня есть, как я смог бы сравнить каждый из моих записей в моем связанном списке? Я создал узел * prev, но я не совсем уверен, как я могу сравнить узлы.

+0

Переведите список и используйте оператор сравнения ('operator ==') для сравнения строк узлов. В чем проблема? – Manu343726

+0

Как я могу узнать, что Джилл, например, уже была добавлена? Я новичок в кодировании. Извините:/ –

+0

Извините за мой комментарий: вы можете использовать оператор сравнения, чтобы проверить его на две вещи (строки в этом случае) равны. Например: 'if (one_string == other_string) std :: cout <<" Строки равны! ";'. Так сделайте это с каждым элементом вашего списка, чтобы проверить, существует ли новая строка в списке. – Manu343726

ответ

0
  1. Всегда писать небольшие функции
  2. Если функция кажется больше всегда разбить на более мелкие функции
  3. Try, чтобы избежать глобальных данных, в случае необходимости, попытаться передать глобальные ценности, а не работать на них непосредственно

Вот ваше решение. Я добавил функцию поиска и исправил управление указателем.

class list { 
public: 
    list():head(NULL), N(0){} 
    ~list(){ 
    //Implementation for cleanup 
    } 

void put(int i){ //left this function so that your code wont break but try removing it 
    put(employee_names[i]); 
} 

void put(string name){ //rather than accessing the global data, use the value passed 
    node* p = new node(name); 
    p->next=p->prev=NULL; 
    node* pp = find(name); 
    if(pp==NULL){ 
     // No match found, append to rear 
     if(head==NULL) 
     head=p; //list empty, add first element 
     else{ 
     node* cur=head; 
     while(cur->next!=NULL) //Keep looking until a slot is found 
      cur=cur->next; 
     cur->next=p; 
     p->prev=cur; 
     } 
    } 
    else{ 
     //Match found, detach it from its location 
     node* pPrev = pp->prev; 
     pPrev->next = pp->next; 
     pp->next->prev=pPrev; 
     p->next = head; //append it to the front & adjust pointers 
     head->prev=p; 
    } 
    N++; 
    } 

    //MER: finds a matching element and returns the node otherwise returns NULL 
    node* find(string name){ 
     node *cur=head; 
     if(cur==NULL) // is it a blank list? 
      return NULL; 
     else if(cur->data==head) //is first element the same? 
      return head; 
     else // Keep looking until the list ends 
      while(cur->next!=NULL){ 
      if(cur->data==name) 
      return cur; 
      cur=cur->next; 
      } 
     return NULL; 
} 
friend ostream& operator << (ostream& os, const list& mylist); 

private: 
    int N; 
    node *head; 

}; 

Теперь некоторые могут сказать вам, чтобы использовать список в STL п никогда не писать свой собственный код сог вы не можете победить STL, но мне это хорошо, что вы реализуете свой собственный, чтобы получить четкое представление о как это работает на самом деле.

0

Вот как я сделал бы это, если бы это было не школьное задание.

class EmployerCollection 
{  
public: 
    bool AddEmployer(const std::string& name) 
    { 
     EmployerList::const_iterator it = std::find(m_employers.begin(), m_employers.end(), name); 
     if (it != m_employers.end()) // Already exists in list. 
     { 
      m_employers.splice(m_employers.begin(), m_employers, it, std::next(it)); 
      return true; 
     } 
     m_employers.push_front(name); 
     return false; 
    } 

private: 
    typedef std::list<std::string> EmployerList; 
    EmployerList m_employers; 
}; 

int main() 
{ 
    const int NUM_EMPLOYERS = 15; 
    std::string employers[NUM_EMPLOYERS] = {"Jill", "Jeff", "Jill"}; 
    EmployerCollection c; 

    for (int i=0; i<NUM_EMPLOYERS; i++) 
    { 
     bool duplicate = c.AddEmployer(employers[i]); 
     printf("Added %s to employer list - duplicate: %s \n", employers[i].c_str(), duplicate ? "True" : "False"); 
    } 
} 
Смежные вопросы