Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
masikus
2 / 2 / 0
Регистрация: 03.03.2013
Сообщений: 36
11.06.2013, 17:00     Реализация связного списка #1
Помогите решить задачу
Написать программу, реализующую связный список с информацией о сотрудниках и отображающую список в порядке возрастания возраста сотрудника
Нужно написать программу без использования библиотеки 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);
}
}
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2013, 17:00     Реализация связного списка
Посмотрите здесь:

C++ Реализация связного списка
Создание и сортировка связного списка C++
Сортировка связного списка C++
C++ Доступ к элементам связного списка
C++ сортировка связного списка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
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;
}
masikus
2 / 2 / 0
Регистрация: 03.03.2013
Сообщений: 36
12.06.2013, 06:15  [ТС]     Реализация связного списка #3
спасибо большое
masikus
2 / 2 / 0
Регистрация: 03.03.2013
Сообщений: 36
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;
}
Можно еще одну просьбу, пояснить как работает функция добавления
я запутался что какой указатель значит
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
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
masikus
2 / 2 / 0
Регистрация: 03.03.2013
Сообщений: 36
13.06.2013, 10:04  [ТС]     Реализация связного списка #6
спасибо
можете еще помочь написать функцию, если не сложно
Вставки элемента связного списка в указанную пользователем позицию. Предусмотреть ситуацию, когда указанная пользователем позиция превышает максимальное количество существующих на данный момент элементов списка. В этом случае должно быть создано необходимое количество пустых элементов списка для дополнения до необходимого размера.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
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;
}
Реализация связного списка
masikus
2 / 2 / 0
Регистрация: 03.03.2013
Сообщений: 36
13.06.2013, 10:55  [ТС]     Реализация связного списка #8
спасибо
буду разбираться щас
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2013, 12:00     Реализация связного списка
Еще ссылки по теме:

Конструктор-копирования связного списка C++
C++ Почему данная реализация связного списка не сортируется по убыванию?
Удаление элементов из связного списка C++

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.06.2013, 12:00     Реализация связного списка #9
сделать пустым
пуст/не пуст
установить указатель в начало
указатель в конце/не в конце
передвинуть указатель вперёд
добавить элемент за указателем
взять элемент за указателем
прочитать/записать элемент за указателем
удалить элемент за указателем
Yandex
Объявления
15.06.2013, 12:00     Реализация связного списка
Ответ Создать тему
Опции темы

Текущее время: 17:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru