Премини към съдържанието
  • Добре дошли!

    Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

    Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

     

Списък C++


reni999
 Сподели

Препоръчан отговор

Здравейте, задачата ми е да съставя функция, която намира най‐често срещания елемент и колко пъти той се среща в списък с начален указател pstart. Направила съм функция за търсене,но тя е за намиране на конкретен елемент.Съвети?

#include <iostream>

using namespace std;
struct elem
{
    int key;
    elem* next;
}*pstart = NULL;
void add(int n)
{
    elem* p = pstart;
    pstart = new elem;
    pstart->key = n;
    pstart->next = p;
}
void izvedi()
{
    if (pstart)
    {
        elem* p = pstart;
        cout << "Spisukut e " << endl;
        while (p)
        {
            cout << p->key << "  ";
            p = p->next;
        }
    }
    else
        cout << "\n Prazen spisuk";
}
void search(int  n)
{
    elem* p = pstart;
    if (pstart)
    {
        while ((p->key != n) && (p->next))
            p = p->next;
        if (p->key == n)
            cout << "\nTurseniq element e nameren";
        else
            cout << "\nElementut ne e nameren";
    }
    else
        cout << "Spisukut e prazen";
}

void element()
{
    int num;
    do {
        cout << "Vuvedi element ";
        cin >> num;
        add(num);
    } while (num != 0);
    izvedi();
    cout << "\nVuvedi stoinost,koqto iskash da potursish?";
    int n1;
    cin >> n1;
    search(n1);

}

int main()
{
   
    int izbor;
    char izborDrOp;

    system("cls"); // изчистване на екрана-
    do { //Цикъл за менюто
        do {
            cout << endl << "\n\t\t\t ****************** M E N U ******************\n" << endl //извеждаме на екрана
                << "\n\t\t\t 1.Izvejdane na stojnost: \n" << endl //извеждаме на екрана
                << "\n\t\t\t 2.Tarsene na element:  \n" << endl //извеждаме на екрана
                << "\n\t\t\t 3.Izvejdane na elemen': \n" << endl //извеждаме на екрана
                << "\n\t\t\t *******************************************************" << endl //извеждаме на екрана
                << "\n\t\t\t Вашият избор:" << ""; //извеждаме на екрана
            cin >> izbor; // Въвеждане на число от масива
        } while (!(izbor > 0 && izbor < 3)); // докато 'izbor' е от 1 до 10

        switch (izbor)
        {
        case 1:system("color F1");
        {
            system("cls"); // изчистване на екрана
            element();
        }
        break;
        case 2:system("color F5");
        {system("cls"); // изчистване на екрана
        int n;
        search(n);
        }
        break;
        case 3:system("color FA");
        {system("cls"); 
        izvedi();

        }break;
        }


        cout << "Друга операция ? (y/n)";
        cin >> izborDrOp;
    } while (izborDrOp == 'y' || izborDrOp == 'n');
    return 0;
    //system("pause");
}

 

Линк към коментара
Сподели в други сайтове

Може да си направиш един map тип елемент:брой и вътре да слагаш всеки елемент и колко пъти е намерен. След това проверяваш map-а при всеки следващ дали този елемент го има и ако го има, увеличаваш стойността на брояча срещу елемента. Накрая намираш в map-а елемента с най-голям брояч и го показваш.

С елемнтарно търсене в гугъл се намира:

https://www.geeksforgeeks.org/frequent-element-array/

Линк към коментара
Сподели в други сайтове

int maxlist(int &cmax)
{
    elem *p, *t=pstart;
    int n,nmax,c;
    cmax=0;
    while (t)
    {
        n=t->key;
        c=1;
        p=t->next;
        while (p)
        {
            if (p->key==n) ++c;
            p=p->next;
        }
        if (c>cmax)
        {
             nmax=n;
             cmax=c;
        }
        t=t->next;
    }
    return nmax;
}

функцията ти връща най-често срещания елемент, като параметър трябва да и подадеш променлива в която да запише колко пъти се среща.

Списъка или предварително го проверяваш дали е празен или след функцията дали броя е 0 и извеждаш подходящо съобщение, че списъка е празен.

Линк към коментара
Сподели в други сайтове

преди 1 час, ined написа:
int maxlist(int &cmax)
{
    elem *p, *t=pstart;
    int n,nmax,c;
    cmax=0;
    while (t)
    {
        n=t->key;
        c=1;
        p=t->next;
        while (p)
        {
            if (p->key==n) ++c;
            p=p->next;
        }
        if (c>cmax)
        {
             nmax=n;
             cmax=c;
        }
        t=t->next;
    }
    return nmax;
}

функцията ти връща най-често срещания елемент, като параметър трябва да и подадеш променлива в която да запише колко пъти се среща

Благодаря! Но функцията ми element() не ми позволява да напиша коя стойност искам да търся

 

Линк към коментара
Сподели в други сайтове

Цитат

Благодаря! Но функцията ми element() не ми позволява да напиша коя стойност искам да търся

И какво общо имат едната с другата функция?

Между другото начина по който вкарваш елементите в списъка е сбъркан - при всяко добавяне на елемент или няколко елементи добавяш и по една нула. Вместо:

 

do {
        cout << "Vuvedi element ";
        cin >> num;
        add(num);
    } while (num != 0);

 

за да не ти добавя нулата в списъка би трябвало да бъде нещо от рода на:

 

    while (1)
    {
        cout << "Vuvedi element ";
        cin >> num;
        if (num==0) break;
        add(num);
    } 

 

 

 

 

 

 

 

Линк към коментара
Сподели в други сайтове

преди 30 минути, ined написа:

И какво общо имат едната с другата функция?

Между другото начина по който вкарваш елементите в списъка е сбъркан - при всяко добавяне на елемент или няколко елементи добавяш и по една нула. Вместо:

 

do {
        cout << "Vuvedi element ";
        cin >> num;
        add(num);
    } while (num != 0);

 

за да не ти добавя нулата в списъка би трябвало да бъде нещо от рода на:

 

    while (1)
    {
        cout << "Vuvedi element ";
        cin >> num;
        if (num==0) break;
        add(num);
    } 

 

 

 

 

 

 

 

Извинявам се, но пак не ми дава да въведа стойоността която да потърся.

Линк към коментара
Сподели в други сайтове

Слагаш по-няколко неща да прави една функция, затова пък в менюто липсват необходимите инструкции.

поизчистил съм я програмата, element() само добавя един или повече елементи към списъка и не прави нищо друго. Останалата логика е в менюто, така по-лесно да се организира какво да се прави по всяка точка.

#include <iostream>

using namespace std;

struct elem
{
    int key;
    elem* next;
}*pstart = NULL;
void add(int n)
{
    elem* p = pstart;
    pstart = new elem;
    pstart->key = n;
    pstart->next = p;
}
void izvedi()
{
    if (pstart)
    {
        elem* p = pstart;
        cout << "Spisukut e " << endl;
        while (p)
        {
            cout << p->key << "  ";
            p = p->next;
        }
    }
    else
        cout << "\n Prazen spisuk";
}
void search(int  n)
{
    elem* p = pstart;
    if (pstart)
    {
        while ((p->key != n) && (p->next))
            p = p->next;
        if (p->key == n)
            cout << "\nTurseniq element e nameren";
        else
            cout << "\nElementut ne e nameren";
    }
    else
        cout << "Spisukut e prazen";
}

void element()
{
    int num;
    while(1)
    {
        cout << "Vuvedi element ";
        cin >> num;
        if (num==0) return;
        add(num);
    } 
}

int main()
{
   
    int izbor;
    char izborDrOp;

    system("cls"); 
    do { 
        do {
            cout << endl << "\n\t\t\t ****************** M E N U ******************\n" << endl 
                << "\n\t\t\t 1.Vavejdane na element(i): \n" << endl 
                << "\n\t\t\t 2.Tarsene na element:  \n" << endl 
                << "\n\t\t\t 3.Izvejdane na elementi': \n" << endl 
                << "\n\t\t\t *******************************************************" << endl 
                << "\n\t\t\t Vashia izbor:" << ""; 
            cin >> izbor; 
        } while (!(izbor > 0 && izbor < 4)); 
        switch (izbor)
        {
        case 1:system("color F1");
        {
            system("cls"); 
            element();
            izvedi();
        }
        break;
        case 2:system("color F5");
        {system("cls"); 
        cout << "\nVuvedi stoinost,koqto iskash da potursish?";
        int n1;
        cin >> n1;
        search(n1);
        }
        break;
        case 3:system("color FA");
        {system("cls"); 
        izvedi();

        }break;
        }


        cout << "\n\nDruga operacia ? (y/n)";
        cin >> izborDrOp;
    } while (izborDrOp == 'y' || izborDrOp == 'Y');
}

 

Линк към коментара
Сподели в други сайтове

преди 19 часа, ined написа:

Слагаш по-няколко неща да прави една функция, затова пък в менюто липсват необходимите инструкции.

поизчистил съм я програмата, element() само добавя един или повече елементи към списъка и не прави нищо друго. Останалата логика е в менюто, така по-лесно да се организира какво да се прави по всяка точка.

#include <iostream>

using namespace std;

struct elem
{
    int key;
    elem* next;
}*pstart = NULL;
void add(int n)
{
    elem* p = pstart;
    pstart = new elem;
    pstart->key = n;
    pstart->next = p;
}
void izvedi()
{
    if (pstart)
    {
        elem* p = pstart;
        cout << "Spisukut e " << endl;
        while (p)
        {
            cout << p->key << "  ";
            p = p->next;
        }
    }
    else
        cout << "\n Prazen spisuk";
}
void search(int  n)
{
    elem* p = pstart;
    if (pstart)
    {
        while ((p->key != n) && (p->next))
            p = p->next;
        if (p->key == n)
            cout << "\nTurseniq element e nameren";
        else
            cout << "\nElementut ne e nameren";
    }
    else
        cout << "Spisukut e prazen";
}

void element()
{
    int num;
    while(1)
    {
        cout << "Vuvedi element ";
        cin >> num;
        if (num==0) return;
        add(num);
    } 
}

int main()
{
   
    int izbor;
    char izborDrOp;

    system("cls"); 
    do { 
        do {
            cout << endl << "\n\t\t\t ****************** M E N U ******************\n" << endl 
                << "\n\t\t\t 1.Vavejdane na element(i): \n" << endl 
                << "\n\t\t\t 2.Tarsene na element:  \n" << endl 
                << "\n\t\t\t 3.Izvejdane na elementi': \n" << endl 
                << "\n\t\t\t *******************************************************" << endl 
                << "\n\t\t\t Vashia izbor:" << ""; 
            cin >> izbor; 
        } while (!(izbor > 0 && izbor < 4)); 
        switch (izbor)
        {
        case 1:system("color F1");
        {
            system("cls"); 
            element();
            izvedi();
        }
        break;
        case 2:system("color F5");
        {system("cls"); 
        cout << "\nVuvedi stoinost,koqto iskash da potursish?";
        int n1;
        cin >> n1;
        search(n1);
        }
        break;
        case 3:system("color FA");
        {system("cls"); 
        izvedi();

        }break;
        }


        cout << "\n\nDruga operacia ? (y/n)";
        cin >> izborDrOp;
    } while (izborDrOp == 'y' || izborDrOp == 'Y');
}

 

а функцията maxlist() не си я добавил нали?

Линк към коментара
Сподели в други сайтове

#include <iostream>

using namespace std;

struct elem
{
    int key;
    elem* next;
}*pstart = NULL;
void add(int n)
{
    elem* p = pstart;
    pstart = new elem;
    pstart->key = n;
    pstart->next = p;
}

int maxlist(int &cmax)
{
    elem *p, *t=pstart;
    int n,nmax,c;
    cmax=0;
    while (t)
    {
        n=t->key;
        c=1;
        p=t->next;
        while (p)
        {
            if (p->key==n) ++c;
            p=p->next;
        }
        if (c>cmax)
        {
             nmax=n;
             cmax=c;
        }
        t=t->next;
    }
    return nmax;
}

void izvedi()
{
    if (pstart)
    {
        elem* p = pstart;
        int num,x;
        cout << "Spisukut e " << endl;
        while (p)
        {
            cout << p->key << "  ";
            p = p->next;
        }
        num=maxlist(x);
        cout<<"\n\nNaj-chesto sreshtan element "<<num<<" x"<<x<<endl;
    }
    else
        cout << "\n Prazen spisuk";
}
void search(int  n)
{
    elem* p = pstart;
    if (pstart)
    {
        while ((p->key != n) && (p->next))
            p = p->next;
        if (p->key == n)
            cout << "\nTurseniq element e nameren";
        else
            cout << "\nElementut ne e nameren";
    }
    else
        cout << "Spisukut e prazen";
}

void element()
{
    int num;
    while(1)
    {
        cout << "Vuvedi element ";
        cin >> num;
        if (num==0) return;
        add(num);
    } 
}

int main()
{
   
    int izbor;
    char izborDrOp;

    system("cls"); 
    do { 
        do {
            cout << endl << "\n\t\t\t ****************** M E N U ******************\n" << endl 
                << "\n\t\t\t 1.Vavejdane na element(i): \n" << endl 
                << "\n\t\t\t 2.Tarsene na element:  \n" << endl 
                << "\n\t\t\t 3.Izvejdane na elementi': \n" << endl 
                << "\n\t\t\t *******************************************************" << endl 
                << "\n\t\t\t Vashia izbor:" << ""; 
            cin >> izbor; 
        } while (!(izbor > 0 && izbor < 4)); 
        switch (izbor)
        {
        case 1:system("color F1");
        {
            system("cls"); 
            element();
            izvedi();
        }
        break;
        case 2:system("color F5");
        {system("cls"); 
        cout << "\nVuvedi stoinost,koqto iskash da potursish?";
        int n1;
        cin >> n1;
        search(n1);
        }
        break;
        case 3:system("color FA");
        {system("cls"); 
        izvedi();

        }break;
        }


        cout << "\n\nDruga operacia ? (y/n)";
        cin >> izborDrOp;
    } while (izborDrOp == 'y' || izborDrOp == 'Y');
}

 

Линк към коментара
Сподели в други сайтове

преди 4 минути, ined написа:
#include <iostream>

using namespace std;

struct elem
{
    int key;
    elem* next;
}*pstart = NULL;
void add(int n)
{
    elem* p = pstart;
    pstart = new elem;
    pstart->key = n;
    pstart->next = p;
}

int maxlist(int &cmax)
{
    elem *p, *t=pstart;
    int n,nmax,c;
    cmax=0;
    while (t)
    {
        n=t->key;
        c=1;
        p=t->next;
        while (p)
        {
            if (p->key==n) ++c;
            p=p->next;
        }
        if (c>cmax)
        {
             nmax=n;
             cmax=c;
        }
        t=t->next;
    }
    return nmax;
}

void izvedi()
{
    if (pstart)
    {
        elem* p = pstart;
        int num,x;
        cout << "Spisukut e " << endl;
        while (p)
        {
            cout << p->key << "  ";
            p = p->next;
        }
        num=maxlist(x);
        cout<<"\n\nNaj-chesto sreshtan element "<<num<<" x"<<x<<endl;
    }
    else
        cout << "\n Prazen spisuk";
}
void search(int  n)
{
    elem* p = pstart;
    if (pstart)
    {
        while ((p->key != n) && (p->next))
            p = p->next;
        if (p->key == n)
            cout << "\nTurseniq element e nameren";
        else
            cout << "\nElementut ne e nameren";
    }
    else
        cout << "Spisukut e prazen";
}

void element()
{
    int num;
    while(1)
    {
        cout << "Vuvedi element ";
        cin >> num;
        if (num==0) return;
        add(num);
    } 
}

int main()
{
   
    int izbor;
    char izborDrOp;

    system("cls"); 
    do { 
        do {
            cout << endl << "\n\t\t\t ****************** M E N U ******************\n" << endl 
                << "\n\t\t\t 1.Vavejdane na element(i): \n" << endl 
                << "\n\t\t\t 2.Tarsene na element:  \n" << endl 
                << "\n\t\t\t 3.Izvejdane na elementi': \n" << endl 
                << "\n\t\t\t *******************************************************" << endl 
                << "\n\t\t\t Vashia izbor:" << ""; 
            cin >> izbor; 
        } while (!(izbor > 0 && izbor < 4)); 
        switch (izbor)
        {
        case 1:system("color F1");
        {
            system("cls"); 
            element();
            izvedi();
        }
        break;
        case 2:system("color F5");
        {system("cls"); 
        cout << "\nVuvedi stoinost,koqto iskash da potursish?";
        int n1;
        cin >> n1;
        search(n1);
        }
        break;
        case 3:system("color FA");
        {system("cls"); 
        izvedi();

        }break;
        }


        cout << "\n\nDruga operacia ? (y/n)";
        cin >> izborDrOp;
    } while (izborDrOp == 'y' || izborDrOp == 'Y');
}

 

А maxlist() не се изпълнява като се сложи в менюто?

Линк към коментара
Сподели в други сайтове

  • 2 седмици по-късно...

Здравейте, моята задача също е от списъци, но има следното условие: Да се състави функция за изваждане на две числа, представени чрез списъци (може и двусвързани). До момента съм написала следния код, но списъците не се извеждат на екран и не се извършва изваждането. Бихте ли ми казали къде греша, тъй като в момента го изучавам и се затруднявам. Ще ви бъда много благодарна, ако ми помогнете. 😊

#include <iostream>

using namespace std;

struct elem {

    int key;

    elem *next;

}

*list1 = NULL, *list2 = NULL, *list3 = NULL;

void add1(int n, elem *start)

{

    elem *p = start;

    start = new elem;

    start ->key = n;

    start ->next = p;

}

void list(elem *start)

{

         elem *p = start;

        cout << "Spisyk:";

        while (p) {

            cout << p->key << "\t";

            p = p->next;

        }

        cout << endl;

}

int main()

{

    int i, j;

    cout << "\n Vyvedete pyrvoto chislo: ";

    do

    {

        cin >> i;

        if (i > 0 && i < 10)

            add1(i, list1);

    } while ((i>=0) && (i<10));

    cout << "\n Vyvedete vtoroto chislo: ";

    do

    {

        cin >> j;

        if (j > 0 && j < 10)

            add1(j, list2);

    } while ((j >= 0) && (j<10));

    elem *p = list1, *q = list2;

    int pr = 0; //Пренос

    int c = 0;

    while ((p != NULL) || (q != NULL))

    {

        c = 0;

        if (p != NULL)

        {

            c -= p->key;

            p = p->next;

        }

        if (q !=NULL)

        {

            c -= q->key;

            q = q->next;

        }

        if (pr > 0)

            c -= pr;

        if (c > 9)

        {

            c -= 10;

            pr = 1;

        }

        else

        pr = 0;

        add1(c, list3);

    }

    if (pr > 0)

        add1(pr, list3);

    list(list3);

}

Линк към коментара
Сподели в други сайтове

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.

 Сподели

×
×
  • Добави ново...

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите Условия за ползване