Описание на алгоритмите, съответстващи на подточките от заданието
Функция за създаване на списъка:
Функцията за създаване на списъка е с името Create.
Декларирам указател P и Last. Задавам, че Last=NULL. Декларирам char ch. Извеждам съобщение на екрана с въпроса ще се добавя ли нов адрес и задавам,че ще се въвежда в ch. Навлизаме в while цикъл с условието,че ако за ch бъде въвведено „Y” или “y”,ще се премине през цикъла и той ще се изпълни.В тялото на цикъла започваме с декларация за създаването на нов списък (P= new obsht), извежда се съобщение за въвеждане на адрес и с оператора за въвеждане този адрес се въвежда в променливата adr. След това се извежда съобщение за въвеждане броя жители на въведения адрес и въведените жители се записват във променливата broi. След това имаме условие(if) което гласи ако “Head=NULL” или не съществува глава на списъка, то указателя P ще сочи към главата (Head). След условието имаме else през който се минава само ако условието в началото на while цикъла(ch == 'Y' || ch == 'y') не е изпълнено. В тялото на else имаме : „ Last->next = P“ т.е Last сочи към указателя P с което приключва else. В края на while цикъла имаме: Last = P т.е. Last и P сочат на едно и също място, след което извеждам съобщение с въпроса дали ще се добавя нов адрес и ако условието в началото е изпълнено, while цикъла се повтаря. Излизаме от цикъла когато условието не е изпълнено.
Функция за изтриване на жител на общината, живеещ на даден адрес:
Функцията за изтриване на жител е с името (delPersonOnAdress). Декларирам указател (P) и нов низ който се явява локална променлива (string adres). Слагам оператор за извеждане на съобщение на екрана(cout), както и такъв за въвеждане (cin), който дава възможност да въведа данни за променливата “adres”. След това навлизаме в while цикъл, с условие докато указателят P не сочи никъде, той да бъде преместен на следващия елемент, но ако(if) сочи към първата променлива за адрес(adr) то му се присвоява и новата променлива (adres). Извежда се съобщение на екрана казващо, че жителят е изтрит и се намалят жителите с 1 със оператора „P->broi—” което излизаме от цикъла и от функцията.
Функция за извеждане на информацията в списъка:
Функцията за извеждане е с името PrintList. При навлизането във функцията се започва с условие (if), което гласи: ако „P==NULL“ т.е. списъкът е празен се извежда съобщение, че няма адреси за показване, но ако има такива навлизаме в while цикъл гласящ: ако „P!=NULL” т.е. списъкът не е празен се извеждат наличните адреси в списъка, с което излизаме от цикъла и от функцията.
Описание на използваните функции:
=============================
Вид на функцията: void Create (point &Head)
Действие: Създаване на едносвързан списък
Параметри: Head - указател
Използвани глобални променливи: няма
Извиквани функции:няма
=============================
Вид на функцията: void PrintList (point P)
Действие: Извеждане на елементите в едносвързан списък.
Параметри: P - указател
Използвани глобални променливи: няма
Извиквани функции: няма
=============================
Вид на функцията: void delPersonOnAdress(point P)
Действие: Изтриване на елемент в едносвързан списък.
Параметри: P - указател
Използвани глобални променливи: няма
Извиквани функции: няма
=============================
Вид на функцията: int main()
Действие: Извикване на всички функции.
Параметри: няма
Използвани глобални променливи: няма
Извиквани функции: Create(Head) – създаване на списък,
PrintList(Head) – извеждане на елементите в списъка
delPersonOnAdress(Head) – изтриване на елемент от списъка
Тестови примери, доказващи верността на основните функции:
Разпечатка на кода с коментари:
#include
#include using namespace std;
struct obsht { //декларация на списък
int broi;
string adr;
obsht* next;
};
typedef obsht* point;
void Create(point& Head) { //създаване на списък
point P, Last;
Last = NULL;
char ch;
cout << "Ще добавите ли нов адрес? (Y/N): ";
cin >> ch;
while (ch == 'Y' || ch == 'y')
{
P = new obsht;
cout << "�'ъведете адрес: ";
cin >> P->adr;
cout << "�'ъведете броя жители живущи на този адрес: ";
cin >> P->broi;
P->next = NULL;
if (Head == NULL)
{
Head = P;
}
else
{
Last->next = P;
}
Last = P;
cout << "Ще добавите ли нов адрес? (Y/N): ";
cin >> ch;
}
}
void PrintList(point P) // �звеждане елементите на списъка
{
if (P == NULL) cout << "Няма адреси за показване" << endl;
else {
while (P != NULL)
{
cout << " Адрес: " << P->adr <<" �'рой жители живущи на адреса: " << P->broi << endl;
P = P->next;
}
}
}
void delPersonOnAdress(point P) //�зтриване на елемент от списъка
{
string adres;
cout << "�'ъведете адрес от който желаете да триете жител: ";
cin >> adres;
while (P)
{
if (P->adr == adres)
{
cout << "Жителят на посочения адрес е изтрит" << endl;
P->broi--;
}
P = P->next;
}
}
int main() // �звикване на всички функции
{
system ("chcp 1251");
point Head;
Head = NULL;
Create(Head);
PrintList(Head);
if (Head)
{
delPersonOnAdress(Head);
cout << "Актуализирания списък: " << endl;
PrintList(Head);
}
}