Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2014, 15:12   #1
Alexandr-
Пользователь
 
Регистрация: 04.03.2013
Сообщений: 79
По умолчанию Связный список

Здравствуйте.
Есть программа, но не понимаю, как она работает(что делает знаю). Объясните кому не сложно данный код(комментарии к строкам или что-нибудь подобное). Заранее спасибо.

Само задание(на всякий случай):
В текстовых файлах T1 и T2 записано несколько чисел. Прочитать из файла T1 числа и сформировать на их основе связный список. Для каждого числа из файла T2 ответить, встречается ли оно в сформированном списке. Числа в файле T1 не повторяющиеся.

Код:
#include <iostream>
using namespace std;
struct Element
{
   int data;
   Element * Next;
};
 
class List
{
   Element * Head;
   Element * Tail;
   int Count;
 
public:
   List();
   ~List();
   void Add(int);
   void Del();
   void DelAll();
   void Print();
   int Find(int);
};
 
List::List()
{
   Head = Tail = NULL;   
   Count = 0;
}
 
List::~List()
{
   DelAll();
}
 
void List::Add(int data)
{
   Element * temp = new Element;
 
   temp->data = data;
   temp->Next = NULL;
 
   if(Head!=NULL){
        Tail->Next=temp;
        Tail = temp;
   }
 
   else{
       Head=Tail=temp;
   }
}
 
void List::Del()
{
   Element * temp = Head;
   Head = Head->Next;
   delete temp;
}
 
void List::DelAll()
{
   while(Head != 0)
      Del();
}
 
void List::Print()
{
   Element * temp = Head;
   while(temp != 0)
   {
      cout << temp->data << " ";
      temp = temp->Next;
   }
   cout << "\n\n";
}
int List::Find(int n) {
    Element * temp = Head;
    while (temp!=0) 
    {
        if (temp->data==n)
            return 1;
        temp=temp->Next;
    }
    return 0;
}
 
int main(){
    int temp;
    List Num;
    FILE * f1 = fopen("T1.txt", "r");
    FILE * f2 = fopen("T2.txt", "r");
    cout<<"VIVOD IZ FAILA T1 : "<<endl; 
    for(int i = 0; !feof(f1); i++)
    {
        fscanf(f1, "%d", &temp);
        Num.Add(temp);
    }
    Num.Print();
    cout<<"VIVOD IZ FAILA T2"<<endl;
     for(i = 0; !feof(f2); i++)
    {
        fscanf(f2, "%d", &temp);
        if (Num.Find(temp))
            cout<<"Number "<<temp<<" is in file T1!\n";
        else
            cout<<"Number "<<temp<<" is NOT in file T1!\n";
    }
    system("pause");
    return 0;
}
Alexandr- вне форума Ответить с цитированием
Старый 16.03.2014, 15:40   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Попробую:
Код:
//Описываем конструктор
List::List()
{
//Который готовит указатели головы списка и его хвоста
   Head = Tail = NULL;   
//И количество элементов в спике
   Count = 0;
//Задавая им начальные значения
}
Код:
List::~List()
{
   DelAll();
// Думаю здесь очевидно - в деструкторе вызывается процедура очистки списка
}
Код:
void List::Add(int data)
{
// Описывается функция добавления целого в конец списка
// Для этого создается переменка temp
   Element * temp = new Element;
//Которая наполняется данными, переданными функе
   temp->data = data;
   temp->Next = NULL;
//После чего вставляется в список 
//Если список пустой, то этот элемент автоматически становится его головой
   if(Head!=NULL){
        Tail->Next=temp;
        Tail = temp;
   }
 // Иначе вносится как последний
   else{
       Head=Tail=temp;
   }
//Перепутал камменты местами :)
}
Код:
void List::Del()
{
// Удаление элемента
   Element * temp = Head;
//Но почему то  удаление с головы списка. Видимо это очередь
   Head = Head->Next;
   delete temp;
//Т.е. головным элементом становится следующий, а текущая голова освобождается из памяти
//Кстати тут не хватает проверки на пустоту списка
}
Код:
void List::DelAll()
{
// Очевидный проход по списку и удаление его элементов, пока он не опустеет
   while(Head != 0)
      Del();
}
Код:
void List::Print()
{
//Распечатка списка
   Element * temp = Head;
//В цикле проход по его элементам
   while(temp != 0)
   {
//Вывод на экран
      cout << temp->data << " ";
//И переход на следующий элемент
      temp = temp->Next;
   }
   cout << "\n\n";
}
Код:
int List::Find(int n) {
    Element * temp = Head;
//Поиск в списке определенного числа.
//Принцп тот же что и в печати: Проход в цикле, если очередной элемент содержит 
// искомое вернуть True иначе False в числовом виде
    while (temp!=0) 
    {
        if (temp->data==n)
            return 1;
        temp=temp->Next;
    }
    return 0;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связный список InKo1 Общие вопросы C/C++ 4 06.03.2012 01:11
Связный список InKo1 Помощь студентам 0 22.12.2011 02:08
Связный список GripEnemy Visual C++ 2 08.12.2011 16:19
Связный список batman01 Общие вопросы C/C++ 1 15.10.2011 01:31
Связный список С++ Шёпот Общие вопросы C/C++ 2 01.04.2011 22:56