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

Реализация связного списка

11.06.2013, 17:00. Показов 2438. Ответов 8
Метки нет (Все метки)

Помогите решить задачу
Написать программу, реализующую связный список с информацией о сотрудниках и отображающую список в порядке возрастания возраста сотрудника
Нужно написать программу без использования библиотеки list

я вот начал, только функция добавления не правильная

Помогите решить задачу

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
#include <stdio.h>
#include <iostream>
#include <windows.h>
 
typedef struct rabota {
char name[100];
char surname[100];
int year;
} RAB;
typedef struct svyaz {
RAB lib;
RAB* prev, *next;
} OBJ;
OBJ* head = NULL;
OBJ* tail = NULL;
 
OBJ* add_obj(char* name, char* surname, int year)
{
OBJ* current = (OBJ *)malloc(sizeof(OBJ));
strcpy(current->rab.name, name);
strcpy(current->rab.surname, surname);
current->rab.year = year;
current->prev = tail;
current->next = NULL;
if(tail != NULL)
tail->next = current;
if(head == NULL) head = current;
tail = current;
return current;
}
 
int zadacha()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
OBJ *current = NULL;
int year;
char name[100], surname[100];
int n;
printf("Введите количество сотрудников: ");
scanf("%s",n);
for(int i=0;n>i;i++)
{
printf("Введите фамилию сотрудника: ");
scanf("%s",name);
printf("Введите имя сотрудника: ");
scanf("%s",surname);
printf("Введите его возраст: ");
scanf("%d",&year);
current = add_obj(name, surname, year);
}
}
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2013, 17:00
Ответы с готовыми решениями:

Реализация связного списка
надо решить задачу: Сведения о владельце автомобиля: фамилия, марка автомобиля (строки), номер...

Почему данная реализация связного списка не сортируется по убыванию?
Сформировать список из вещественных чисел. Упорядочить список по убыванию. почему не сортирует по...

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

Создание связного списка
нужно создать связной список, что собственно уже сделал. что нужно: -функции: -root...

8
...
1804 / 1268 / 935
Регистрация: 12.02.2013
Сообщений: 2,063
11.06.2013, 19:49 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
#include <iostream>
#include <string>
 
struct TEmployee
{
   std::string surname;
   std::string name;
   unsigned year;
};
 
struct TNode
{
   TEmployee employee;
   TNode* next;
};
 
//-----------------------------------------------------------------------------
TNode* Push(TNode*& list, const TEmployee& employee)
{
   TNode* node = new TNode;
   node->employee = employee;
 
   if ((list == NULL) || (employee.year < list->employee.year))
   {
      node->next = list;
      list = node;
   }
   else
   {
      TNode* cur = list;
 
      while (cur->next && (cur->employee.year < employee.year))
      {
         cur = cur->next;
      }
 
      node->next = cur->next;
      cur->next = node;
   }
 
   return list;
}
//-----------------------------------------------------------------------------
void Clear(TNode*& list)
{
   TNode* node;
   while (list)
   {
      node = list;
      list = list->next;
      delete node;
   }
}
//-----------------------------------------------------------------------------
std::istream& operator >> (std::istream& is, TEmployee& employee)
{
   std::cout << "Фамилия: ";
   is >> employee.surname;
 
   std::cout << "Имя:     ";
   is >> employee.name;
 
   std::cout << "Возраст: ";
   is >> employee.year;
 
   std::cout << std::endl;
 
   return is;
}
//-----------------------------------------------------------------------------
std::ostream& operator << (std::ostream& os, const TEmployee& employee)
{
   return os << "Фамилия: " << employee.surname << std::endl
             << "Имя:     " << employee.name << std::endl
             << "Возраст: " << employee.year << std::endl;
}
//-----------------------------------------------------------------------------
std::ostream& operator << (std::ostream& os, const TNode* list)
{
   while (list)
   {
      os << list->employee << std::endl;
      list = list->next;
   }
 
   return os;
}
//-----------------------------------------------------------------------------
 
int main()
{
   unsigned n;
   std::cout << "Введите количество сотрудников: ";
   std::cin >> n;
 
   TEmployee employee;
   TNode* list = NULL;
 
   while (n--)
   {
      std::cin >> employee;
      Push(list, employee);
   }
 
   std::cout << "Список:" << std::endl << list;
 
   Clear(list);
 
   return 0;
}
2
2 / 2 / 0
Регистрация: 03.03.2013
Сообщений: 37
12.06.2013, 06:15  [ТС] 3
спасибо большое
0
2 / 2 / 0
Регистрация: 03.03.2013
Сообщений: 37
13.06.2013, 07:32  [ТС] 4
Цитата Сообщение от anmartex Посмотреть сообщение
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
#include <iostream>
#include <string>
 
struct TEmployee
{
   std::string surname;
   std::string name;
   unsigned year;
};
 
struct TNode
{
   TEmployee employee;
   TNode* next;
};
 
//-----------------------------------------------------------------------------
TNode* Push(TNode*& list, const TEmployee& employee)
{
   TNode* node = new TNode;
   node->employee = employee;
 
   if ((list == NULL) || (employee.year < list->employee.year))
   {
      node->next = list;
      list = node;
   }
   else
   {
      TNode* cur = list;
 
      while (cur->next && (cur->employee.year < employee.year))
      {
         cur = cur->next;
      }
 
      node->next = cur->next;
      cur->next = node;
   }
 
   return list;
}
//-----------------------------------------------------------------------------
void Clear(TNode*& list)
{
   TNode* node;
   while (list)
   {
      node = list;
      list = list->next;
      delete node;
   }
}
//-----------------------------------------------------------------------------
std::istream& operator >> (std::istream& is, TEmployee& employee)
{
   std::cout << "Фамилия: ";
   is >> employee.surname;
 
   std::cout << "Имя:     ";
   is >> employee.name;
 
   std::cout << "Возраст: ";
   is >> employee.year;
 
   std::cout << std::endl;
 
   return is;
}
//-----------------------------------------------------------------------------
std::ostream& operator << (std::ostream& os, const TEmployee& employee)
{
   return os << "Фамилия: " << employee.surname << std::endl
             << "Имя:     " << employee.name << std::endl
             << "Возраст: " << employee.year << std::endl;
}
//-----------------------------------------------------------------------------
std::ostream& operator << (std::ostream& os, const TNode* list)
{
   while (list)
   {
      os << list->employee << std::endl;
      list = list->next;
   }
 
   return os;
}
//-----------------------------------------------------------------------------
 
int main()
{
   unsigned n;
   std::cout << "Введите количество сотрудников: ";
   std::cin >> n;
 
   TEmployee employee;
   TNode* list = NULL;
 
   while (n--)
   {
      std::cin >> employee;
      Push(list, employee);
   }
 
   std::cout << "Список:" << std::endl << list;
 
   Clear(list);
 
   return 0;
}
Можно еще одну просьбу, пояснить как работает функция добавления
я запутался что какой указатель значит
0
...
1804 / 1268 / 935
Регистрация: 12.02.2013
Сообщений: 2,063
13.06.2013, 09:09 5
Цитата Сообщение от masikus Посмотреть сообщение
Можно еще одну просьбу, пояснить как работает функция добавления
я запутался что какой указатель значит
Да их там всего-то 3: сам list, node и cur. Ну да ладно:

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
//-----------------------------------------------------------------------------
// Функций добавляет в список работника.
// Она добавляет элемент таким образом, чтобы не нарушить
// возрастающую возрастную последовательность 
TNode* Push(TNode*& list, const TEmployee& employee)
{
   // Новый узел, который собственно и будет
   // добавляться в список
   TNode* node = new TNode;
   node->employee = employee;
 
   // В случае если список абсолютно пуст или самый первый в списке
   // работник уже старше нового, то добавляем новый узел в вершину
   // нашего списка
   if ((list == NULL) || (employee.year < list->employee.year))
   {
      node->next = list;
      list = node;
   }
   else
   {
      // Курсор, вспомогательный указатель на узел
      TNode* cur = list;
 
      // Пробегаемся по списку и ищем работника который старше добавляемого,
      // ну или пока весь список не закончился
      while (cur->next && (cur->next->employee.year < employee.year))
      {
         cur = cur->next;
      }
 
      // А теперь просто вставляем в найденное для него место
      node->next = cur->next;
      cur->next = node;
   }
 
   return list;
}
//-----------------------------------------------------------------------------
Кстати, посмотрите на строку 27, я там исправил ошибку из предыдущего поста. Заменил cur->employee.year на cur->next->employee.year
1
2 / 2 / 0
Регистрация: 03.03.2013
Сообщений: 37
13.06.2013, 10:04  [ТС] 6
спасибо
можете еще помочь написать функцию, если не сложно
Вставки элемента связного списка в указанную пользователем позицию. Предусмотреть ситуацию, когда указанная пользователем позиция превышает максимальное количество существующих на данный момент элементов списка. В этом случае должно быть создано необходимое количество пустых элементов списка для дополнения до необходимого размера.
0
...
1804 / 1268 / 935
Регистрация: 12.02.2013
Сообщений: 2,063
13.06.2013, 10:46 7
Вообще-то в таких случаях нужно новую тему создавать.
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
#include <iostream>
 
struct TNode
{
   int value;
   TNode* next;
 
   TNode(int theValue = 0): value(theValue), next(NULL) { ; }
};
 
//-----------------------------------------------------------------------------
TNode* Insert(TNode*& list, int value, size_t pos = 0)
{
   TNode* node = new TNode(value);
 
   if ((list == NULL) || (pos == 0))
   {
      node->next = list;
      list = node;
   }
   else
   {
      TNode* cur = list;
      size_t idx = 1;
 
      while ((idx++ < pos) && (cur->next))
      {
         cur = cur->next;
      }
 
      TNode* empty;
      while (idx < pos)
      {
         empty = new TNode;
         cur->next = empty;
         cur = empty;
         idx++;
      }
 
      node->next = cur->next;
      cur->next = node;
   }
 
   return list;
}
//-----------------------------------------------------------------------------
std::ostream& operator << (std::ostream& os, const TNode* list)
{
   while (list)
   {
      os << list->value << ", ";
      list = list->next;
   }
   os << "\b\b \b";
 
   return os;
}
//-----------------------------------------------------------------------------
 
int main()
{
   TNode* list = NULL;
 
   Insert(list, 1, 0);
   Insert(list, 2, 1);
   Insert(list, 3, 4);
   Insert(list, 4, 10);
   Insert(list, 5, 20);
   Insert(list, -1);
 
   std::cout << list << std::endl;
 
   return 0;
}
Реализация связного списка
1
2 / 2 / 0
Регистрация: 03.03.2013
Сообщений: 37
13.06.2013, 10:55  [ТС] 8
спасибо
буду разбираться щас
0
4864 / 3286 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
15.06.2013, 12:00 9
сделать пустым
пуст/не пуст
установить указатель в начало
указатель в конце/не в конце
передвинуть указатель вперёд
добавить элемент за указателем
взять элемент за указателем
прочитать/записать элемент за указателем
удалить элемент за указателем
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2013, 12:00
Помогаю со студенческими работами здесь

Удаление из связного списка
Вечер Добрый! Проблема с функцией удаления. Нужны советы, подсказки от гуру) Проблемная точка в...

Сортировка связного списка
Привет всем! как правильно написать сортировку для связного циклического списка ? помогите...

Сортировка связного списка
Привет всем! пришлите пожалуйста код реализации сортировки односвязного списка (желательно с...

Возвращение элемента связного списка
Здравствуйте. Есть связный список где в качестве элемента принимается структура DATA. Проблема...


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

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

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