Вопросы с указателями относительно связанных списков - PullRequest
1 голос
/ 26 сентября 2011

Хорошо, ребята, так что я работал над программой со связанным списком и столкнулся с проблемой. Я пытаюсь поместить часть данных в уже отсортированный связанный список отсортированным способом. Прямо сейчас я сравниваю данные указателя, которые пользователь предоставляет (Data * newData) с заголовком (LinkNode * current = head), и я знаю, что там происходит сбой моей программы. Я знаю, что должен сравнивать фактические значения, а не адреса памяти, но я не уверен, как мне это сделать. У кого-нибудь есть предложения или идеи?

Спасибо.

void addSorted(Data * newData)
{
    if(head == NULL)
    {
        head = new LinkNode(newData);
        return;
    }
    LinkNode * current = head;
    LinkNode * previous = NULL;
    while(current != NULL)
    {
        if(newData->compareTo(current->data) == -1)
        {
            LinkNode * newNode = new LinkNode(newData);
            newNode->next = current;
            if(previous == NULL)
            {
                current->next = newNode;
            }
            else
            {
                newNode->next = previous->next;
                previous->next = newNode;
            }
            return;
        }
        previous = current;
        current = current->next;
    }
    previous->next = new LinkNode(newData);
}

Ответы [ 4 ]

3 голосов
/ 26 сентября 2011

Просто

    if(*newData < (*current->data))     

при условии, что оператор <перегружен для типа данных </p>

Минимальный идиоматический способ обеспечения std :: less <> совместимого слабого общего порядка (оператор Iow Implement <): </p>

struct Data
{
    int id;
    std::string other;

    // details omitted

    bool operator<(const Data& b) const
    {
         if (id < rhs.id)
             return true;
         if (id > ths.id)
             return false;
         return (other < b.other);
    }
};

Если у вас большая / сложная структура и все участвующие члены имеют сравнение, определенное для их типов, вы можете сделать этот хитрый трюк с TR1, Boost или C ++ 11 Tuples:

    #include <tuple>

    // ...

        bool operator<(const Data& b) const
        {             
             return std::tie(id,other)< std::tie(b.id,b.other);
        }
1 голос
/ 26 сентября 2011

В вашем цикле while вы сравниваете newData (который является указателем) с "current-> data", который является целым числом (я полагаю)?

, т.е. if (newData data)

0 голосов
/ 26 сентября 2011
if(newData < current->data)

должно быть

if(*newData < current->data)

Я думаю. Если оператора <нет, используйте его или используйте медленный memcmp. </p>

Также, если это практический код (почему бы не использовать stl?), Рассмотрите возможность использования , пропускайте списки - они будут намного быстрее.

PS: операторы - мощная функция, не стесняйтесь их использовать.

0 голосов
/ 26 сентября 2011

вы можете использовать memcmp для сравнения ваших данных

...