Регистрация не е нужна, освен при създаване на тема в "Задача на седмицата".

Задача със списък

Задача със списък

Мнениеот Гост » 17 Фев 2019, 15:30

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

#include "stdafx.h
#include <iostream>
#include <iostream>
#include<list>
#include<stdlib.h>


template <class T> struct elem { T inf; elem <T> *link; };
template <class T> class List {

public: List();
~List();
void AddAfter(T y, T x);
void AddBefore(T y, T x);
int Del_El(T x);
void Print_list();
void Del_list();
public: elem <T> *first;


// void Del_list();
};
template <class T> List<T>::List() { first = NULL; }
template <class T> List<T>::~List() { Del_list(); }
template <class T> void List<T>::AddAfter(T y, T x)
{
elem <T> *q = new elem <T>;
elem <T> *p = first;
while (p && p->inf != y)p = p->link;
if (p) {
q->inf = x;
q->link = p->link;
p->link = q;
}
else {
q->inf = x;
q->link = first;
first = q;
}
}
template <class T>
void List<T>::AddBefore(T y, T x) {
elem <T> *q = new elem <T>;
elem <T> *p = first;
while (p && p->inf != y)p = p->link;
if (p) {
*q = *p; p->inf = x;
p->link = q;
}
else {
q->inf = x;
q->link = first;
first = q;
}
}
template <class T>
int List <T>::Del_El(T x) {
if (first->inf == x) {
elem <T> *q = first;
first = first->link;
delete q;
return 1;
}
elem <T> *p = first;
while (p->link && p->link->inf != x)p = p->link;
if (!p->link)return 0;
elem <T> *q = p->link;
p->link = q->link;
delete q; return 1;
}
template <class T>
void List<T>::Print_list() {
elem <T> *p = first;
while (p) {
cout << p->inf << " "; p = p->link;
}
cout << endl;
}
template <class T>
void List<T>::Del_list() {
elem <T> *p = first, *q;
while (p) {
q = p; p = p->link;
delete q;
}
}

int main() {
using namespace std;
system("chcp 1251");
List<int>Li;
elem<int>*p; //помощен указател
int N=30,A[30], min = 0, br = 0, x, n, i;
cout << " Въведете броя на елементите в списъка: "; //цикъл за създаване на списък
cin >> br;
for (i = 0; i < br; i++) {
cout << "\n A[" << i + 1 << "]=";
cin >> A[i];
}
min = A[0];
for (i = 0; i < br; i++)
{
if (A[i] < min)
{
min = A[i];
}
}
cout << "\n Haй-малката стойност е: " << min;

cout << endl;

return 0;
}
Гост
 

Re: Задача със списък

Мнениеот Добромир Глухаров » 21 Фев 2019, 22:05

Код: Избери целия код
#include <iostream>
#include <list>

using namespace std;

int main()
{
    int myints[]= {1,2,3,4,5,6,7};
    list<int> mylist (myints,myints+7);
    list<int>::iterator it=mylist.begin();
    int mymin=*it;
    for (it=mylist.begin(); it!=mylist.end(); it++)
        if(*it < mymin)
            mymin=*it;
    mylist.remove(mymin);
    mylist.insert(it,mymin);
    for (it=mylist.begin(); it!=mylist.end(); it++)
        cout << *it << ' ';
    cout << endl;
    return 0;
}
Аватар
Добромир Глухаров
Математик
 
Мнения: 2080
Регистриран на: 11 Яну 2010, 13:23
Рейтинг: 2178

Re: Задача със списък

Мнениеот Гост » 22 Фев 2019, 16:41

Здравейте, благодаря за отговора..но може ли да ми обясните какво да използвам вместо iterator в кода, на лекции не сме го споменавали...четох за него в Интернет..разбирам, че употребата му прави самото писане по-лесно, но въпреки това в момента не ми върши работа. Хубава вечер!
Гост
 

Re: Задача със списък

Мнениеот aifC » 22 Фев 2019, 22:25

Ми не използвай STL щом не искаш итератор.
На теория няма разлика между теорията и практиката. Но на практика има.
Аватар
aifC
Напреднал
 
Мнения: 364
Регистриран на: 17 Окт 2017, 19:33
Рейтинг: 249

Re: Задача със списък

Мнениеот Добромир Глухаров » 25 Фев 2019, 13:16

Код: Избери целия код
#include <iostream>

using namespace std;

class myListClass
{
    private:
        int number;
        myListClass *next;
        myListClass *first, *last, *current;
    public:
        myListClass(void);
        ~myListClass(void);
        int minElement(void);
        void eraseElements(int);
        void pushToEnd(int);
        void printAll(void);
};

int main()
{
    int n;
    myListClass mLC;
    do
    {
        cout << "n (> 0) (0 for END) = "; cin >> n;
        if(n>0) mLC.pushToEnd(n);
    }
    while(n>0);
    n = mLC.minElement();
    cout << "minEl= " << n << endl;
    mLC.eraseElements(n);
    mLC.pushToEnd(n);
    mLC.printAll();
    return 0;
}

myListClass::myListClass(void)
{
    first=last=current=NULL;
}

myListClass::~myListClass(void)
{
    myListClass *temp;
    current = first;
    while(current)
    {
        temp=current;
        current = current->next;
        delete temp;
    }
}

int myListClass::minElement(void)
{
    int minEl;
    current = first;
    while(current)
    {
        if(current == first)
            minEl = current->number;
        else
            if(current->number < minEl)
                minEl = current->number;
        current = current->next;
    }
    return minEl;
}

void myListClass::eraseElements(int ElementValue)
{
    myListClass *temp, *prev, *preprev;
    preprev = current = first;
    while(current)
    {
        prev = last = current;
        if(current->number == ElementValue)
        {
            if(current == first)
            {
                temp = current->next;
                delete current;
                first = current = temp;
            }
            else
            {
                temp = current->next;
                delete current;
                preprev->next = current = temp;
            }
        }
        else
            current = current->next;
        preprev = prev;
    }
}

void myListClass::pushToEnd(int ElementValue)
{
    if(first == NULL)
    {
        first = current = last = new myListClass();
        current->number = ElementValue;
        current->next = NULL;
    }
    else
    {
        current = last;
        last = current = current->next = new myListClass();
        current->number = ElementValue;
        current->next = NULL;
    }
}

void myListClass::printAll(void)
{
    cout << endl;
    current = first;
    while(current)
    {
        cout << current->number << ' ';
        current = current->next;
    }
    cout << endl << endl;
}
Аватар
Добромир Глухаров
Математик
 
Мнения: 2080
Регистриран на: 11 Яну 2010, 13:23
Рейтинг: 2178

Re: Задача със списък

Мнениеот Добромир Глухаров » 26 Фев 2019, 21:36

Всъщност последната програма не поставя най-малкия елемент в края, ако той е бил там. Трябва да се добави един ред last = preprev; във void myListClass::eraseElements(int ElementValue):

Код: Избери целия код
void myListClass::eraseElements(int ElementValue)
{
    myListClass *temp, *prev, *preprev;
    preprev = current = first;
    while(current)
    {
        prev = last = current;
        if(current->number == ElementValue)
        {
            if(current == first)
            {
                temp = current->next;
                delete current;
                first = current = temp;
            }
            else
            {
                temp = current->next;
                delete current;
                preprev->next = current = temp;
                last = preprev;
            }
        }
        else
            current = current->next;
        preprev = prev;
    }
}
Аватар
Добромир Глухаров
Математик
 
Мнения: 2080
Регистриран на: 11 Яну 2010, 13:23
Рейтинг: 2178


Назад към C, C++



Кой е на линия

Регистрирани потребители: Google [Bot]

Форум за математика(архив)