Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/2: Рейтинг темы: голосов - 2, средняя оценка - 5.00
TantyanaVoid
0 / 0 / 0
Регистрация: 25.06.2016
Сообщений: 4
1

Односвязный список: удаление элементов,заканчивающихся на 5

25.06.2016, 22:24. Просмотров 419. Ответов 5
Метки нет (Все метки)

Есть вот такая задача:
Создать список из случайных целых чисел и удалить элементы, заканчивающиеся на цифру 5.
Язык Си.Реализовать стеком или очередью.Первую часть сделала на основе данной на лекциях теории, а вот насчет того,как извлечь именно значение из списка, проверить делиться ли оно на 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
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <process.h>
#include<malloc.h>
#include <Windows.h>
struct Stack {
    int info;
    Stack* next;
};
 
void createStack(Stack **t, Stack **begin);
void addElementInStack(Stack **t, Stack **begin, int info);
void viewStack(Stack *begin);
void runTask(Stack **begin);
void deleteStack(Stack **begin);
 
 
void main(void) {
    setlocale(LC_ALL, "Russian");
    printf_s("Task one.\n\n");
    _getch();
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    Stack *begin, *t;//вершина и текущий элемент стека
    begin = NULL;//пустой стек
    t = NULL;
 
    int subTask;
    while (true) {
        system("cls");
        printf_s("Choose 1 for creating stack\nChoose 2 for adding element in a stack\nChoose 3 for viewing stack\nChoose 4 for running task\nChoose 0 finishing\n");
        fflush(stdin);
        scanf_s("%d", &subTask);
 
        switch (subTask) {
        case 1:
            createStack(&t, &begin);//создание 
            break;
        case 2:
            int info;
            printf_s("Enter element: \n");
            scanf_s("%d", &info);
            addElementInStack(&t, &begin, info);//добавим в стек элемент
            _getch();
            break;
        case 3:
            viewStack(begin);//посмотреть
            break;
        case 4:
            runTask(&begin);//задача
            break;
        case 0:
            printf_s("Work is finished\n");
            deleteStack(&begin);
            t = NULL;
            if (begin == NULL) {
                puts("Memory is Freed!");
            }
            _getch();
            break;
        default:
            printf_s("No!\n");
            _getch();
            break;
        }
    }
}
 
void createStack(Stack **t, Stack **begin) {
    *t = new Stack;
    if (*t != NULL) {
        printf_s("Stack is already created!");//есть элементы
        _getch();
        return;
    }
    printf_s("Creating Stack: \n");
    int count;
    printf_s("Enter number of elements in your initial stack: \n");
    scanf_s("%d", &count);
    for (int i = 0; i < count; i++) {
        addElementInStack(t, begin, i);
    }
    _getch();
}
 
void addElementInStack(Stack **t, Stack **begin, int info) {
    printf_s("Adding element: %d\n", info);
 
    if (*t == NULL) {
        *t = new Stack;
        (*t)->info = info;
        (*t)->next = *begin;
        *begin = *t;
    }
    else {
        *t = new Stack;
        (*t)->info = info;
        (*t)->next = *begin;
        *begin = *t;
    }
 
}
void viewStack(Stack *begin) {
    printf_s("Viewing Stack: \n");
 
    Stack *t = begin;
    if (begin == NULL){
        printf_s("Stack is empty! \n");
        _getch();
        return;
    }
    while (t != NULL){
        printf_s("Element: %d\n", t->info);
        t = t->next;
    }
 
    _getch();
}


Это все,что у меня есть...

Добавлено через 8 минут
вот как-то перебрать именно значения из ячеек и как-то в такие рамки записать.
...%5=0&&...%2!=0
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2016, 22:24
Ответы с готовыми решениями:

Односвязный список: просмотр, поиск, вставка и удаление элементов
Нужно создать односвязный список типа общего вида, элементы которого описываются следующим образом:...

Односвязный список, вывод элементов не работает
ЯЗЫК СИ. ПОМОГИТЕ! Что надо поменять??? На ВХОД Длина списка и потом сами элементы списка. ВЫХОД...

Переделать двусвязный список в односвязный список
//--------------------------------------------------------------------------- #include &lt;stdio.h&gt;...

Двунаправленный список. Удаление элементов с одинаковыми соседями
Собственно вот такое задание нужно выполнить. Нашел код, который вроде бы работает, но не во всех...

Инициализация, добавление и удаление элементов в СТЕКЕ через связный список
День добрый, нужна помощь со стеками. Передо мною стоит задача: 1) Инициализировать СТЕК через...

5
easybudda
Модератор
Эксперт CЭксперт С++
10209 / 6108 / 1536
Регистрация: 25.07.2009
Сообщений: 11,609
25.06.2016, 23:14 2
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
 
typedef struct LISTNODE {
    int data;
    struct LISTNODE * next;
} Node, *List;
 
Node * node_new(const int data) {
    Node * n = (Node*)malloc(sizeof(Node));
    if ( ! n )
        return NULL;
    
    n->data = data;
    n->next = NULL;
    
    return n;
}
 
Node * node_free(Node * n) {
    Node * next = n->next;
    
    free(n);
    
    return next;
}
 
List list_add(List list, const int d) {
    Node * pN = node_new(d);
    assert(pN);
    
    if ( ! list )
        return pN;
    else {
        Node * current = list;
        
        while ( current->next )
            current = current->next;
        
        current->next = pN;
        
        return list;
    }
}
 
void list_free(List list) {
    while ( (list = node_free(list)) != NULL )
        ;
}
 
int list_dump(List list, FILE * fout, const char * sep) {
    for ( ; list; list = list->next )
        if ( fprintf(fout, "%d%s", list->data, sep) == EOF )
            return -1;
    
    return 0;
}
 
List list_remove_if(List list, int (*testfunc)(int)) {
    Node * node;
    
    while ( list && testfunc(list->data) )
        list = node_free(list);
    
    for ( node = list; node; node = node->next )
        while ( node->next && testfunc(node->next->data) )
            node->next = node_free(node->next);
    
    return list;
}
 
/************************************************************/
 
#define MIN_VALUE (-99)
#define MAX_VALUE (99)
#define BOUNDED_RAND() ( rand() % (MAX_VALUE - MIN_VALUE + 1) + MIN_VALUE )
 
int last5(int n) {
    return abs(n % 10) == 5;
}
 
int main(void) {
    unsigned n;
    
    srand(time(NULL));
    
    while ( printf("Number of elements: ") && scanf("%u", &n) == 1 ) {
        List list = NULL;
        
        while ( n-- )
            list = list_add(list, BOUNDED_RAND());
        
        printf("All values:\n");
        list_dump(list, stdout, " ");
        
        list = list_remove_if(list, last5);
        
        if ( ! list )
            printf("\nAll values was removed!\n");
        else {
            printf("\nWithout values that ends with 5:\n");
            list_dump(list, stdout, " ");
            printf("\n");
        
            list_free(list);
        }
    }
    
    return 0;
}
0
TantyanaVoid
0 / 0 / 0
Регистрация: 25.06.2016
Сообщений: 4
26.06.2016, 21:29  [ТС] 3
разве это стек?
спасибо конечно,но не помогли особо ничем.
0
easybudda
Модератор
Эксперт CЭксперт С++
10209 / 6108 / 1536
Регистрация: 25.07.2009
Сообщений: 11,609
26.06.2016, 22:02 4
Цитата Сообщение от TantyanaVoid Посмотреть сообщение
разве это стек?
Нет, это решение задачи
Цитата Сообщение от TantyanaVoid Посмотреть сообщение
Создать список из случайных целых чисел и удалить элементы, заканчивающиеся на цифру 5.
Собственно односвязный список здесь и создаётся. А если нужен стек или очередь - две функции дописать. Ну раз уж
Цитата Сообщение от TantyanaVoid Посмотреть сообщение
не помогли особо ничем
ждите, когда помогут.
0
TantyanaVoid
0 / 0 / 0
Регистрация: 25.06.2016
Сообщений: 4
27.06.2016, 00:56  [ТС] 5
Реализовать стеком или очередью-это указано в самом начале моей просьбы.
Если бы задача стояла абы решить,то я бы через динамический массив с легкостью реализовала этот список.
И я скинула код,где стек уже создан, просматривается.Моя просьба в том,как теперь просматривая по очереди эти элементы стека,ненужные сразу выкидывать,нужные оставлять.И суть про переустановку указателей я как бы знаю,прошу именно синтаксис уточнить...Так как не могу найти примеров вообще!
мне не нужно решение задачи заново...просто механизм удаления ненужного элемента,больше ничего.

Добавлено через 5 минут
последняя функции тоже в наличии

C++
1
2
3
4
5
6
7
void deleteStack(Stack **begin){
    Stack* t;
    while (*begin != NULL) {
        t = *begin;
        *begin = (*begin)->next;
        delete(t);
    }


только вот это
void runTask(Stack **begin);

не обязательно мое решать,просто пример удаления ненужных элементов
0
TantyanaVoid
0 / 0 / 0
Регистрация: 25.06.2016
Сообщений: 4
29.06.2016, 11:50  [ТС] 6
Вот такое решение в итоге получилось, может конечно не совсем идеальное,потому как если указатель стоит на удаляемом элементе,как с предыдущего(от удаляемого) на следующий (от удаляемого) перекинуть указатель я так и не придумала и не нашла.
Если бы в односвязном можно было вернуться на предыдущий элемент,может все было бы по-другому....В общем надеюсь кому-нибудь пригодится:
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <math.h>
#include <process.h>
#include <string.h>
#include <ctype.h> //для работы с символьными данными
#include <stdlib.h> //библиотека утилит общего назначения
#include <malloc.h>

struct Stack
{
int info;
Stack *next;
};

void push(Stack**, int);
void init(Stack**, Stack**);
void print(Stack*);
void free_mem(Stack**);

int main()
{
setlocale(LC_ALL, "Russian");

Stack *begin_per = NULL;
Stack *begin_vtor = NULL;

while (1)
{
int menu;
printf("1 - Создать элемент списка\n");
printf("2 - Просмотреть списки\n");
printf("3 - Очистить списки\n");
printf("4 - Выход\n\n");
printf("Выберите пункт меню: ");
scanf_s("%d", &menu);

switch (menu)
{
case 1: init(&begin_per, &begin_vtor); break;
case 2:
system("cls");
printf("Список изначальный:\n");
print(begin_per);
printf("Список конечный:\n");
print(begin_vtor);
break;
case 3:
free_mem(&begin_per);
free_mem(&begin_vtor);
system("cls"); break;
case 4: exit(0);
default:
system("cls");
printf("Неверный пункт. Повторите ввод.\n\n");
}
}

free_mem(&begin_per);
free_mem(&begin_vtor);
_getch(); return 0;
}

void push(Stack **begin, int number)
{
Stack *elem = new Stack;
elem->info = number;
elem->next = *begin;
*begin = elem;
}

void init(Stack **begin_per, Stack **begin_vtor)
{
int number, a = 1;
system("cls");

while (a)
{
printf("Введите число для эл-та списка: ");
scanf_s("%d", &number);
push(*(&begin_per), number);
if (number%10!=5)
push(*(&begin_vtor), number);
printf("Продолжить заполнять список?(Да - 1 / Нет - 0): ");
scanf_s("%d", &a);
}
system("cls");
}

void print(Stack *begin)
{
while (begin)
{
printf("%d --> ", begin->info);
begin = begin->next;
}
printf("NULL\n\n");
}

void free_mem(Stack **begin)
{
if (*begin == NULL) return;
Stack *p;
while (*begin)
{
p = *begin;
*begin = (*begin)->next;
delete p;
}
}
0
29.06.2016, 11:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2016, 11:50

Односвязный список
Вопрос может не по теме и не для форума, но я задам. Решил написать на СИ библиотеку для связного...

Односвязный список, дерево
Разработать программу, формирующую динамическую структуру данных для хранения генеалогического...

Односвязный список и файл
Всем привет. При написании программы реализующей создание записей о заказчиках (использую...


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

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

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