Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2009, 11:24   #1
DOJ
Пользователь
 
Регистрация: 11.06.2009
Сообщений: 19
По умолчанию Сортировка списка

Помогите пожалуйста к этому коду сделать сортировку, со списками только начала разбиратся. Вот сортировку не могу сообразить как делать. Заранее благадарю.


Код:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string.h>
using namespace std;


class NameDataSet
{
  public:
    char szName[128];
    // указатель на следующую запись в списке
    NameDataSet* pNext;
};

// указатель на первую запись списка
NameDataSet* pHead = 0;

// добавление нового члена в список
void add(NameDataSet* pNDS)
{
    pNDS->pNext = pHead;
    // заголовок указывает на новую запись
    pHead = pNDS;
}

// чтение имени
NameDataSet* getData()
{
    // читаем имя
    char nameBuffer[128];
    cout << "\nEnter name:";
    cin  >> nameBuffer;
    
    // усли "exit" - выход
    if ((stricmp(nameBuffer, "exit") == 0))
    {
        return 0;
    }

    // новая запись для заполнения
    NameDataSet* pNDS = new NameDataSet;
    
    // заполнение поля имени и обнуление указателя
    strncpy(pNDS->szName, nameBuffer, 128);
    pNDS->szName[127] = '\0';
    pNDS->pNext = 0;

    // возврат адреса созданного объкта
    return pNDS;
}


int main(int nNumberofArgs, char* pszArgs[])
{
    cout << "Read names of students\n"
         << "Enter 'exit' for first name to exit\n";

    // создание объекта NameDataSet
    NameDataSet* pNDS;
    while (pNDS == getData())
    {
        // добавление в конец списка
        add(pNDS);
    }

    cout << "Entries:\n";
    pNDS = pHead;
    while(pNDS)
    {
        // вывод текущей записи
        cout << pNDS->szName << "\n";

        // получение следующей записи
        pNDS = pNDS->pNext;
    }

    system("PAUSE");
    return 0; 
}

Последний раз редактировалось MaTBeu; 23.08.2009 в 12:35.
DOJ вне форума Ответить с цитированием
Старый 23.08.2009, 17:47   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Объясняю:
Пусть есть у вас:
Код:
class NameDataSet
{
  public:
    char szName[128];
    // указатель на следующую запись в списке
    NameDataSet* pNext;
};
pHead - указатель на начало списка.

Теперь сортируем.
Код:
NameDataSet *a, *b;
a = pHead;
char tmp[128];
while(a->pNext) // пока существует следующий элемент
 {
 b = a->pNext;
 while(b)  // для каждого элемента перебираем все оставшееся справа
  { 
   if(strcmp(a->szName,b->szName)>0)
    {
     strcpy(tmp, a->szName);
     strcpy(a->szName, b->szName);
     strcpy(b->szName, tmp);
     }
  b = b->pNext;
  }
 a = a->pNext;
 }
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.08.2009, 19:29   #3
DOJ
Пользователь
 
Регистрация: 11.06.2009
Сообщений: 19
По умолчанию

Большое спасибо за объяснение.
DOJ вне форума Ответить с цитированием
Старый 23.08.2009, 19:36   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Собственно, это что-то вроде линейного метода для списков. На быстроту и максимальную эффективность не претендует.
Можно вместо обмена при выполнении условия запоминать адрес элемента. И уже после цикла по b обменивать значения. То есть подобие метода выбором.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка списка [MI_nor] Общие вопросы C/C++ 10 05.05.2009 23:52
сортировка списка Cdevelop Общие вопросы C/C++ 4 23.03.2009 21:25
Сортировка списка Gonzo Помощь студентам 5 11.03.2009 11:08
Сортировка списка Александр из Перми Microsoft Office Excel 3 27.01.2007 22:46