powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Список в С.
22 сообщений из 22, страница 1 из 1
Список в С.
    #39184714
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть структура .
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct parent
{
  uint8_t name[40];
  uint32_t a;
  uint32_t b;
  struct parent *next
}parent;


можно организовать список со вставкой и удалением элементов списка.
а если я хочу вставить список в эту структуру. возможно ли такое?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
struct parent
{
  uint8_t name[40];
  uint32_t a;
  uint32_t b;

  тут вставить список

  struct parent *next
}parent;
...
Рейтинг: 0 / 0
Список в С.
    #39184734
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я имею в виду вставить список других элеметов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct child
{
  uint8_t name[40];
  uint32_t a;
  uint32_t b;
  struct child *next
}child;
...
Рейтинг: 0 / 0
Список в С.
    #39184759
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

дерево строишь?
...
Рейтинг: 0 / 0
Список в С.
    #39184765
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct parent
{
  uint8_t name[40];
  uint32_t a;
  uint32_t b;
  struct child *child_list;
  struct parent *next
}parent;


только я не понял зачем вообще struct child идентичная struct parent, можно просто
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct parent
{
  uint8_t name[40];
  uint32_t a;
  uint32_t b;
  struct parent *other_list;
  struct parent *next
}parent;
...
Рейтинг: 0 / 0
Список в С.
    #39184790
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T[src C++]
только я не понял зачем вообще struct child идентичная struct parent, можно просто

это для примера. на самом деле конечно child будет отличный от parent.
...
Рейтинг: 0 / 0
Список в С.
    #39184797
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропилjenya7,

дерево строишь?

вряд ли это дерево. это как есть список контактов в адресной книге и у каждого контакта есть список детей.
...
Рейтинг: 0 / 0
Список в С.
    #39184930
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а вот интересно. при вставке нового элемента он должен быть глобальным? а если его еще нет?
скажем адресная книга.
есть список контактов в адресной книге и у каждого контакта есть список детей - это второй список. но пользователь еще не ввел данные – реально элемента не существует. теперь пользователь ввел данные - я создал элемент (контакт) - но он локальный. куда будет указывать next?
...
Рейтинг: 0 / 0
Список в С.
    #39184938
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что значит "глобальный" и "локальный" ?
...
Рейтинг: 0 / 0
Список в С.
    #39184942
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитай про связные списки
...
Рейтинг: 0 / 0
Список в С.
    #39184965
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TПочитай про связные списки

а можно без malloc? malloc в эмбедед это не хорошо.
...
Рейтинг: 0 / 0
Список в С.
    #39184972
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7а можно без malloc? malloc в эмбедед это не хорошо.
ну будет другая функция выделения памяти.
...
Рейтинг: 0 / 0
Список в С.
    #39184975
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Dima TПочитай про связные списки

а можно без malloc? malloc в эмбедед это не хорошо.
Можно, делай свой менеджер памяти. Например сделай заранее массив с запасом и как-то храни какие ячейки пустые, какие заняты. Как вариант: все в начале заняты и указатель на первый пустой элемент. Все после него пустые. Добавление - легко, при удалении переместить последний на место удаляемого.
...
Рейтинг: 0 / 0
Список в С.
    #39185015
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7пропущено...


а можно без malloc? malloc в эмбедед это не хорошо.
Можно, делай свой менеджер памяти. Например сделай заранее массив с запасом и как-то храни какие ячейки пустые, какие заняты. Как вариант: все в начале заняты и указатель на первый пустой элемент. Все после него пустые. Добавление - легко, при удалении переместить последний на место удаляемого.

это как раз то что нужно. а можно пример?
...
Рейтинг: 0 / 0
Список в С.
    #39185039
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
struct parent my_memory[100]; // массив
int free_num = -1; // номер пустого

// выделение памяти
struct parent* my_malloc() {
 if(free_num < 100) {
    free_num++;
    return  &my_memory[free_num];
 } else {
    return NULL; // нет пустых
 }
}

// освобождение 
void my_free(struct parent* ptr) {
  if(ptr != &my_memory[free_num]) {
     // не последний, переносим в него последний
     *ptr = my_memory[free_num];
     // добавить правку указателей на &my_memory[free_num] из других элементов
  }
  if(free_num >= 0) free_num--;
}
...
Рейтинг: 0 / 0
Список в С.
    #39185043
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуть напутал, последний элемент 99й
Код: plaintext
1.
if(free_num < 99) {
...
Рейтинг: 0 / 0
Список в С.
    #39185059
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут можешь вместо указателя (struct parent*) хранить индекс массива (0,1,2 и т.д.), тогда список целиком можно будет без изменений копировать в другой массив или в файл.
...
Рейтинг: 0 / 0
Список в С.
    #39185082
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TКак-то так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
struct parent my_memory[100]; // массив
int free_num = -1; // номер пустого

// выделение памяти
struct parent* my_malloc() {
 if(free_num < 100) {
    free_num++;
    return  &my_memory[free_num];
 } else {
    return NULL; // нет пустых
 }
}

// освобождение 
void my_free(struct parent* ptr) {
  if(ptr != &my_memory[free_num]) {
     // не последний, переносим в него последний
     *ptr = my_memory[free_num];
     // добавить правку указателей на &my_memory[free_num] из других элементов
  }
  if(free_num >= 0) free_num--;
}


это как раз то что нужно. а вставка и поиск как будут происходить?
...
Рейтинг: 0 / 0
Список в С.
    #39185095
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7это как раз то что нужно. а вставка и поиск как будут происходить?
Как со списком. То что я выше написал - это пример замены штатного malloc(), остальное остается как было.

Использовать как-то так
Код: plaintext
1.
2.
3.
// добавление в список
struct parent* new_node = my_malloc(); // выделение памяти под новый элемент списка
// заполнение *new_node и добавление указателя на new_node в список
...
Рейтинг: 0 / 0
Список в С.
    #39185099
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если я удаляю элемент в середине - что делать? сдвигать все элементы влево?
...
Рейтинг: 0 / 0
Список в С.
    #39185112
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7а если я удаляю элемент в середине - что делать? сдвигать все элементы влево?
Зачем все? Только последний на место удаляемого.

Читай внимательно, я это уже писал. В т.ч. в коде предусмотрел, там только добавить правку ссылки на переносимый элемент из элемента, который на него ссылается и замена ссылки на удаляемый на следующий за ним. Если сделаешь двунаправленный список, то это просто. В однонаправленном - перебором всех элементов.
...
Рейтинг: 0 / 0
Список в С.
    #39185120
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХУ сделай сначала с использованием стандартных malloc()/free(), отлать чтобы нормально работало, затем заменишь на массив с my_malloc()/my_free().
...
Рейтинг: 0 / 0
Список в С.
    #39185175
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
большое спасибо. мне очень нравиться это решение. буду его разрабатывать.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Список в С.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]