С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 04.11.2016
Сообщений: 35
1

Динамические структуры данных. Создание списков

01.03.2017, 19:51. Показов 1745. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно задание: В проекте создать однонаправленный список. Разбить список на два. Точка разрыва - указанный элемент.
Вообще не могу понять как это работает, пропустил много лекций из-за болезни, теперь не могу вникнуть. Может кто-то сделает наброски(ну или вовсе скинет решение ) Буду премного благодарен, спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Блог
01.03.2017, 19:51
Ответы с готовыми решениями:

Динамические структуры данных: деревья
Задание Составить программу на языке Си для построения и обработки дерева общего вида или...

Задача на Указатели и динамические структуры данных
Дана задача: Записи содержат фамилию, год рождения. Добавлять новые записи так, чтобы список был...

Динамические структуры данных. Ошибки в функциях
Как я понял я запутался в указателях на типы данных при объявлении, или вызове функции. Помогите...

Загвоздка с деревом, динамические структуры данных
Всем доброго времени суток. Столкнулся с такой проблемой. В языке С новичок и нужно написать...

12
1513 / 924 / 257
Регистрация: 30.06.2015
Сообщений: 4,847
Записей в блоге: 54
02.03.2017, 10:43 2
Цитата Сообщение от EnjoyC Посмотреть сообщение
В проекте создать однонаправленный список. Разбить список на два. Точка разрыва - указанный элемент.
Вот на днях баловался. Неуверен что всё правильно, так как делал по своему, но вроде работает:
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
#include <stdio.h>
#include <stdlib.h>
 
typedef struct list
{
    int data;
    struct list *next;
} List;
 
List * InitList( void )
{
    List *u1 = (List*)malloc(sizeof(List));
    if(u1==NULL)return NULL;
    u1->next=NULL;
    return u1;
}
List * InsertInList(List *u, int a)
{
    List *uk;
    uk=u;
    uk->data=a;
    uk->next=(List*)malloc(sizeof(List));
    uk=uk->next;
    uk->next=NULL;
    return uk;
}
 
void ListClear(List* u)
{
    List* uk;
    while(u!=NULL)
    {
        uk=u;
        u=u->next;
        free(uk);
    }
}
 
void PrintList(List * u)
{
    List* uk=u;
    while(uk->next!=NULL)
    {
        printf("%d\n", uk->data);
        uk=uk->next;
    }
}
 
List* FindInList(List * u, int a)
{
    List *uk=u;
    while(uk->next!=NULL)
    {
        if(uk->data==a)
            return uk;
        uk=uk->next;
    }
    return NULL;
}
 
int main(void)
{
    List *x,*myList = NULL;
    //int i;
    myList=InitList();
    x=myList;
    //for(i=0; i<=5; ++i)
    
        x=InsertInList(x, 1);
        x=InsertInList(x, 2);
        x=InsertInList(x, 3);
        x=InsertInList(x, 4);
        x=InsertInList(x, 5);
PrintList(myList);
 
printf("\n%d\n", FindInList(myList, 3)->data);
    
ListClear(myList);
 
    return 0;
}
2
2 / 2 / 0
Регистрация: 04.11.2016
Сообщений: 35
02.03.2017, 17:47  [ТС] 3
Список вроде разобрался как создавать. Но вот как разбить на 2 - не понял. У вас этого в коде тоже не нашел. Просто выводит число из функции findinlist (не совсем понял как работает)
0
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
02.03.2017, 18:23 4
Цитата Сообщение от EnjoyC Посмотреть сообщение
Просто выводит число из функции findinlist (не совсем понял как работает)
В структуре list есть переменная data типа int. В функции перебирается каждый объект из списка, сравнивая data текущего объекта с числом, переданным как аргумент функции. Возвращает объект, data которого равна этому числу
0
2 / 2 / 0
Регистрация: 04.11.2016
Сообщений: 35
02.03.2017, 18:28  [ТС] 5
Цитата Сообщение от Captain Maxee Посмотреть сообщение
В структуре list есть переменная data типа int. В функции перебирается каждый объект из списка, сравнивая data текущего объекта с числом, переданным как аргумент функции. Возвращает объект, data которого равна этому числу
Спасибо, понял. Жаль это никак не поможет мне в решении моего задания
0
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
02.03.2017, 18:35 6
Цитата Сообщение от EnjoyC Посмотреть сообщение
Но вот как разбить на 2 - не понял.
Это, наверное, означает, из 1 списка сделать 2.

В функции: находите кол-во объектов в списке, делите это число на 2. В последнем объекте первой половины, присваиваете next значение nullptr, а возвращаете из функции первый объект второй половины, присваивая его указателю на тип List.
Я бы сделал так Реализовать бы это еще...

Добавлено через 47 секунд
Если не помогут, через 2 часа попробую помочь)
0
2 / 2 / 0
Регистрация: 04.11.2016
Сообщений: 35
02.03.2017, 19:06  [ТС] 7
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Это, наверное, означает, из 1 списка сделать 2.

В функции: находите кол-во объектов в списке, делите это число на 2. В последнем объекте первой половины, присваиваете next значение nullptr, а возвращаете из функции первый объект второй половины, присваивая его указателю на тип List.
Я бы сделал так Реализовать бы это еще...

Добавлено через 47 секунд
Если не помогут, через 2 часа попробую помочь)
Чувствую себя, мягко говоря, тупым. У меня просто в голове не укладывается как с ними можно работать то
С массивами все ясно и просто - игра с индексами.
В общем вот что я написал ( создание списка ). Разбить на 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
#include <stdio.h> 
#include <stdlib.h> 
 
typedef struct Node {
    int val;
    struct Node* next;
} Node;
 
void PushList(Node** head, int value) {
    Node* tmp = (Node*)malloc(sizeof(Node));
    tmp->val = value;
    tmp->next = (*head);
    (*head) = tmp;
}
 
void PrintList(const Node* head) {
    while (head != NULL) {
        printf("%d ", head->val);
        head = head->next;
    }
    printf("\n");
}
 
int main() {
    int i;
    Node* head = NULL;
    for (i = 1; i <= 10; i++) 
    {
        PushList(&head, i);
    }
    PrintList(head);
    printf("Enter a number of element, where you want to break list.");
    scanf("%d", &i);
    // Дальше...?
    return 0;
}
0
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
02.03.2017, 20:42 8
Лучший ответ Сообщение было отмечено EnjoyC как решение

Решение

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
List* halfsplit(List* _Element)
// _Element -- первый первый элемент в списке (первоначальный объект, голова)
{
    List* Element = _Element;  // Здесь понятно
    unsigned int Amount = 1;  // Сюда будем сохранять кол-во объектов в списке. 1 стоит уже, ибо 1 объект уже передали.
 
    while (Element->next)
    // Пока у нас есть элементы, увеличиваем Amount
    {
        ++Amount;
        Element = Element->next;
    }
 
    Amount /= 2;  // Делим кол-во объектов на 2 и сохраняем результат
    Element = _Element;  // Идем в начало
 
 
    for (unsigned int i = 1; i < Amount; ++i)  // А здесь мы идем к последнему элементу первой половины. Если 4 объекта, то к 2. Если 10, то к 5. Если 13, то к 6.
        Element = Element->next;
    List* NewElement = Element->next;  // Новому элементу присваиваем первый элемент второй половины. Если 4 объекта -- 3 объект и т.д.
    Element->next = NULL;  // Последнему объекту первой половины присваиваем NULL
 
    return NewElement;  // Возвращаем первый элемент второй половины
}
А вот так юзать:
C
1
List* NewElement = halfsplit(FirstElement);
0
2 / 2 / 0
Регистрация: 04.11.2016
Сообщений: 35
02.03.2017, 21:01  [ТС] 9
Либо я не правильно понял задание, но нужно из одного списка получить два, так же? По УКАЗОНОМУ элементу. Я так понимаю что мы вводим элемент, потом функция из 1 структуры(начальной) копирует элементы в другую, как только дошли до указанного елемента то останавливаемся. Вот и получаем 2 списка. Но вот как реализовать - не знаю.
P.S Как воспользоваться вашей функцией так и не понял, какой же я тупой xD
0
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
02.03.2017, 21:09 10
Лучший ответ Сообщение было отмечено EnjoyC как решение

Решение

List на Node поменяй, а FirstElement это у тебя head.
Ну и еще там проверочки дописать нужно...
Эту в самом начале:
C
1
if (!_Element) return NULL;
А эту после цикла while():
C
1
if (Amount == 1) return NULL;
Добавлено через 2 минуты
Цитата Сообщение от EnjoyC Посмотреть сообщение
P.S Как воспользоваться вашей функцией так и не понял
Функция делит переданный список наполовину. Последний объект первой половины указывает на NULL. Возвращает первый объект второй половины

Добавлено через 4 минуты
То бишь: у тебя есть список, в котором 4 объекта. Ты хочешь поделить его на 2 списка.
Создаешь указатель на тип данных (на тот, которого типа твои объекты) и присваиваешь ему возвращаемое значение из функции.
У тебя после
Цитата Сообщение от EnjoyC Посмотреть сообщение
C
1
// Дальше...?
Напиши так:
C
1
2
3
4
Node* NewElement = halfsplit(head);
PrintList(head);
printf('\n');
PrintList(NewElement);
1
2 / 2 / 0
Регистрация: 04.11.2016
Сообщений: 35
02.03.2017, 21:14  [ТС] 11
Господи, алилуя, заработало

Добавлено через 52 секунды
Спасибо вам, огромное. Ибо я бы такого как я - наврядли вытерпел бы) До этого все темы понимал легко, а тут пропустил 2 лекции и все - тупняк. Ни книги ни форумы не помогали. Сейчас буду сидеть разбираться по пунктам в коде. Еще раз спасибо )
1
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
02.03.2017, 21:16 12
Цитата Сообщение от EnjoyC Посмотреть сообщение
По УКАЗОНОМУ элементу.
Тогда вот это все убираем:
Цитата Сообщение от Captain Maxee Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
unsigned int Amount = 1; // Сюда будем сохранять кол-во объектов в списке. 1 стоит уже, ибо 1 объект уже передали.
while (Element->next)
  // Пока у нас есть элементы, увеличиваем Amount
  {
    ++Amount;
    Element = Element->next;
  }
Amount /= 2; // Делим кол-во объектов на 2 и сохраняем результат
  Element = _Element; // Идем в начало
А здесь:
Цитата Сообщение от EnjoyC Посмотреть сообщение
C
1
for (unsigned int i = 1; i < Amount; ++i)
Вместо Amount, ставим номер УКАЗАННОГО элемента, который передается аргументом функции.

Добавлено через 59 секунд
Цитата Сообщение от EnjoyC Посмотреть сообщение
Господи, алилуя, заработало

Добавлено через 52 секунды
Спасибо вам, огромное. Ибо я бы такого как я - наврядли вытерпел бы) До этого все темы понимал легко, а тут пропустил 2 лекции и все - тупняк. Ни книги ни форумы не помогали. Сейчас буду сидеть разбираться по пунктам в коде. Еще раз спасибо )
Все когда-то начинали
1
2 / 2 / 0
Регистрация: 04.11.2016
Сообщений: 35
02.03.2017, 21:19  [ТС] 13
Сейчас переделаю)

Добавлено через 1 минуту
Сделал, все работает)
1
02.03.2017, 21:19
BasicMan
Эксперт
19315 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
Блог
02.03.2017, 21:19
Помогаю со студенческими работами здесь

Программирование списков. Динамические структуры данных.
Задание. Структура односвязного списка - 'стек' Тип информационного поля - вещественный Поиск:...

Динамические структуры данных. Программа ввода в структуры и вывода информации из неё.
Автоматизированная информационная система на железнодорожном вокзале содержит сведения об...

Динамические структуры данных, списковые структуры (надо разобраться что делает программа)
дана программа, надо помочь выяснить что в ней делает каждая подпрограмма unit Unit6; ...

Динамические структуры данных. Организация данных в списковые структуры
Написать программу вставки нового элемента в список за некоторым заданным по- рядковым номером...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru