Консультация № 109905
17.11.2007, 21:10
0.00 руб.
0 1 1
Помогите пожайлуста с написанием след. функции на С :
1. Написать функцию char isset(node *), определяющую является ли список множеством. Под множеством следует понимать совокупность попарно различных элементов. Множества неупорядоченные. Следует стремиться к минимизации числа операций сравнения.

2. Написать функцию node* list2set(node *), преобразующую список в множество.

3. Написать функцию char equal(node *, node *), определяющую равенство двух множеств, представленных
списками.

4. Написать функцию char issubset(node *, node *), определяющую является ли одно из двух множеств, представленных списками, подмножеством другого.

5. Написать функцию node* sort(node *), упрядочивающую по возрастанию множество, представленное списком.

6. Написать функцию node* insert_ord(node *, int el), вставляющую, элемент в упорядоченный список т.о., чтобы упорядоченность не нарушалась.

7. Написать функцию node* whatsbefore(node*, int el), получающую в качестве параметрa указатель на начало списка и целое число и возвращающую в качестве результата указатель на элемент, предшедствующий элементу, содержащему заданное целое.

Обсуждение

Неизвестный
22.11.2007, 11:10
общий
это ответ
Здравствуйте, Aleha!

См. программу в приложении. Задание ужасно плохо составлено. Многие вещи не оговорены.
Пришлось догадываться о структуре node и о возвращаемых значениях в большинстве функций.
Непонятно, например, что делать со структурой, которую мы удаляем из списка при превращении его в сет.
Непонятно, что надо возвращать, когда не нашли элемента в whatbefore.
Непонятно, как задаётся и гарантируется начало и конец списка.
В моих методах я не использовал никаких проверок на то, что список корректный (все указатели правильные).
Можете, если надо добавить сами.
Всё строилось под Visual C++ .NET 2003.
Ничего не проверял, писал из головы.


Приложение:
struct node{ int value; node *prev; node *next;};// ищем в списке list элемент равный nodenode* find(node *list, int value){ for(; list != NULL && (list->value != value); list = list->next) { } return list;}// удаляем элемент из двусвязного спискаnode *remove(node *n){ node *prev = n->prev; n->prev = NULL; node *next = n->next; n->next = NULL; // Если стоял не в начале списка if(prev) { prev->next = next; } // Если стоял не в конце списка if(next) { next->prev = prev; } return next;}// Вставляет узел между prev и nextnode *insert(node *prev, node *next, node *n){ n->prev = prev; n->next = next; // Если добавляем не в начало списка if(prev != NULL) { prev->next = n; } // Если добавляем не в конец списка if(next != NULL) { next->prev = n; } return n;}// Возвращвет 1, если s - подмножество dchar is_subset(node *s, node *d){ // для каждого элемента первого списка for(; s != NULL; s = s->next) { // ищем равный элемент второго if(find(d, s->value) == NULL) { return 0; // не нашли, т.е. не подмножество } } return 1;}// проверяем если данные уникальныchar isset(node* n){ // для каждого элемента в списке for(; n != NULL; n = n->next) { // ищем равный ему в хвосте списка if(find(n->next, n->value) != NULL) { // если находим, то не set return false; } } return true;}// удаляем повторяющиеся элементыnode* list2set(node* n){ for(; n != NULL; n = n->next) { for(node *next = n->next, *s = n; (s = find(next, n->value)) != NULL; next = remove(s), delete s) { } } return n;}// множества равны, если они подмножества друг другаchar equal(node *s, node *d){ return is_subset(s, d) && is_subset(d, s);}// хотя бы оно из множеств является подмножеством другогоchar issubset(node *s, node *d){ return is_subset(s, d) || is_subset(d, s);}// вставляем в упорядоченный списокnode *insert_ord(node *list, node *n){ // ищем первый узел next, который хранит величину больше нашей // сохраняя в last предыдущий узел, который ещё не был больше for(node *last = NULL, *next = list; next != NULL && (next->value <= n->value); last = next, next = last->next) { } // вставляем наш узел между ними return insert(last, next, n);}// сортировка списка по возрастаниюnode *sort(node *src){ node *dst = NULL; // заводим упорядоченный список while(src != NULL) // пока начальный список не пуст { node *n = src; src = remove(src); // удаляем первый узел из текущего списка insert_ord(dst, n); // вставляем в упорядоченный } return dst;}// ищем узел перед узлом с элементом el// если не находим или находим в начале списка, то возарвщаем NULLnode* whatsbefore(node* list, int el){ node *n = find(list, el); return n ? n->prev : NULL;}
Форма ответа