Форум программистов, компьютерный форум CyberForum.ru

Сортировка пузырьком, правка кода - C++

Восстановить пароль Регистрация
 
Nastya19kiss
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
07.06.2012, 18:44     Сортировка пузырьком, правка кода #1
C
1
2
3
4
5
6
7
8
9
10
11
void List::Sort(){
      int trash=0;
      for(Uzel *curr=head;curr =! NULL;curr=curr->next){
          if(curr->data > curr->next->data){
              trash = curr->data;
              curr->data = curr->next->data;
              curr->next->data = trash;
          }
      }
   printf("Sortirovka end\n");
  }
Хочу отсортировать список пузырьком по возрастанию. но видимо в коду ошибка, помогите с сортировкой пожалуйста
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2012, 18:44     Сортировка пузырьком, правка кода
Посмотрите здесь:

сортировка пузырьком C++
Сортировка пузырьком. C++
Сортировка пузырьком C++
C++ Сортировка пузырьком
C++ Сортировка пузырьком
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
qfisher
30 / 30 / 1
Регистрация: 24.05.2012
Сообщений: 156
07.06.2012, 18:51     Сортировка пузырьком, правка кода #2
Алгоритмы сортировок
Nastya19kiss
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
07.06.2012, 19:02  [ТС]     Сортировка пузырьком, правка кода #3
Я это все читала. я конкретно не могу со связанным списком реализовать пузырек. Точнее я реализовала но неправильно(((щ
qfisher
30 / 30 / 1
Регистрация: 24.05.2012
Сообщений: 156
07.06.2012, 19:51     Сортировка пузырьком, правка кода #4
Кидай полное описание классов Uzel и List
и конкретно где ошибка
Nastya19kiss
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
07.06.2012, 20:03  [ТС]     Сортировка пузырьком, правка кода #5
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <stdio.h>
 
class Uzel
 {
  public:
  int data;
  Uzel *next;
 };
 
class List
 {
  private:
    Uzel *head;
  public:
   // List(){
   // head=NULL;}
   List(){head=NULL;};
    void addUzel(int data);
    void PrintList();
    void Find(int DataItem);
    void Delete(int Number);
    void Insert(int Number, int DataItem);
    //void Sort();
};
 
  void List::addUzel(int data){
    Uzel *ndata=new Uzel;
    ndata->data=data;
    ndata->next=NULL;
    
    if(head==NULL)
      head=ndata;
    else{
      Uzel *curr=head;
      
      while(curr->next!=NULL)
       curr=curr->next;
 
      curr->next=ndata;
    }
 }
  
  void List::PrintList(){
    for(Uzel *curr=head;curr != NULL;curr=curr->next)
     printf("%d\n",curr->data);
  }
 
  void List::Find(int DataItem){
      int i=1;
   //вспомогательным указатель
      for(Uzel *curr=head;curr != NULL;curr=curr->next){
        
        if (DataItem == curr->data) {
         printf("Element N==%d\n",i);
         printf("Rezultat==%d\n",curr->data);}
        i++;
      }
  printf("Poisk okonchen\n");
 }
 
  
   void List::Delete(int Number){
      Uzel *ptr;//вспомогательный указатель
      Uzel *Current = head;
  for (int i = 1; i < Number && Current != NULL; i++)
    Current = Current->next;
  if (Current != NULL){//проверка на корректность
    if (Current == head){//удаляем первый элемент
      head = head->next;
      delete Current;
      Current = head;
    }
    else {//удаляем непервый элемент
      ptr = head;
      while (ptr->next != Current)
        ptr = ptr->next; 
      ptr->next = Current->next;
      delete Current;
      Current=ptr;
    }
  }
 printf("Udalenie end\n");
}
 
 
  
 
  void List::Insert(int Number, int DataItem){ 
    Number--;
Uzel *NewItem=new(Uzel);
  NewItem->data=DataItem; 
  NewItem->next = NULL;
  if (head == NULL) {//список пуст
    head = NewItem;//создаем первый элемент списка
  }
  else {
    Uzel *Current = head;
    for(int i=1; i < Number && Current->next!=NULL; i++)
    Current=Current->next;
    if (Number == 0){
    //вставляем новый элемент на первое место
      NewItem->next = head;
      head = NewItem;
    }
    else {//вставляем новый элемент на непервое место
      if (Current->next != NULL) 
        NewItem->next = Current->next;
      Current->next = NewItem;
    }
  }
    printf("Element vstavlen!!!\n");
  }
  
 
   
int main(){
  List a;
  int n;
  int f;
  int t;
  int r;
  int y;
 
 
      printf("Введите число элементов\n");
      scanf("%d",&n);
  
      for(int i=1;i<=n;i++){
      printf("Элемент-%d\n",i);
      int k=0;
      scanf("%d",&k);
      a.addUzel(k);
      }
      printf("Список:\n");
      a.PrintList();
      
          
  
      printf("Vvedie chislo dlya poiska\n");
      scanf("%d",&f);
      a.Find(f);
      
  
      printf("Vvedie nomer elementa dlya udaleniya\n");
      scanf("%d",&t);
      a.Delete(t);
      a.PrintList();
 
      printf("Vvedite mesto dlya vstavki\n");
      scanf("%d",&r);
      printf("Vvedite element dlya vstavki\n");
      scanf("%d",&y);
      a.Insert(r,y);
      a.PrintList();
      
 
  
 
  return 0;
}
это рабочий код, который создает, ищет элемент, удаляет и вставляет в список. надо сортировку. Функцию Sort я вставляла в мою прогу и она не работала. я ее убрала.

Добавлено через 1 минуту
Код осуществляет создание, поиск элемента указанного, удаление указанного элемента и вставку элемента
qfisher
30 / 30 / 1
Регистрация: 24.05.2012
Сообщений: 156
07.06.2012, 22:50     Сортировка пузырьком, правка кода #6
C++
1
if(curr->data > curr->next->data)
вот здесь указатель в NULL попадает curr->next

Добавлено через 10 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void List::Sort()
{
    int trash=0;
    Uzel *curr;
    Uzel *previous;
    for(curr=head; curr != NULL; previous=curr , curr=curr->next)
    {
        if(previous->data > curr->data)
        {
            trash = curr->data;
            curr->data = previous->data;
            previous->data = trash;
        }
    }
    printf("Sortirovka end\n");
}
Добавлено через 20 минут
Цитата Сообщение от Nastya19kiss Посмотреть сообщение
curr =! NULL
знак неправильно записан - нужно !=

Добавлено через 38 минут
тьфу ну ты, тут же только один проход осуществляется, у тебя один цикл, а нужно 2

C++
1
2
3
4
5
6
7
8
9
10
11
12
for(i = 0; i < size - 1; ++i) // i - номер прохода
    {            
        for(j = 0; j < size - 1; ++j) // внутренний цикл прохода
        {     
            if (arr[j + 1] < arr[j]) 
            {
                tmp = arr[j + 1]; 
                arr[j + 1] = arr[j]; 
                arr[j] = tmp;
            }
        }
    }
нужно добавить поле Count - количество элементов, тогда второй цикл можно будет сделать
Nastya19kiss
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
08.06.2012, 20:19  [ТС]     Сортировка пузырьком, правка кода #7
Вот как я сделала:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void List::Sort()
{
    int i;
    Uzel *p1,*p2;
 
    for(p1 = head; p1; p1 = p1->next)
    {
        for(p2 = head; p2; p2 = p2->next)
        {
            if(p1->data < p2->data)
            {
                i = p1->data;
                p1->data = p2->data;
                p2->data = i;
            }
        }
    }
}
Но второй цикл у меня тоже сначала списка идет, а нужно не сначала. Как это сделать???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2012, 00:09     Сортировка пузырьком, правка кода
Еще ссылки по теме:

C++ Сортировка пузырьком
Сортировка Пузырьком :) C++
C++ Сортировка пузырьком

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
qfisher
30 / 30 / 1
Регистрация: 24.05.2012
Сообщений: 156
09.06.2012, 00:09     Сортировка пузырьком, правка кода #8
Цитата Сообщение от Nastya19kiss Посмотреть сообщение
for(p2 = head; p2; p2 = p2->next)
тут условия нет

Добавлено через 5 минут
p2 = head в цикле заменить на p2=p1

Добавлено через 3 минуты
массив проще чем список для реализации

Добавлено через 2 минуты
вот алгоритм на псевдокоде из википедии
PureBasic
1
2
3
4
5
6
7
8
9
10
 FOR J=1 TO N-1 STEP 1
    F=0
    MIN=J
    FOR I=J TO N-J STEP 1 
       IF Y[I]>Y[I+1] THEN SWAP Y[I],Y[I+1]:F=1
       IF Y[I]<Y[MIN] THEN MIN=I
       NEXT I
    IF F=0 THEN EXIT FOR
    IF MIN<>J THEN SWAP Y[J],Y[MIN]
    NEXT J
Yandex
Объявления
09.06.2012, 00:09     Сортировка пузырьком, правка кода
Ответ Создать тему
Опции темы

Текущее время: 16:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru