Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Nastya19kiss
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
#1

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

07.06.2012, 18:44. Просмотров 986. Ответов 7
Метки нет (Все метки)

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");
  }
Хочу отсортировать список пузырьком по возрастанию. но видимо в коду ошибка, помогите с сортировкой пожалуйста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2012, 18:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка пузырьком, правка кода (C++):

Сортировка пузырьком - C++
Задача: При диспансеризации школьников определялись их рост и вес. В результате были получены массивы значений роста R(n) и веса W(n)....

сортировка пузырьком - C++
Вечер добрый! Задача проста: отсортировать сначала по зп, если < 400, то в 1ый список, а если больше, то во второй, отсортировав по...

Сортировка пузырьком - C++
Требуется отсортировать пузырьком элементы массива, которые находятся на непарных позициях.

Сортировка пузырьком - C++
#include <iostream> #include <iomanip> #include <ctime> using namespace std; void Sort(int *, int); const int n = 8; int ...

Сортировка пузырьком - C++
вот написала программу но не работает :( #include <iostream> #include <conio.h> #include <ctime> #include <cstdlib> using...

Сортировка пузырьком - C++
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #define N 9 ...

7
qfisher
31 / 31 / 1
Регистрация: 24.05.2012
Сообщений: 156
07.06.2012, 18:51 #2
Алгоритмы сортировок
0
Nastya19kiss
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
07.06.2012, 19:02  [ТС] #3
Я это все читала. я конкретно не могу со связанным списком реализовать пузырек. Точнее я реализовала но неправильно(((щ
0
qfisher
31 / 31 / 1
Регистрация: 24.05.2012
Сообщений: 156
07.06.2012, 19:51 #4
Кидай полное описание классов Uzel и List
и конкретно где ошибка
0
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 минуту
Код осуществляет создание, поиск элемента указанного, удаление указанного элемента и вставку элемента
0
qfisher
31 / 31 / 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 - количество элементов, тогда второй цикл можно будет сделать
1
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;
            }
        }
    }
}
Но второй цикл у меня тоже сначала списка идет, а нужно не сначала. Как это сделать???
0
qfisher
31 / 31 / 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
0
09.06.2012, 00:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2012, 00:09
Привет! Вот еще темы с ответами:

Сортировка пузырьком - C++
Не понимаю, в чем проблема при сортировке пузырьком. сортирую структуру: for (int i=0; i&lt;4; i++) { for (int j=n-1; j&gt;i; j--)...

Сортировка пузырьком - C++
Всем доброго времени суток. Помогите пожалуйста написать программу сортировки пузырьком в соответствии с данной блок-схемой.

сортировка пузырьком - C++
#include &lt;iostream&gt; using namespace std; void main() { const n=4; int a,i,j,buffer; for(i=0;i&lt;n;i++) cin&gt;&gt;a; for (i=0;...

Сортировка Пузырьком :) - C++
Привет, ребята :) Вообщем, наткнулся на написание программы с использованием сортировки пузырьком. Никогда не использовал :) Часть кода...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.