0 / 0 / 0
Регистрация: 12.02.2019
Сообщений: 2
1

Удаление текущего элемента из односвязного списка

12.02.2019, 07:50. Показов 3798. Ответов 2

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Возникла такая проблема. В интернете везде удаление элемента из односвязного списка (не обязательно первого или последнего) происходит по индексу. Проблема в том, что у меня есть какой-то определенный критерий (а именно - время). И когда время заканчивается у определенного элемента из списка, то мы его выбрасываем. Для того, чтобы узнать время - мы проходим по всему списку, изменяя параметр current. И вот мы нашли наш current, который нужно убрать из списка, но для того, чтоб предыдущему элементу из списка изменить указатель next, нужно снова прогнать весь список. Задача стоит в том, чтоб эти 2 прохода заменить на один. Пытался просто изменять значения текущего элемента (вместо присваивания памяти) - не вышло. Попробовал добавить в структуры указатели на prev - тоже чего-то не выходит. Видимо где-то косячу. Помогите решить проблему.

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
// Поиск элемента
drivers_current = drivers_head;
while(drivers_current != NULL)
{
    if(drivers_current->when <= time(0))
    {
        printf("Водитель %s уехал\n", drivers_current->id);
 
        len = sprintf(message, END_MESSAGE_DRIVER);
        send_message(drivers_current->socket, atoi(drivers_current->id), message, len+1);
        if(drivers_current != drivers_head)
        {
            drivers_current = drivers_current->prev;
        }
        if(drivers_current != drivers_head)
        {
            drivers_delete(&drivers_current, &(drivers_current->next));
        }
        else
        {
            drivers_delete(NULL, &drivers_head);
        }
    }
    if(drivers_current != NULL)
    {
        drivers_current = drivers_current->next;
    }
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Функция удаления из списка
drivers_t *drivers_delete(drivers_t **drivers_head, drivers_t **drivers_current)
{
    drivers_t *delete = *drivers_current;
    *drivers_current = delete->next;
    if(delete->next != NULL)
    {
        (*drivers_current)->next->prev = *drivers_head;
    }
    if(close(delete->socket)<0)
    {
        printf("close socket fail\n");
    }
    free(delete->passenger_id);
    free(delete);
}
Добавлено через 21 минуту
Вот так добавляю новые элементы в список
C
1
2
3
4
5
6
7
8
9
10
11
12
13
drivers_t* new_node = malloc(sizeof(drivers_t));
if(!new_node)
{
    error_with_exit("Не удалось выделить память для нового водителя");
}
// Здесь присваиваются нужные данные к элементу
new_node->next = *drivers_head;
new_node->prev = NULL;
if(*drivers_head != NULL)
{
    (*drivers_head)->prev = new_node;
}
*drivers_head = new_node;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2019, 07:50
Ответы с готовыми решениями:

Удаление элемента из односвязного списка
помогите, пжлста, уже мучаюсь несколько дней, нужна незамысловатая функция,которая удаляет...

Удаление элемента из односвязного списка
Почему не работает функция удаления идентификатора? Как ее можно переделать? #include&quot;stdafx.h&quot;...

Удаление элемента из односвязного списка
Есть односвязный список из 50 целых случайных неуникальных чисел, допустим от 1 до 1000 вида:...

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

2
0 / 0 / 0
Регистрация: 12.02.2019
Сообщений: 2
18.02.2019, 14:02  [ТС] 2
Помощи так и не нашел. Пришлось реализовать через двусвязный список.
0
10 / 7 / 3
Регистрация: 22.10.2018
Сообщений: 28
Записей в блоге: 1
18.02.2019, 21:01 3
serega-dizzy, в голову пришло только использовать два указателя. Возможно, это глупое решение...

Добавлено через 30 минут
Что-то типа этого:
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
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
 
typedef struct Node {
    int data; //Будет играть роль вашего current, так как мне лень менять код
    struct Node* next;
} Node;
 
 
Node* list = NULL;
 
 
Node* GetNewNode(int data)
{
    Node* newNode = (Node*)(malloc(sizeof(Node)));
    if (newNode == 0)
        return 0;
 
    newNode->data = data;
    newNode->next = 0;
 
    return newNode;
}
 
 
void Add(int data)
{
    if (list == 0)
        list = GetNewNode(data);
    else {
        Node* ptr = list;
        while (ptr->next != 0)
            ptr = ptr->next;
        ptr->next = GetNewNode(data);
    }
}
 
/*
Может быть мусорная идея, но попрую симулировать работу вашей программы
 
Проходим весь список и выбираем из него элементы, услвоие в current соотвествует вашим требованиям
*/
 
void Walkthrough()
{
    if (list == 0)
        return;
 
    if (list->next == 0) {
        if (list->data == 0) {
            free(list);
            list = 0;
            return;
        }
        else
            list->data--;
    }
 
    Node* ptr = list->next;
    Node* prev = list;
 
    while (ptr != 0)
    {
        if (ptr->data == 0) {
            prev->next = ptr->next;
            free(ptr);
            ptr = prev->next;
        }
        else {
            ptr->data--;
 
            prev = ptr;
            ptr = prev->next;
        }
    }
}
 
 
int main(int argc, char** argv)
{
    srand((unsigned int)(time(NULL)));
 
    for (int i = 0; i < 10; i++)
        Add(0 + rand() % 25);
 
    Node* ptr = list;
 
    for (; ptr != 0; ptr = ptr->next)
        printf("%d ", ptr->data);
    printf("\n");
 
    //Будем повторять пока список не будет пустым
    for (int i = 1; list; i++)
    {
        Walkthrough();
 
        printf("Step %d: ", i);
        for (ptr = list; ptr != 0; ptr = ptr->next)
            printf("%d ", ptr->data);
        printf("\n");
    }
 
    return 0;
}
Добавлено через 13 минут
В конец Walkthrough Нужно добавить это. Хотел проверить код на возможную утечку памяти, но у меня отвалились diagnostic tools?

C
1
2
3
4
    if (prev == list) {
        free(list);
        list = 0;
    }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2019, 21:01
Помогаю со студенческими работами здесь

Удаление всех элементов односвязного списка
есть односвязный список из struct el{ int val; struct el* next; }; причем у...

Удаление узла из односвязного списка. + Сортировка
Уважаемые, форумчане! Помогите разобраться с работой функции void DeleteNodeByIndex(NODE *head,int...

Удаление элемента из односвязного списка
Здравствуйте. Делаю односвязный список. Добавил методы Add и Print, но вот метод Delete вылетает. ...

Удаление элемента односвязного списка
Здравствуйте. Написал вот такой код. В программе происходит создание списка, вывод его на экран, а...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru