Структуры С++ добавление елементов в стурктуры

Рейтинг: -4Ответов: 1Опубликовано: 28.02.2023
#include<iostream>
#include<ctime>
using namespace std;
struct G {
    int infg;
    G* nextg;
};
struct Q
{
    int infq;
    Q* nextq;
};
struct P
{
    int infp;
    P* nextp;
};

void InitG(G**Headg, G*&Tailg)
{
    *Headg=NULL;
    Tailg = NULL;
}
void InitQ(Q** HeadQ, Q*& TailQ)
{
    *HeadQ = NULL;
    TailQ = NULL;
}
void InitP(P** HeadP, P*& TailP)
{
    *HeadP = NULL;
    TailP = NULL;
}

void AddElemQ(Q*& HeadQ);
void AddElemG(G*& Headg);
Q* Find(Q* HeadQ, int elem);
G* FindG(G* Headg, int elem);
void FindP(Q* HeadQ, G* Headg, int elemp);

int main() {
    srand(time(NULL));


    G* Headg, * Tailg;
    Q* HeadQ, * TailQ;
    P* HeadP, * TailP;
    

    InitG(&Headg, Tailg);
    InitQ(&HeadQ, TailQ);
    InitP(&HeadP, TailP);


    cout << "Enter count of G list: " << endl;
    int ng;
    cin >> ng;
    for (int i = 0; i < ng; i++) {
        AddElemG(Headg);
    }

    cout<< "Enter count of Q list: " << endl;
    int nq;
    cin >> nq;
    for (int i = 0; i < nq; i++) {
        AddElemQ(HeadQ);
    }

    G*g = Headg;
    cout << "In list G: " << endl;
    while (g != NULL) {
        cout << g->infg << "  ";
        g = g->nextg;
    }
    cout << endl;

    Q* q = HeadQ;
    cout << "In list Q: " << endl;
    while (q != NULL) {
        cout << q->infq << "  ";
        q = q->nextq;
    }
    cout << endl;
    cout << "Enter the element in G: ";
    int n2;
    cin >> n2;
    G* pg;
    pg = FindG(Headg, n2);
    cout << "Elem in G" << endl << pg << endl;
    int n;
    cout << "Enter the element in Q: ";
    cin >> n;
    Q* pq;
    pq = Find(HeadQ, n);
    cout << "Elem in Q" << endl << pq << endl;
    cout << endl;
    //FindP(HeadQ, Headg, n);
    return 0;
}


void AddElemG(G*&Headg)
{
    G* NewNode = new G;
    NewNode->infg = rand() % 10;
    if (!Headg) NewNode->nextg = NULL;
    else NewNode->nextg = Headg;
    Headg = NewNode;
}
void AddElemQ(Q*& HeadQ) {
    Q* NewNodeQ = new Q;
    NewNodeQ->infq = rand() % 10;
    if (!HeadQ) NewNodeQ->nextq = NULL;
    else NewNodeQ->nextq = HeadQ;
    HeadQ = NewNodeQ;
}
Q* Find(Q* HeadQ, int elem)
{
    Q* q = HeadQ;
    while (q && (q->infq != elem))
        q = q->nextq;
    return q;
}
G* FindG(G* Headg, int elem)
{
    G* g = Headg;
    while (g && (g->infg != elem))
        g = g->nextg;
    return g;
}
void FindP(Q* HeadQ,G* Headg, int elemp)
{
    Q* qp = HeadQ;
    G* gp = Headg;
    while(qp && gp &&(qp->infq !=elemp)&&(gp->infg !=elemp))
    {
        qp = qp->nextq;
        gp = gp->nextg;
    }
    
    cout << gp<<endl;
    cout << qp;
}

Ответы

▲ 1

Прежде всего - здесь принято вопросы оформлять на русском языке.
Несколько замечаний - почему C++? Не считая вывода в поток, вы пишете на С.
У вас списки одинаковые - содержат данные типа int, зачем вы делаете одинаковые списки тремя разными структурами? У вас весь код в тройном экземпляре получается. Сделайте один список (класс/структуру) и создайте 3 объекта этого списка. Опять-таки у вас метка на вопросе C++ - а написание списков самое то для использования ООП.

struct Node
{
    int inf = -100500;
    Node *next = nullptr;
};

struct MyList
{
    Node *head;
    Node *tail;  // необязательно
    int size;  // необязательно

    MyList(): head(nullptr), tail(nullptr), size(0) {}

    void AddElem(int elem);
    Node* FindElem(int elem);
    void Clear();
};

int main()
{
    MyList G, Q, P; // создали 3 пустых списка
}

Ну и дальше решаете ваши вопросы:
А) элементы входят хотя бы в один из списков - если не надо проверять повторы то просто копируете оба списка в третий

auto el = Q.head;
while(el)
{
   P.AddElem(el->inf);
   el = el->next;
}
el = G.head;
while(el)
{
   P.AddElem(el->inf);
   el = el->next;
}

Б) элемент входит одновременно в списки Q и G

auto el = Q.head;
while(el)
{
   if( G.FindElem(el->inf) )
      P.AddElem(el->inf);
   el = el->next;
}

В) элементы входят в список Q но не входят в список G

auto el = Q.head;
while(el)
{
   if( !G.FindElem(el->inf) )
      P.AddElem(el->inf);
   el = el->next;
}