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

Добавление элемента в список

21.12.2009, 02:35. Просмотров 7042. Ответов 5
Метки нет (Все метки)

Совершенно не понимаю списки. Теория, независимо от количества, в практику ни в какую не переходит. Задача, которую решаю, в интернете вроде бы есть решенная, но тот код я понять толком не могу.
Напишите пожалуйста кто-нибудь максимально примитивную функцию добавления в список вот к этому (надеюсь таким образом разобраться):
C
1
2
3
4
5
6
7
8
typedef struct
{
        char dest[20];
        int number;
        char name[20];
    char date[10];
    request *next;
} request;

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

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2009, 02:35
Ответы с готовыми решениями:

Добавление элемента в однонаправленный список
Итак, задача: написать мини-программку, которая создает однонаправленный список...

Добавление элемента в сортированный список
Привет Форумчане! уже день вишу над вопросом к проекту и не могу сдвинуться...

Список: Не могу реализовать вывод, а может и правильное добавление в список.
Помогите пожалуйста. Не могу реализовать вывод, а может и правильное добавление...

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

Связный список: вставить в список перед каждым вхождением элемента K элемент L
Разработать программу, которая создает список, элементами которого являются...

5
#pragma
Временно недоступен
955 / 226 / 14
Регистрация: 12.04.2009
Сообщений: 926
21.12.2009, 04:25 2
Если я правильно понимаю,функция должна связать две структуры?
C
1
2
3
4
5
6
7
8
9
request *connect (request *first,request *second)
{
   if (second == NULL || first == NULL)
   {
       printf( "Error: structure pointer is NULL");
       exit (EXIT_FAILURE);
   }
   return first->next = second;
}
0
accept
4833 / 3255 / 455
Регистрация: 10.12.2008
Сообщений: 10,569
21.12.2009, 05:58 3
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
void *Add(request **ppHead, char *dest, int n, char *name, char *date)
{
    /* приняли адрес адреса головы (чтобы внутри функции сделать новую голову
       и её адрес сохранить вместо старого адреса)  */
 
    request *pOldHead = *ppHead; /* сохранили адрес старой головы, взяв его по адресу */
    request *pNewHead; /* узел, который будет заполнен и станет новой головой */
 
    pNewHead = new request; /* выделяем для него независимую от функций память
                               после работы функции эта память останется выделенной */
 
    strcpy(pNewHead->dest, dest); /* в узел копируем из строки dest содержимое */
 
    pNewHead->n = n; /* в узел копируем n */
 
    strcpy(pNewHead->name, name); /* в узел копируем из строки name содержимое */
 
    strcpy(pNewHead->date, date); /* в узел копируем из строки date содержимое */
    
    pNewHead->next = pOldHead; /* в новый узел записываем,
                                  что следующий узел после него - это старая голова */
 
    *ppHead = pNewHead; /* переходим к адресу старой головы
                           и записываем на его место адрес новой головы,
                           в которой уже всё есть */
 
    return (void *) pNewHead; /* приводим указатель на новую голову к общему виду
                                 и возвращаем его из функции,
                                 что говорит об успешном добавлении */
 
    /* дальше по всей функции можно добавлять проверки на ошибки
       (при вызове или в процессе создания, заполнения узла)
       и добавлять return NULL; в случае каждой ошибки */
}
2
requester
0 / 0 / 0
Регистрация: 23.11.2009
Сообщений: 40
21.12.2009, 09:38  [ТС] 4
а в C точно можно использовать new?
0
accept
4833 / 3255 / 455
Регистрация: 10.12.2008
Сообщений: 10,569
21.12.2009, 11:51 5
это вперемешку

например, вот так в C не получится сделать, в C++ тоже
C
1
2
3
4
5
6
7
8
typedef struct
{
        char dest[20];
        int number;
        char name[20];
        char date[10];
        request *next;
} request;
C++
1
2
3
4
5
6
7
8
struct request
{
        char dest[20];
        int number;
        char name[20];
        char date[10];
        request *next;
};
а так можно, но только в C++

C
1
2
3
4
5
6
7
8
typedef struct request
{
        char dest[20];
        int number;
        char name[20];
        char date[10];
        struct request *next;
} Request;
это для C

вместо new можно использовать malloc, чтобы перейти на C и, точно также, вместо strcpy можно использовать что-нибудь вроде string, stringstream, чтобы перейти на C++
0
vlobunet
0 / 0 / 1
Регистрация: 01.10.2017
Сообщений: 4
03.03.2018, 11:42 6
списки куда проще тема чем указатели хотя и последняя не сложна к пониманию.
Список это набор элементов с разным количеством полей. как например список учеников у которых разные имена возраст оценки и т д
так же как ученики списки могут иметь "руки" с помощью которых они показывают на следующего и предыдущего. так как список это не массив то мы не можем перейти из первого элемента сразу на третий или последний (если их не 2). каждый элемент размещен в разных не упорядоченных участках памяти и единственной связью есть "руки". И чтоб перейти из первого на четвертый элемент тебе сначала нужно узнать на что показывает первый потом второй дальше третий и наконец получишь адрес четвертого. считай что "рука"- это я чека в которой имеется адрес на следующий или предыдущий елемнт. списки бывают двусвязные и односвязные и циклические. вот пример односвязной структуры а потом двусвязной
C
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct      s_list
{
    char            *content;
    struct s_list   *prev;
}
                    list;
//============================================
typedef struct      s_list
{
    char            *content;
    struct s_list   *prev;
    struct s_list   *next;
}                                     list;
в коде выше можно найти одно различие
именно оно делает списки различными. то, цикличный он или нет можно понять только тем, что в цикличном списке последний ученик указывает на первого ну и первый указывает на последнего если это двусвязный список. В односвязном они не указываюn ни на что и обычно равны NULL.
при добавлении элемента очень важно чтоб не было утечки памяти. например если есть ученики 2 4 5 и мы хотим поставить 3 межу 2 и 4 то если ми в ячейку с указателем next запишем адрес третьего то потеряем навсегда 4 и 5.
таким образом чтоб этого не произошло нужно сначала третьему записать в next адрес 4ого а уже после этого второму записать в next адесс третьего. дублирование указателей на некоторый период это нормальная практика. все тоже относится и к двусвязным спискам. сначала третий должен указывать в next на 4 и в prev на 2 и только после этого ты можешь обрывать связь между 2 и 4 и следовательно в 2 next и 4 prev записать адрес 3го. вот и все танцы с бубном. если будет интересно в двусвязном списке то напишу отдельно. а вообще есть очень большое количество не плохих учебных материалов доступных широкому кругу.
вот часть кода для добавления элементов в односвязный и двусвязный списки
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void    ft_lstadd(list **alst, list *new_lst)
{
    if (!*alst)
        *alst = new_lst; //если список пуст то просто указываем его на первый элемент 
    else
    {
        new_lst->next = (*alst)->next;
        (*alst)->next = new_lst; // этого достаточно для односвязного списка
//========================= или =======================
               new_lst->next = (*alst)->next;
           new_lst->prev = *alst;
               (*alst)->next->prev = new_lst
               (*alst)->next = new_lst; // для односвязного списка
        }
}
примерно так. и конечно же ты в этой функции лишь добавляешь элемент но его нужно еще создать и наполнить контентом что делать нужно до этой функции.
0
03.03.2018, 11:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2018, 11:42

Список: после удаления элемента список не выводится
ну вот и осталась последняя проблема.(список двунаправленный) после удаления...

Добавление элемента в структуру
Добрый день. Мне нужно реализовать динамический массив структур. Условия:...

Добавление элемента к числовому массиву
Здравствуйте. Имеется массив чисел in={1,2,9.9,4.65,1,0,0,6,1.111,10}...


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

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

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