Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Binjo
4 / 1 / 6
Регистрация: 14.10.2012
Сообщений: 22
#1

Удаление кольцевого списка - никак не удаляется head - C (СИ)

09.06.2014, 01:32. Просмотров 406. Ответов 0
Метки нет (Все метки)

Здравствуйте. Не получается удалить кольцевой список полностью. Никак не удаляется head. В итоге на выводе я вижу 2 символа, а не сообщение о том,что список пустой.MAKENULL отвечает за удаление всего списка.Не подскажите что не так?((
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
//УПОРЯДОЧЕННЫЙ СПИСОК
typedef char atom;//обзовем char атомом
struct List{
     List* next; //указатель на след. элемент
     atom data; //данные типа Atom
};
 
//============================================================================//
//вставка 1 элемента
//принимает ссылку на указатель и данные
//ничего не озвращает
void INSERTNULL(List*& head, atom q){
List *buff = new List;
  buff->data = q; //пишем данные
  buff->next =buff;//указываем сами на себя
  head=buff;//в голову пишем этот элемент
}
//============================================================================//
//функция,вставляющая в конец списка
//принимает ссылку на указатель и данные
//ничего не возвращает
void INSERTLAST(List*& head,atom q){
   List *buff = new List;
    List *i = head;//при помощи i прыгаем и не теряем голову
    do{
        i = i->next; //шагаем до конца
        if (i->data==q){//а если такой элемент уже есть?
            printf("Uzhe est'!\n");//оповестим об этом
            return;}
    }   while (i->next != head);
i->next=buff;//следующий элемент за последним-наш новый элемент
buff->data = q; //пишем в него данные
buff->next=head;//а следующий за ним-голова
}
//============================================================================//
//функция,решающая как надо вести себя со списком
//принимает ссылку на указатель и данные
//ничего не возвращает
void INSERT(List*& head, atom q){
 if (head==NULL)//если список пуст
 {
 INSERTNULL(head,q);
 return;
 }
 INSERTLAST(head,q);//иначе просто в конец
  }
//============================================================================//
//функция,выводящая список
//принимает голову
//ничего не возвращает
void PRINT (List*& head){
    if(head!=NULL){//если списочек есть
    List *i=head;//берем переменную для головы
   do{
        printf("%c",i->data);//выводим элемент
        i=i->next;//шагаем далее
}while(i!=head);//пока снова не придем на глову
printf("\n\n");}
else printf("List is empty\n");
}
//============================================================================//
//функция удаления последнего элемента
//принимает голову 
//ничего не возвращает
void DELETELAST(List*& head){
    List *i=head;//не теряем голову пока что
    List *j=head;//не теряем голову пока что
    do{
        i=i->next;//шагаем далее
    }while(i->next!=head);//идем до удаляемого элемента
      do{
        j=j->next;//шагаем далее
    }while(j->next!=i);//идем до удаляемого элемента
    j->next=head;
    free(i);
   
}
//============================================================================//
//функция удаления первого элемента
//принимает голову 
//ничего не возвращает
void DELETEFIRST(List*& head){
    List *i;//не теряем голову пока что
    List *oldhead;//будем помещать сюда голову,которую удалим
    i = head->next;//в i записываем то,что станет новой головой
    oldhead = head;//записываем старую глоову
    head = i;//теперь головой стало i
    do{
        i=i->next;//шагаем далее
    }while(i->next!=oldhead);//нам нужен бывший элемент head-1
    i->next=head;//пусть теперь он указывает на новую голову
    free(oldhead);//избавляемся от старой головы
}
//============================================================================//
//функция удаления первого элемента
//принимает голову и номер
//ничего не возвращает
void DELETEMIDDLE(List*& head,List *i){
    List *j=head;//не теряем голову пока что
    do{
        j=j->next;//шагаем
    }while(j->next!=i);
    j->next=i->next;
    free(i);
 
}
//============================================================================//
//функция,отвечающая за удаление элемента
//принимает список и значение
//ничего не возвращает
void DELETE (List*& head,atom q){
List *i = head;//не теряем голову
if (head==NULL)//если список пуст
printf ("Nothing to delete\n");
else{
    do{//ищем элемент
        i = i->next; //шагаем
        if(i->data!=q&&i==head){//если не нашли
         printf("Ego tut net\n");//выходим
        return;
                               }
    } while (i->data!=q);
    if (i==head){//если элемент первый
    DELETEFIRST(head);//его и удалим
    return;
}
if(i->next==head){//если последний
DELETELAST(head);
return;
}
DELETEMIDDLE(head,i);//иначе будем удалять где-то в серединке(не в прямом смысле "середина")
    } 
}
//============================================================================//
//функция,показывающая нам минимальный элемент чему равен
//принимает голову 
//ничего не возвращает
void MIN(List*& head){
    if(head!=NULL){
    List* i=head;//дабы голову не терять!
    atom min=head->data;
    do{//пока мы не дойдем до конца
    if(i->data<min)//если текущий элемент еще меньше,то сохраним его
    min=i->data;
        i = i->next; //шагаем вперед
        }while (i!=head);
        printf("%c\n",min);//выводим результат
    }
    else printf("Min=all\n");//если список пустой,то и искать там нечего
}
//============================================================================//
//функция поиска максимального элемента
//принимает голову
//ничего не возвращает
void MAX(List*& head){
    if(head!=NULL){
    List* i=head;//храним голову
    atom max;
   do{//пока не идем до конца
    if(i->data>max)//если текущий больше нашего
    max=i->data;
        i = i->next; //шагаем
        } while (i!=head);
        printf("%c\n",max);//выводим 
    }
    else printf("Max=all\n");//если список пуст,то и искать там нечего
}
//============================================================================//
//принадлежит ли элемент конкретному множеству
//принимает голову и элемент
//возвращает atom(char)
atom MEMBER(List*& head,atom q){
    if(head!=NULL){
    List* i=head;//не теряем голову
    do{//пока не дойдем до конца
    if(i->data==q)//если нашли
    {
        printf("YES\n");//оповестим
        return i->data;}//вернем то, что повторилось(необходимо в difference)
        i=i->next;//шагаем
    }while (i!=head);
    printf("NO\n");//если не нашли,то сообщим
}
else printf("NULL LIST\n");//если пустой,то и искать нечего
} 
//============================================================================//
//функция очистки(удаление)списка
//принимает голову
//ничего не возвращает
void MAKENULL(List*& head){
    List *i=head;//не теряем голову пока что
    do{
        List *temp=i->next;
        i->next=i->next->next;
     free(temp);
}while(i!=head);
    DELETE(head,head->data);
}
int main()
{
   List *list1=NULL;//первый список
   List *list2=NULL;//второй список
   List *list3=NULL;//третий список
  // INSERT (list1,'7');
   
   INSERT (list1,'5');
  // INSERT (list1,'8');
   PRINT(list1);
  // DELETE(list1,'6');
  //  PRINT(list1);
   //printf("%c",list1->data);
  // printf("%c",list1->next->data);
  //MIN(list1);
  //MAX(list1);
  //MEMBER(list1,'3');
  MAKENULL(list1);
  PRINT(list1);
   system("pause");
   return 0;
}
//UPD
//list*& 
//нужно по  хорошему каждый раз передавать указатель на укзатель и разыменовывать.но зачем?проще передать ссылку на указатель

http://www.cyberforum.ru/c-beginners/thread71067.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2014, 01:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Удаление кольцевого списка - никак не удаляется head (C (СИ)):

Никак не могу создать HTML страницу с HEAD и BODY
Никак не могу создать создать HTML страницу с HEAD и BODY :wall:.Прмогите...

Никак не удаляется Nero 7
Хотел установить эту программу, мало того что она не установилась (не идет),...

Никак не удаляется MPC Cleaner
без моего ведома установилось на комп MPC Cleaner и другое вредоносное ПО. С...

Шаблон однонаправленного кольцевого списка
Доброго времени суток. Мне необходимо написать шаблон однонаправленного...

Сортировка слиянием кольцевого списка
Есть класс двусвязного кольцевого списка и итератор к нему-шаблоны. не могу...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2014, 01:32
Привет! Вот еще темы с решениями:

Реализация кольцевого списка на СТЛ
Добрый день! Появилось несколько вопросов в ходе выполнения задания. Само...

Сортировка кольцевого двусвязного списка (пузырьковая)
Доброго дня! Помогите пожалуйста разобраться с сортировкой кольцевого...

Нахождение и изменение элемента двунаправленного кольцевого списка
помогите дополнить код,что бы можно было найти элемент введенный с клавиатуры и...

Консольный интерфейс для кольцевого односвязного списка
http://ubuntuone.com/6wKtCh5iViDl0xyPSRc3LC вот тут все файлы проги.. 7.cpp...


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

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

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