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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Линейный список, сортировка пузырьком 
V
    Опции темы
Kostik88
Дата 6.8.2008, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте! Я пишу класс для работы со списком, но наткнулся на проблемку, жутко затупил smile,  связанную с сортировкой, допустим пузырьком. 
Ничего не выводит(иногда вылетает прога), а если работает то выводит не законченную сортировку(не все итерации).

Для простоты и наглядности привожу код сделанный в майн-е:

Код

#include<iostream>
#include<cstdio>
#include<stdlib.h>

using namespace std;

struct List{
   int key;
   List *next;
   };
  List *fist;


void main()
{ 
    List *L,*p,*end = NULL;
 List *t;
 int k,z;
 int x;

 fist = (List *)malloc(sizeof(List));  fist->next = NULL;
 cout<<"Postroenie spiska \n";
 cout<<"Enter chisla \n";
 cin>>k;
 L = (List *)malloc(sizeof(List));
 L = fist;
 L->key = k;
 L->next = NULL;
 
    cin >> z;
         while(z!=0)
        {  
           L->next = (List *)malloc(sizeof(List));     
           L = L->next;          
           L->key = z;
          
           L->next = NULL;
           cin>>z;
        }


//////////////////////////////////////// СОТИРОВКА ////////////////////////////////////////////////////////////

         L=fist;  // устанавливаю указатель на начало списка.

         L = L->next;

         while(L!=end)
         {
         
             for(p=L;p->next!=end;p=p->next)
             {
                 if( p->key  > (p->next)->key) // тут я  явно чтото забыл
                 {
                      x = (L->next)->key;
                     (L->next)->key = (L)->key;
                     (L)->key = x;
                 
                 }
            
             }
              end=p;
             L=L->next;
         
         }

////////////////////////////КОНЕЦ СОРТИРОВКИ/////////////////////////////////////////////
 L = fist;

 while(L!=NULL)
 {
     cout<<"  "<< L->key <<"\n";
     L=L->next;
 
 }

}


заранее благодарен!
PM MAIL   Вверх
warmonger_
Дата 7.8.2008, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



тут вообще оч странно... ты меняеш просто значения в спске, а в идеале дожны сами узлы меняться.
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
Kostik88
Дата 7.8.2008, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

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



Хм... А не легче просто значения структуры( поле key ) менять?  Просто не вижу смысла менять местами указатели... список то уже построен. Может конечно я и не прав, но уж пусть ктонибудь растолкует)
PM MAIL   Вверх
warmonger_
Дата 7.8.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ну приствь, что у тебя в каждом узлу содержиться кроме поля кей еще какие-то "важные" данные и их много... то легче поменять указатели ( и быстрее ), чем морочиться со свеми данными

Это сообщение отредактировал(а) warmonger_ - 7.8.2008, 00:25
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
Kostik88
Дата 7.8.2008, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

ну приствь, что у тебя в каждом узлу содержиться кроме поля кей еще какие-то "важные" данные и их много... то легче поменять указатели ( и быстрее ), чем морочиться со свеми данными



Пардон, это я не подумавши сказал. Просто расмотрел самый что нинаесть лёгкий пример с одним полем в узле.

А узлы менять значит так:
Код

List *q; \\ вспомогоательны указатель

q=List->next;
List->next = (List->next)->next;
(List->next)->next = q;



только всёравно не пашет.
PM MAIL   Вверх
warmonger_
Дата 7.8.2008, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



нет... почитай про динамические структуры данных
держи, вот когда-то читал
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
Kostik88
Дата 7.8.2008, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хотя в таком примере наврятли узлы можно поменять.... нужен двусвязный список.

Для простоты допустим, что у меня только одно поле в узле.... и я не хочю(да и врятли получится в односвязном списке)  менять узлы... просто сортировка по элементу key...  так и не работает.
PM MAIL   Вверх
warmonger_
Дата 7.8.2008, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



попробуй убрать строчку в вайле 
Код

end = p;

--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
Kostik88
Дата 7.8.2008, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



резудьтат не очень хорошь  smile 
ввожу ===> 5,4,3,2,1 получаю ===> 5, 4,2,3,1 
И ктомуже указатель на конец списка нужно сохранять.
PM MAIL   Вверх
warmonger_
Дата 7.8.2008, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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





Добавлено @ 01:08
Код

         L=fist;  // устанавливаю указатель на начало списка.
         while(L!=end)
         {
         
             for(p=fist;p->next!=end;p=p->next)
             {
                 if( p->key  > (p->next)->key) 
                 {
                      x = (p->next)->key;
                     (p->next)->key = (p)->key;
                     (p)->key = x;
                 
                 }
            
             }
            
             L=L->next;
         
         }


Это сообщение отредактировал(а) warmonger_ - 7.8.2008, 01:08
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
Kostik88
Дата 7.8.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 Блин точно как же я мог не заметить этого 

Цитата

for(p=fist;p->next!=end;p=p->next)


p = L  вот почему у меня не все итерации шли то  smile  указатель L всё время меняется и получается белеберда)




warmonger_,  спасибо.

Это сообщение отредактировал(а) Kostik88 - 7.8.2008, 12:28
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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