Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Односвязный список, сортировка по алфавиту 
:(
    Опции темы
Жука
Дата 29.4.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



Всех приветствую!У меня опять проблема...

И выглядит она так:описать структуру с именем PRICE, содержащую следующие поля:
• TOVAR — название товара;
• MAG — название магазина, в котором продается товар;
• STOIM — стоимость товара в руб.
2. Написать программу, выполняющую следующие действия:
• ввод с клавиатуры данных в список SPISOK, состоящий из восьми эле¬ментов типа PRICE; записи должны быть размещены в алфавитном по¬рядке по названиям товаров;
• вывод на экран информации о товаре, название которого введено с клавиа¬туры;
• если таких товаров нет, выдать на дисплей соответствующее сообщение.

Все это надо реализовать в виде односвязного списка.Я вроде со всем разобралась, кроме сортировки..Там с этими указателями совсем запуталась.И еще - нельзя пользоваться qsort.
Помогите пожалуйста!)
PM MAIL   Вверх
Xenon
Дата 29.4.2007, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



Можно так
Код

#include <iostream>
#include <string>
#include <list>

const int SIZE = 8;
struct price
{
    std::string tovar;
    std::string mag;
    int stoim;
};

bool compare(price obj, price obj2)
{
    if (std::strcmp( obj.tovar.c_str(), obj2.tovar.c_str() ) == -1) return true;
    return false;
}

int main(int argc, char* argv[])
{
    std::list<price> spisok(SIZE);
    for (std::list<price>::iterator iter = spisok.begin(); iter != spisok.end(); ++iter)
    {
        std::cout << "Vvedite nazvanine tovara: ";
        std::getline(std::cin, iter->tovar);
        std::cout << "Vvedite nazvanije magazina: ";
        std::getline(std::cin, iter->mag);
        std::cout << "Vvedite stoimost tovara: ";
        std::cin >> iter->stoim;        
        std::cin.ignore();
    }
    spisok.sort(compare);
    for (std::list<price>::iterator iter = spisok.begin(); iter != spisok.end(); ++iter)
    {
        std::cout << "Nazvanine tovara: " << iter->tovar << std::endl;
        std::cout << "Nazvanije magazina: " << iter->mag << std::endl;
        std::cout << "Stoimost tovara: " << iter->stoim << std::endl;
    }
    std::string tovar_find;
    std::cout << "Vvedite nazvanije tovara dlia poiska: ";
    std::getline(std::cin, tovar_find);
    bool are_found = false;
    for (std::list<price>::iterator iter = spisok.begin(); iter != spisok.end(); ++iter)
    {
        if(iter->tovar.compare(tovar_find) != 0) continue;
        std::cout << "Nazvanije magazina: " << iter->mag << std::endl;
        std::cout << "Stoimost: " << iter->stoim << " rublej" << std::endl;
        are_found = true;
    }
    if(!are_found) std::cout << "Net takogo tovara v baze";
    std::cin.sync();
    std::cin.get();
    return 0;
}


Можно так
Код

#include <iostream>
#include <string>
#include <algorithm>
#include <list>

const int SIZE = 8;

namespace manager
{
    struct price
    {
        std::string tovar;
        std::string mag;
        int stoim;
    };

    bool compare(price obj, price obj2)
    {
        if (std::strcmp( obj.tovar.c_str(), obj2.tovar.c_str() ) == -1) return true;
        return false;
    }

    void enter_data(price& obj)
    {
        std::cout << "Vvedite nazvanine tovara: ";

        std::getline(std::cin, obj.tovar);
        std::cout << "Vvedite nazvanije magazina: ";
        std::getline(std::cin, obj.mag);
        std::cout << "Vvedite stoimost tovara: ";
        std::cin.ignore();
        std::cin >> obj.stoim;    
    }
    void display(price& obj)
    {
        std::cout << "Nazvanine tovara: " << obj.tovar << std::endl;
        std::cout << "Nazvanije magazina: " << obj.mag << std::endl;
        std::cout << "Stoimost tovara: " << obj.stoim << std::endl;
    }
}
int main(int argc, char* argv[])
{
    typedef std::list<manager::price> PriceList;
    PriceList spisok(SIZE);
    std::for_each(spisok.begin(), spisok.end(), manager::enter_data);
    spisok.sort(manager::compare);
    std::for_each(spisok.begin(), spisok.end(), manager::display);
    std::string tovar_find;
    std::cout << "Vvedite nazvanije tovara dlia poiska: ";
    std::getline(std::cin, tovar_find);
    bool are_found = false;
    for (PriceList::iterator iter = spisok.begin(); iter != spisok.end(); ++iter)
    {
        if(iter->tovar.compare(tovar_find) != 0) continue;
        std::cout << "Nazvanije magazina: " << iter->mag << std::endl;
        std::cout << "Stoimost: " << iter->stoim << " rublej" << std::endl;
        are_found = true;
    }
    if(!are_found) std::cout << "Net takogo tovara v baze";
    std::cin.sync();
    std::cin.get();
    return 0;
}


Это сообщение отредактировал(а) Xenon - 29.4.2007, 23:48


--------------------
user posted image  
PM MAIL   Вверх
Жука
Дата 30.4.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



СПАСИБО КОНЕЧНО, но тут слишком сложно..У меня есть функция сортировки массива структур по алфавиту.
Код

for (k=0;k<8;k++)//SPISOK,temp-массивы структур
for (i=0;i<7;i++)
 {
 if  (strcmp(SPISOK[i].TOVAR,SPISOK[i+1].NAZN)>0)
  {
  temp=SPISOK[i];
  SPISOK[i]=SPISOK[i+1];
  SPISOK[i+1]=temp;
  }
 }


Нельзя ли как нибудь ее переделать с указателями??
PM MAIL   Вверх
apook
Дата 30.4.2007, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



Что то мне подсказывает что это ни какая не сортировка по алфавиту, а странная сортировка по длинне названия товара


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
zkv
Дата 30.4.2007, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



Цитата(apook @  30.4.2007,  21:12 Найти цитируемый пост)
а странная сортировка по длинне названия товара

ключевое слово - странная, особенно:
Цитата(Жука @  30.4.2007,  20:57 Найти цитируемый пост)
strcmp(SPISOK[i].TOVAR,SPISOK[i+1].NAZN)

smile
PM MAIL   Вверх
Жука
Дата 30.4.2007, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



ээээ...ну может быть smile но вроде работает да и препод ничего по ее поводу не сказал(скорее всего просто повезло)...а как мне тогда слелать?ток чтоб попроще было, а то я не допру smile 
PM MAIL   Вверх
Xenon
Дата 30.4.2007, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



Жука, сложно? Хм ... Ну ты побольше информации дай. Вот из твоего кода я вижу некое типа Spisok, при чем с операцией индексации, что-то мне подсказывает, что "список" в твоем случае - простой массив одномерный? Если да, то можно переписать пример попроще.


--------------------
user posted image  
PM MAIL   Вверх
Xenon
Дата 1.5.2007, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



Упростил сделав с массивом:
Код

#include <iostream>
#include <string>
#include <algorithm>

const int SIZE = 8;

using namespace std;

struct price
{
    string tovar;
    string mag;
    int stoim;
};

void sort(price spisok[])
{
    for (int j = 1, i = 0; j < SIZE; ++j)
    {
        price buf = spisok[j];
        for (i = j - 1; i >= 0 && buf.tovar.compare(spisok[i].tovar) < 0; --i)
        {
            spisok[i + 1] = spisok[i];
        }
        spisok[i + 1] = buf;
    }
}

void enter_data(price& obj)
{
    cout << "Vvedite nazvanine tovara: ";
    cin >> obj.tovar;
    cout << "Vvedite nazvanije magazina: ";
    cin >> obj.mag;
    cout << "Vvedite stoimost tovara: ";
    cin.ignore();
    cin >> obj.stoim;    
}
void display(price& obj)
{
    cout << "Nazvanine tovara: " << obj.tovar << endl;
    cout << "Nazvanije magazina: " << obj.mag << endl;
    cout << "Stoimost tovara: " << obj.stoim << endl;
}

int main(int argc, char* argv[])
{
    price spisok[SIZE];
    for_each(spisok, spisok + SIZE, enter_data);
    sort(spisok);
    for_each(spisok, spisok + SIZE, display);
    cout << "Vvedite nazvanije tovara dlia poiska: ";
    string tovar_find;
    cin >> tovar_find;
    bool are_found = false;
    for (int i = 0; i < SIZE; ++i)
    {
        if(spisok[i].tovar.compare(tovar_find) != 0) continue;
        cout << "Nazvanije magazina: " << spisok[i].mag << endl;
        cout << "Stoimost: " << spisok[i].stoim << " rublej" << endl;
        are_found = true;
    }
    if(!are_found) cout << "Net takogo tovara v baze";
    cin.sync();
    cin.get();
    return 0;
}


Ну раз на то пошло ... если с STL не очень:
Код

#include <iostream>
#include <string>

const int SIZE = 8;

using namespace std;

struct price
{
    string tovar;
    string mag;
    int stoim;
};

int main(int argc, char* argv[])
{
    price spisok[SIZE];
    for (int i = 0; i < SIZE; ++i)
    {
        cout << "Vvedite nazvanine tovara: ";
        cin >> spisok[i].tovar;
        cout << "Vvedite nazvanije magazina: ";
        cin >> spisok[i].mag;
        cout << "Vvedite stoimost tovara: ";
        cin.ignore();
        cin >> spisok[i].stoim;    
    }
    for (int j = 1, i = 0; j < SIZE; ++j)
    {
        price buf = spisok[j];
        for (i = j - 1; i >= 0 && buf.tovar.compare(spisok[i].tovar) < 0; --i)
        {
            spisok[i + 1] = spisok[i];
        }
        spisok[i + 1] = buf;
    }
    for (int i = 0; i < SIZE; ++i)
    {
        cout << "Nazvanine tovara: " << spisok[i].tovar << endl;
        cout << "Nazvanije magazina: " << spisok[i].mag << endl;
        cout << "Stoimost tovara: " << spisok[i].stoim << endl;
    }
    cout << "Vvedite nazvanije tovara dlia poiska: ";
    string tovar_find;
    cin >> tovar_find;
    bool are_found = false;
    for (int i = 0; i < SIZE; ++i)
    {
        if(spisok[i].tovar.compare(tovar_find) != 0) continue;
        cout << "Nazvanije magazina: " << spisok[i].mag << endl;
        cout << "Stoimost: " << spisok[i].stoim << " rublej" << endl;
        are_found = true;
    }
    if(!are_found) cout << "Net takogo tovara v baze";
    cin.sync();
    cin.get();
    return 0;
}


Это сообщение отредактировал(а) Xenon - 1.5.2007, 00:11


--------------------
user posted image  
PM MAIL   Вверх
Жука
Дата 1.5.2007, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



Мне эту задачку надо через односвязный список сделать, следовательно надо пользоваться указателями, которые я вообще не поняла.А сортировку с ними сделать вообще не смогу.И компилятор у меня древнегреческий, std не воспринимает.Вот такие дела.

Вот значит как я начала эту задачу делать(формирование и вывод на экран списка).Осталось только сортировку сделать)
Код

#include<stdio.h>
#include<iostream.h>
#include<conio.h>
#include<string.h>
const int n=3;

struct PRICE
   {char tovar[20];
    char mag[20];
    int stoim;
    PRICE *next;
   };

void pechat(PRICE *t)
{ PRICE *t2;
  t2=t;
  int i=1;
     while (t2!=NULL)
    {cout<<i<<"\t"<<t2->tovar<<"\n";
    t2=t2->next;
    i++;
    };
}

PRICE* spisok(PRICE *t,int i)
{ PRICE *t2;
  t2=new PRICE;
  cout<<"Vvedite nazvanie tovara N "<<i+1<<" :\n";
   gets(t2->tovar);
   cout<<"Vvedite nazvanie magazina :\n";
   gets(t2->mag);
   cout<<"Vvedite ceny tovara:\n";
   cin>>t2->stoim;
   t2->next=t;
   t=t2;
   return t;
  }

PRICE* sortirovka(PRICE *t)//?????????вот она проблема)
{ 
}


void main (void)
{clrscr();
PRICE *ab;
ab=NULL;
for(int i=0;i<n;i++)
ab=spisok(ab,i);
cout<<"\nSpisok tovarov:\n";
ab=NULL;
sortirovka(ab);
pechat(ab);
getchar();
}



ОЧЕНЬ-ОЧЕНЬ прошу, помогите пожалуйста!
PM MAIL   Вверх
dizzy1984
Дата 2.5.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Назвались бы a1b2 я бы вам сразу помог.
По "Жука" можно и не понять что вы девушка, а от этого, как вы знаете, многое зависит...


Цитата(Жука @  1.5.2007,  08:52 Найти цитируемый пост)
Осталось только сортировку сделать

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

Код

const int n = 10;
//...
PRICE * GetPreviousNode(PRICE *pRootNode, const PRICE *pCurNode)
{
    PRICE *n = pRootNode;
    if (n->next == pCurNode) 
        return n;
    while (n = n->next)
    {        
        if (n->next == pCurNode) 
            return n;
    }
    return NULL;
}

void Swap2AdjacentNodes(PRICE * &pRootNode, PRICE *pNode1, PRICE *pNode2)
{
    PRICE *pNode1Prev = GetPreviousNode(pRootNode, pNode1);    
    if (pNode1Prev)
        pNode1Prev->next = pNode2;
    else 
        pRootNode = pNode2;
    pNode1->next = pNode2->next;    
    pNode2->next = pNode1;
}

PRICE * GetNodeAtIndex(PRICE *pRootNode, int nIndex)
{
    PRICE *n = pRootNode;
    while (nIndex--)
        n = n->next;
    return n;
};

void puzir_sort(PRICE * &pRootNode)
{
   int i=0,already_sort=0,m=n;

   while (!already_sort)
   {
      for (i=0,already_sort=1;i<m-1;i++)
      {     
        if (strcmp(GetNodeAtIndex(pRootNode, i)->tovar, GetNodeAtIndex(pRootNode, i+1)->tovar) > 0)
        {
            already_sort=0;
            Swap2AdjacentNodes(pRootNode, GetNodeAtIndex(pRootNode, i), GetNodeAtIndex(pRootNode, i+1));
        };
      };
      m--;
   };   
};


После вызова функции 
Код

void puzir_sort(PRICE * &pRootNode)

Список будет отсортирован по полю
Код

char tovar[20];    


Моя идея сводится к тому, чтобы заставить стандартный алгоритм пузырьковой сортировки работать со списком. Для этого пришлось написать функцию возвращающую элемент по его порядковому номеру. И функцию обмена 2-х смежных элементов списка.

Вот пример использования
Код

void main()
{
    PRICE *root1  = new PRICE,
          *root2  = new PRICE,
          *root3  = new PRICE,
          *root4  = new PRICE,
          *root5  = new PRICE,
          *root6  = new PRICE,
          *root7  = new PRICE,
          *root8  = new PRICE,
          *root9  = new PRICE,
          *root10 = new PRICE;

    root1->stoim = 10;
    strcpy(root1->tovar,"САЛАТ");
    strcpy(root1->mag,"МАГ1");

    root2->stoim = 11;
    strcpy(root2->tovar,"ФАРШ");
    strcpy(root2->mag,"МАГ1");

    root3->stoim = 12;
    strcpy(root3->tovar,"ПОМИДОР");
    strcpy(root3->mag,"МАГ1");

    root4->stoim = 13;
    strcpy(root4->tovar,"КУРИНАЯ НОГА");
    strcpy(root4->mag,"МАГ2");

    root5->stoim = 14;
    strcpy(root5->tovar,"ХРЕН");
    strcpy(root5->mag,"МАГ2");

    root6->stoim = 15;
    strcpy(root6->tovar,"ПЛОВ");
    strcpy(root6->mag,"МАГ2");

    root7->stoim = 16;
    strcpy(root7->tovar,"СМЕТАНА");
    strcpy(root7->mag,"МАГ3");

    root8->stoim = 17;
    strcpy(root8->tovar,"МАСЛО");
    strcpy(root8->mag,"МАГ3");

    root9->stoim = 18;
    strcpy(root9->tovar,"КАПУСТА");
    strcpy(root9->mag,"МАГ3");

    root10->stoim = 19;
    strcpy(root10->tovar,"СНИКЕРС");
    strcpy(root10->mag,"МАГ4");

    root1->next  = root2;
    root2->next  = root3;
    root3->next  = root4;
    root4->next  = root5;
    root5->next  = root6;
    root6->next  = root7;
    root7->next  = root8;
    root8->next  = root9;
    root9->next  = root10;
    root10->next = NULL;

    puzir_sort(root1);

    delete root1;
    delete root2;
    delete root3;
    delete root4;
    delete root5;
    delete root6;
    delete root7;
    delete root8;
    delete root9;
    delete root10;
}

Результат такой
КАПУСТА->КУРЬЯ НОЖКА->МАСЛО->ПАМИДОР->ПЛОВ->САЛАТ->СМЕТАНА->СНИКЕРС->ФАРШ->ХРЕН

Я использовал для компиляции vc60, так что если будут трения, напишите

PM MAIL   Вверх
Жука
Дата 3.5.2007, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



dizzy1984, БОЛЬШУШЕЕ ВАМ СПАСИБО, которое к сожалению в карман не положишь(((
 Только с пониманием вашего решения у меня не складывается( Не могли бы вы мне обьяснить? Ну пожааааалуйста)
Код

const int n = 10;
//...
PRICE * GetPreviousNode(PRICE *pRootNode, const PRICE *pCurNode)//что в этой ф-ции делается?
{
    PRICE *n = pRootNode;
    if (n->next == pCurNode) //?????
        return n;
    while (n = n->next)  //????
    {        
        if (n->next == pCurNode) 
            return n;
    }
    return NULL;
}

void Swap2AdjacentNodes(PRICE * &pRootNode, PRICE *pNode1, PRICE *pNode2)//а тут чего?
{
    PRICE *pNode1Prev = GetPreviousNode(pRootNode, pNode1);    
    if (pNode1Prev)
        pNode1Prev->next = pNode2;
    else 
        pRootNode = pNode2;//здесь все к сожалению не понятно
    pNode1->next = pNode2->next;    
    pNode2->next = pNode1;
}

PRICE * GetNodeAtIndex(PRICE *pRootNode, int nIndex)//???????????
{
    PRICE *n = pRootNode;
    while (nIndex--)//??
        n = n->next;//???
    return n;
};

void puzir_sort(PRICE * &pRootNode)//?????????
{
   int i=0,already_sort=0,m=n;

   while (!already_sort)
   {
      for (i=0,already_sort=1;i<m-1;i++)
      {     
        if (strcmp(GetNodeAtIndex(pRootNode, i)->tovar, GetNodeAtIndex(pRootNode, i+1)->tovar) > 0)
        {
            already_sort=0;
            Swap2AdjacentNodes(pRootNode, GetNodeAtIndex(pRootNode, i), GetNodeAtIndex(pRootNode, i+1));//что тут делается?
        };
      };
      m--;
   };   
};


много-много раз ПОЖАЛУЙСТА обьясните что к чему)
PM MAIL   Вверх
dizzy1984
Дата 4.5.2007, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Ради тебя я готов положить его и в карман. smile 
В тот раз у меня была отрицательная репутация и мне хотелось ее исправить. 
Я не требую повышать свою репутацию за ответы.

А давай на ты.
Меня, кстати, зовут саша.

Сначала общё

Код

void puzir_sort()
 
Изначально функция была призвана сортировать массив, который бы передавался ей как int *pArr.
Но у нас другая структура данных - односвязный список. Что это такое я думаю ты уже в курсе. Это некая структра, одно из полей которой ссылается на такую же структуру (извиняюсь за тавтологию). Когда список подходит к концу, это поле имеет значение NULL. В пузырьковой сортировке мы могли получать элемент с индексом i pArr[i] и обменивать 2 элемента с индексами i и j (swap(pArr[i], pArr[j])). В то время как для сортировки односвязных списков наверняка есть специальные алгоритмы, я решил применить для этой цели пузырьковую сортировку. Мне нужен был эквивалент pArr[i] и им стал GetNodeAtIndex, а также swap(pArr[i], pArr[j]) которым стал Swap2AdjacentNodes. И тогда фунция пузырьковой сортировки стала сортировать список. 

Конкретно по фунциям

Код

PRICE * GetPreviousNode(PRICE *pRootNode, const PRICE *pCurNode) //она возвращает предыдущий элемент списка. если его нет, то NULL
{ //служит как вспомогательная фунция к Swap2AdjacentNodes
PRICE *n = pRootNode;  // первый элемент списка, теперь n на него указывает
if (n->next == pCurNode) // pCurNode - указатель на текущий элемент, для него мы хотим найти предшествующий
// если n указывает на элемент поле next которого указывает на текущий элемент - это (n) и есть предшествующий ему
return n; // возвратим его
while (n = n->next) //пока не конец списка. n->next будет 0 (булева ложь) для конца списка и условие while не выполнится.
{ //приравнивая n мы перемещаемся по списку. 
if (n->next == pCurNode)  //давая возможность проведения сравнения которое я описал выше
return n;
}
return NULL;
}


Код

void Swap2AdjacentNodes(PRICE * &pRootNode, PRICE *pNode1, PRICE *pNode2)// функция на сто баксов. именно она обменивает 2 //смежных элемента списка
{// мы ей передаем ссылку на указатель на первый элемент списка, поскольку он(указатель) может поменяться. например если мы меняем //местами первый и второй элемент списка
PRICE *pNode1Prev = GetPreviousNode(pRootNode, pNode1); //получаем указатель на предыдущий элемент для указателя на текущий (pNode1)
if (pNode1Prev) // если он вообще есть (его может не быть когда мы имеем дело с первым указателем на 1-й элемент)
pNode1Prev->next = pNode2;// то пусть он указывает на второй элемент (*pNode2)
else 
pRootNode = pNode2;//если ситуация такова, что мы пытаемся поменять местами первый и второй элемент, то pRootNode который раньше ....//указывал на *pNode1, теперь должен указывать на *pNode2, что мы и делаем
pNode1->next = pNode2->next; // так как Node1 теперь как бы Node2, поскольку мы их меняем местами, то и указывать он должен на тот //элемент, на который раньше указывал pNode2.
pNode2->next = pNode1; // и наоборот, но учитывая смежность элементов pNode2 должен указывать не на pNode1->next, а на pNode1
}


Код

PRICE * GetNodeAtIndex(PRICE *pRootNode, int nIndex)//Что может быть проще. просто получаем указатель на элемент списка
{// зная начало списка и порядковый номер указателя
PRICE *n = pRootNode;
while (nIndex--)//Счетчик количества итераций, цикл отработает ровно nIndex итераций
n = n->next;// движение по списку.
return n; //движение окончено. возвращаем указатель. теперь он указывает на нужный нам элемент
};


Код

void puzir_sort(PRICE * &pRootNode)//Простейшая из существующих на планете "Земля" сортировок. пузырьковая
{// содрана из исходника неизвестного автора с папки 1-го курса 5-ти летней давности.
int i=0,already_sort=0,m=n; //вспомогательный индекс, флаг, показывающий находится ли массив(напиример) в отсортированном состоянии
while (!already_sort)// пока не находится
{
for (i=0,already_sort=1;i<m-1;i++)// оптимистично прежположим что массив отсортирован
{ 
if (strcmp(GetNodeAtIndex(pRootNode, i)->tovar, GetNodeAtIndex(pRootNode, i+1)->tovar) > 0) //два смежных элемента находятся в порядке
{ // не соответствющем порядку возрастания. strcmpy возвратит >0 если лексикографическое сравнение слов даст результат "больше"
already_sort=0;// нет, все плохо, он еще не отсортирован
Swap2AdjacentNodes(pRootNode, GetNodeAtIndex(pRootNode, i), GetNodeAtIndex(pRootNode, i+1));//поменяем значения 2-х элементов массива
// в случае со списком здесь будет просто игра в пинг-понг с указателями на смежные элементы. сами данные стррктур перемещаться не будут
};
};
m--;
}; 
};


Если что-то не ясно, то.
1. Возьми Книгу Си Подбельского, прочитай главу про указатели.
2. С карандашиком и листком, с окошком Debug->Inspect протрассируй программу и посмотри что происходит в памяти.
Ну и конечно не смущйся спрашивай, всегда отвечу.

PM MAIL   Вверх
apook
Дата 4.5.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



Функция strcmp действительно помогает при сортировке массива, но
я не врублюсь каким почему?

Вот программку набросал и она работает
Код

#include<iostream.h>
#include<conio.h>
#include<string.h>

void sorrt( char aa[ ][ 20 ] )
{
int i, j;
char temp[ 20 ];

for( j=0; j<3; j++ )
{
    for( i=0; i<2; i++ )
        if( stricmp(aa[ i ], aa[ i+1 ])>0 )
        {
            strcpy( temp, aa[ i ] );
            strcpy( aa[ i ], aa[ i+1 ] );
            strcpy( aa[ i+1 ], temp );
            }
    }
return;
}


void main()
{
int i, j;
char arr[ 3 ][ 20 ]={
{"badjhdghjghj"},
{"Ffgjhdsghjsd"},
{"ABdjhdghjghj"}
};



for( i=0; i<3; i++ )
    cout << arr[ i ] << endl;
cout << endl;


sorrt( arr );


for( i=0; i<3; i++ )
    cout << arr[ i ] << endl;
getch();

return;   
}






--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
dizzy1984
Дата 4.5.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Цитата(apook @  4.5.2007,  13:02 Найти цитируемый пост)
 каким почему?

Думаю самым обыкновенным почему. 
Она сравнивает коды символов. 
В цифровом веке все можно сравнить и измерить.
PM MAIL   Вверх
Жука
Дата 4.5.2007, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



dizzy1984, не боюсь показаться предсказуемой, но хочу сказать тебе(раз уж сам предложил перейти на "ты", то я этим уже пользуюсь), ОГРОМНОЕ-ПРЕОГРОМНОЕ СПАСИБО)
П.С. меня, кст, зовут оля.

apook, вам тоже СПАСИБОЧКИ)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0759 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.