МУ_ЛР8_ОП (1079941), страница 7
Текст из файла (страница 7)
Если хотите, сделайте это самостоятельно.
В данном разделе приведем два варианта записи массива структур в файл: низкоуровневый и на основе потоков. Используем структуру Student:
58 Структуры данных для примеров
// Простой элемент списка двунаправленного списка - структура
struct Node {
Node * pNext;
Node * pPrev;
int ListVal; // только целая переменная
};
// Струкрура для двунаправленного списка
struct DList {
Node Head; // Голова списка
Node Tail; // Хвост списка
int Count; // Число элементов
};
59 Функция инициализации элемента и списка
Функции начальной настройка списка и его элементов:
// Инициализация структуры двунаправленнного списка
void InitList( DList * pL )
{
pL->Head.pNext = NULL;
pL->Tail.pNext = NULL;
//
pL->Head.pPrev = NULL;
pL->Tail.pPrev = NULL;
pL->Count =NULL ;
};
// Инициализация элемента списка двунаправленнного списка
void InitNode ( Node * pNode , Node * pN, Node * pP, int Val)
{
if ( pN != NULL) pNode->pNext = pN;
else pNode->pNext = NULL;
if ( pP != NULL) pNode->pPrev = pP;
else pNode->pPrev = NULL;
pNode->ListVal = Val;
};
Фрагмент программы для использования функции:
…
Результат работы программы:
…
60 Распечатка двунаправленного списка
Функция распечатки списка:
// Распечатка двунаправленнного списка
void DListPrint ( DList L )
{
printf ("Содержимое списка DList: \n");
Node * pE = L.Head.pNext;
if ( pE == NULL) printf ("Список пуст! \n");
while ( pE != NULL )
{
printf ("Элемент = %d \n", pE->ListVal );
pE = pE->pNext; // Очень важно - навигация по списку
};
};
Фрагмент программы для использования функции:
…
Результат работы программы:
…
61 Добавление в голову двунаправленнного списка список
Функция добавления в голову:
// Добавление в голову двунаправленнного списка
void AddDList( DList * pL , Node * pNode ){
// В голову
if ( pL->Head.pNext == NULL)
{ pL->Head.pNext = pNode;
pL->Tail.pNext = pNode;
pNode->pNext = NULL;
pNode->pPrev = NULL;
( pL->Count ) ++ ;
return; };
// Для новой
pNode->pNext = pL->Head.pNext;
pNode->pPrev = NULL;
// Для старой первой
pL->Head.pNext->pPrev = pNode;
// Для головы
pL->Head.pNext = pNode;
//
( pL->Count ) ++ ;
};
Фрагмент программы для использования функции:
…
Результат работы программы:
…
62 Добавление в хвост двунаправленного список
Функция добавления в хвост:
// Добавление в хвост двунаправленнного списка
void AddTailDList( DList * pL , Node * pNode ){
// Проверка пустого списка
if ( pL->Tail.pNext == NULL)
{
// список пуст
pL->Head.pNext = pNode;
pL->Tail.pNext = pNode;
pNode->pNext = NULL;
pNode->pPrev = NULL;
( pL->Count ) ++ ;
return; };
// Для новой в хвост
pNode->pPrev = pL->Tail.pNext ;
pNode->pNext = NULL ;
// Для бывшей последней
pL->Tail.pNext->pNext = pNode;
// Для хвоста
pL->Tail.pNext = pNode;
// счетчик жлементов
( pL->Count ) ++ ;
};
Фрагмент программы для использования функции:
…
Результат работы программы:
…
63 Добавить после заданного номера в двунаправленный список
Функция добавления по номеру:
// Добавить после заданного номера
void AddNumDList( DList * pL , Node * pNode , int Num ){
Node * pE = pL->Head.pNext; // для навигации
Node * pTemp = NULL; // Для запоминания
// Пустой список
if ( pE == NULL || Num < 1) { // printf ("Список пуст (AddNumDList)! \n");
AddDList( pL , pNode ); // в голову
return;
};
// Проверка добавления в хвост
if ( pL->Count <= Num ) {
AddTailDList( pL , pNode );
return;
};
// Добавление в середину
for (int i = 0 ; i < Num ; i++ )
{
pTemp = pE;
pE = pE->pNext ;
};
// Добавление
pNode->pNext = pE;
pNode->pPrev = pTemp;
pTemp->pNext = pNode;
pE->pPrev = pNode;
( pL->Count ) ++ ;
return;
};
Фрагмент программы для использования функции:
…
Результат работы программы:
…
64 Удаление из головы двунаправленного списка
Функция удаления из головы:
// Удаление из головы
int DelDList( DList * pL )
{
if ( pL->Head.pNext == NULL) return NULL ;
else
{ pL->Head.pNext =pL->Head.pNext ->pNext; // Прямая навигация
if ( pL->Head.pNext == NULL) pL->Tail.pNext = NULL;
( pL->Count ) -- ;
return 1;};
};
Фрагмент программы для использования функции:
…
Результат работы программы:
…
65 Очистка списка двунаправленного списка
Функция очистки списка:
// Очистка
void ClearDList( DList * pL )
{
while ( DelDList ( pL ) != NULL );
};
Фрагмент программы для использования функции:
…
Результат работы программы:
…
66 Удаление из хвоста двунаправленного списка
Функция удаления из хвоста списка:
// Удаление из хвоста DelTailDList
int DelTailDList( DList * pL )
{
if ( pL->Head.pNext == NULL) return NULL ; // Список уже пуст
else
{
pL->Tail.pNext =pL->Tail.pNext ->pPrev; // Обратная навигация
pL->Tail.pNext ->pNext = NULL;
if ( pL->Tail.pNext== NULL) pL->Head.pNext = NULL;
( pL->Count ) -- ;
return 1;};
};
Фрагмент программы для использования функции:
…
Результат работы программы:
…
67 Удаление по значению номера в ддвунаправленном списке
Функция удаления по номеру:
// Удаление по значению номера в списке
void DelNumDList( DList * pL , int Num )
{
Node * pE = pL->Head.pNext; // для навигации
Node * pTemp = NULL; // Для запоминания
// Удаление из головы
if ( pE == NULL || Num < NULL ) { // printf ("Список пуст (DelNumDList)! \n");
return;
};
// Голова
if ( Num == 0 ) {
DelDList( pL );
return;
};
// Хвост
if ( pL->Count < Num || pL->Count == Num ) {
return;
};
if ( pL->Count == Num + 1) {
DelTailDList( pL );
return;
};
// Поиск номера
for (int i = 0 ; i < Num ; i++ )
{
pTemp = pE;
pE = pE->pNext ;
};
// Удаление из списка найдено
// удаление из середины
pTemp->pNext = pE->pNext;
pE->pNext->pPrev = pTemp;
( pL->Count ) -- ;
return;
};
Фрагмент программы для использования функции:
…
Результат работы программы:
…
68 Получить из списка элемент по номеру
Функция получения из списка по номеру в списке:
/// Получить из списка элемент по номеру без удаления
int GetNumDList( DList * pL , Node ** pNode , int Num )
{
if ( Num < NULL || Num > pL->Count ) return 0; // Нет номера
Node * pTemp = pL->Head.pNext;
for ( int i = 0 ; i < Num; i++)
{
pTemp=pTemp->pNext;
};
*pNode = pTemp;
return 1;
};
Фрагмент программы для использования функции:
…
Результат работы программы:
…
69 Обмен в списке 2-х элементов по номеру
Функция обмена 2-х элементов в спике:
/// обмен в списке 2-х элементов по номеру
void SwapDlist( DList * pL , int NumA , int NumB )
{
Node * pNodeA;//= new Node;
Node * pNodeB; //= new Node;
if (NumA == NumB ) return;
if (GetNumDList( pL , &pNodeA , NumA ) == 1 )
if (GetNumDList( pL , &pNodeB , NumB ) == 1 )
{
// Замена: сначала удалить по номеру, а потом добавить по номеру
if (NumA > NumB ) {
DelNumDList( pL , NumB );
DelNumDList( pL , NumA - 1 );
InitNode ( pNodeA , NULL,NULL, -1 );
InitNode ( pNodeB , NULL,NULL, -1 );
AddNumDList( pL , pNodeA , NumB );
AddNumDList( pL , pNodeB , NumA ); }
else {
DelNumDList( pL , NumA );
DelNumDList( pL , NumB - 1 );
// DListPrint ( *pL );
AddNumDList( pL , pNodeB , NumA );
// DListPrint ( *pL );
AddNumDList( pL , pNodeA , NumB );
// DListPrint ( *pL );
}
};
};
Фрагмент программы для использования функции:
…
Результат работы программы:
…
70 Сортировка двунаправленного списка
Фрагмент программы для сортировки списка:
…
printf ("До Сортировк: \n");
pNode = new Node;
InitNode ( pNode , NULL,NULL, 888 );
AddTailDList( &L1 , pNode );
DListPrint ( L1 );
//
printf ("После Сортировки: \n");
for ( int i = 0 ; i < L1.Count - 1 ; i++ )
for ( int k = 0 ; k < L1.Count - 1 ; k++ )
{
Node * pNode1;
Node * pNode2;
GetNumDList( &L1 , &pNode1 , k );
GetNumDList( &L1 , &pNode2 , k +1 );
if ( pNode1->ListVal < pNode2->ListVal ) // ">" - возрастание, "<" - убывание
SwapDlist( &L1 , k ,k+1 );
};
DListPrint ( L1 );
…
Результат работы программы:
…
71 Сумма элементов двунаправленного списка
Фрагмент программы для суммирования значения элементов списка:
// Сумма данных в списке
…
int Sum;
Sum = 0;
Node * pTemp;
pTemp = L1.Head.pNext;
while ( pTemp != NULL)
{
Sum = Sum + pTemp->ListVal;
pTemp = pTemp->pNext; // Очень важный оператор -- навигация по списку!!!
};
printf ("Результат суммирования в списке: Sum= %d \n\n", Sum);
…
Результат работы программы:
…
(далее пока нет программ, можете примеры сделать сами)
72 Генерация случайных данных и заполнение двунаправленного списка
Функция …
Фрагмент программы для использования функции:
Результат работы программы:
73 Распечатка двунаправленного списка с хвоста
Функция …
Фрагмент программы для использования функции:
Результат работы программы:
74 Очистка динамического двунаправленного списка
Функция …
Фрагмент программы для использования функции:
Результат работы программы:
75 Минимум переменных списка, номер и адрес
Функция …
Фрагмент программы для использования функции:
Результат работы программы:
76 Поиск переменных списка по ключу
Функция …
Фрагмент программы для использования функции:
Результат работы программы:















