1 Востаннє редагувалося koala (26.05.2022 19:20:42)

Тема: Злиття двох списків в один

Є програма для роботи з списком. Не можу зробити злиття двох списків в один. Зробив щоб виводило окремо і перший і другий список а злиття не виходить. Потрібно виправити функцію merge_list(Вона в низу). Ось код:

#include <iostream>
#include <list>
 
using namespace std;

struct FILM
{
    int code;
};

struct List {
    FILM info;
    List *next;
    List *prev;
};

struct List2 {
    FILM info;
    List2 *next;
    List2 *prev;
};

struct List3 {
    FILM info;
    List3 *next;
    List3 *prev;
};

List *Head = NULL, *Tail = NULL;
List2 *Head2 = NULL, *Tail2 = NULL;
List3 *Head3 = NULL, *Tail3 = NULL;
 
void fill_list(){
    List *tmp;
    for (int i = 1; i < 11; i++){
        tmp = new List;
        tmp->info.code = i;
        tmp->next = NULL;
        if (Head != NULL){
            tmp->prev = Tail;
            Tail->next = tmp;
            Tail = tmp;
        }
        else {
            tmp->prev = NULL;
            Head = Tail = tmp;
        }
    }
}

void fill_list2(){
    List2 *temp;
    for (int i = 5; i < 11; i++){
        temp = new List2;
        temp->info.code = i;
        temp->next = NULL;
        if (Head2 != NULL){
            temp->prev = Tail2;
            Tail2->next = temp;
            Tail2 = temp;
        }
        else {
            temp->prev = NULL;
            Head2 = Tail2 = temp;
        }
    }
}

int Size(){
   int size=0;
   if(Head == 0){
    return size;
   }
    List *p = Head;
   while(p){
      size ++;
      p = p->next;
   }
   return size;
}

void print(){
    List *p = Head;
    if(Head==NULL){
        cout<<"Список порожній\n";
    } else{
        cout << "Список" << endl;
        cout<<"Назва\tКод\tВартість\tРежисер\n";
        while(p){
        cout << p->info.code<< endl;
        p = p->next;
        }
    }
}

void print2(){
    List2 *p = Head2;
    if(Head2==NULL){
        cout<<"Список порожній\n";
    } else{
        cout << "Список" << endl;
        cout<<"Назва\tКод\tВартість\tРежисер\n";
        while(p){
        cout << p->info.code<< endl;
        p = p->next;
        }
    }
}

void print3(){
    List3 *p = Head3;
    if(Head3==NULL){
        cout<<"Список порожній\n";
    } else{
        cout << "Список" << endl;
        cout<<"Назва\tКод\tВартість\tРежисер\n";
        while(p){
        cout << p->info.code<< endl;
        p = p->next;
        }
    }
}

void print_back(){
   List *p = Tail;
    if(Tail==NULL){
        cout<<"Список порожній\n";
    } else{
        cout << "Список" << endl;
        cout<<"Назва\tКод\tВартість\tРежисер\n";
        while(p){
        cout << p->info.code << endl;
        p = p->prev;
        }
    }
}
 
void add_begin(){
    int x;
    cout<<"Введіть код фільму: ";
    cin>>x;
    List *tmp = new List;
    tmp->next = NULL;
    tmp->prev = NULL;
    tmp->info.code = x;
    if (Head != NULL){
        tmp->next = Head;
        tmp->prev = tmp;
        Head = tmp;
    }
    else {
        Head = Tail = tmp;
    }
}
 
void add_end(){
    int x;
    cout<<"Введіть код фільму: ";
    cin>>x;
    List *tmp = new List;
    tmp->next = NULL;
    tmp->info.code = x;
    if (Head != NULL){
        tmp->prev = Tail;
        Tail->next = tmp;
        Tail = tmp;
    }
    else {
        tmp->prev = NULL;
        Head = Tail = tmp;
    }
}

void Clear(){
   if(Head == NULL) return;
   List *p = Head;
   List *tmp;
   while(p){
      tmp = p;
      p = p->next;
      delete tmp;
   }
   Head = NULL;
}

void FindDelete(){
    int c=1,pos,size;
    size=Size();
    cout<<"Введіть позицію фільму: ";
    cin>>pos;    
    if(Head == 0){
        cout << "Список порожній"; 
        return;
    }
        
    if (pos > size || pos < 0)
    {   cout <<"Позиція за межами списку\nРозмір списку: "<<size<<endl;
        return;
    }
    List *t = Head;
    List *t1 = t->next;
    List *t2 = t->prev;
    while(t1)
    {
        if(c == (pos-1)){
        t->next = t1->next;
        t->next->prev = t1->prev;
        delete t1;
        return;
      }
        t = t1;
        t1 = t1->next;
      c++;  
    }
    return;
}


void swap(){
    int c=1,pos,size;
    size=Size();
    cout<<"Введіть позицію фільму: ";
    cin>>pos;    
    if(Head == 0){
        cout << "Список порожній"; 
        return;
    }
        
    if (pos > (size-1) || pos <= 0)
    {   cout <<"Позиція за межами списку(Останній елемент можна міняти тільки з попереднім)\nРозмір списку: "<<size<<endl;
        return;
    }
    List *p = Head;
    while(p)
    {
        if(pos == 1){
            List *a = p->next;
            List *b = a->next;
            p->next = b;
            a->next = p;
            b->prev = p;
            p->prev = a;
            a->prev = NULL;
            Head = a;
            return;
        }
        else if(pos == (size-1) && pos == c){
            List *a = Tail;
            List *b = p->prev;
            b->next = a;
            a->next = p;
            a->prev = b;
            p->prev = a;
            p->next = NULL;
            Tail = p;
            return;
        }
        else if(pos == c){ // условие для поиска
            List *a = p->next;
            List *b = a->next;
            List *c = p->prev;
            p->next = b;
            a->next = p;
            c->next = a;
            b->prev = p;
            a->prev = c;
            p->prev = a;
            return;
        }
      p = p->next;
      c++;  
    }
    return;
}

void merge_lists(List *Head, List2 *Head2, List3 *Head3){
    if(Head2!=NULL){
       Head3=Head; 
    }
    else if(Head!=NULL){
       Head3=Head2; 
    } else{
       Head3=Head;
       Tail=Head2;
       Tail3=Tail2;
    }
    /*if(Head2!=NULL){
        if (Head==NULL){
            Head3=List2.Head2;
        } else {
            List3 *ptr = Head;
            ptr=Head;
            while(ptr->next!=NULL){
                ptr=ptr->next;
            }
            Head->prev=ptr;
            ptr->next=Head;
        }
    }
    Head3=Head;
    return List3;*/
}

int main()
{
    int selection,size;
    fill_list();
    fill_list2();
    do
    {
      cout<<endl;
      cout<<"----------------Функції----------------"<<endl;
      cout<<"1 - Добавити на початок"<<endl;
      cout<<"2 - Вивід списку"<<endl;
      cout<<"3 - Добавити в кінець"<<endl;
      cout<<"4 - Очистити список"<<endl;
      cout<<"5 - Вивести список скінця"<<endl;
      cout<<"6 - Видалити елемент в конкретній позиції"<<endl;
      cout<<"7 - Поміняти місцями елементи"<<endl;
      cout<<"9 - Визначити розмір списку"<<endl;
      cout<<"0 - Вихід"<<endl;
      cout<<"Введіть потрібну функцію: ";
      cin>>selection;
      cout<<endl;
      switch (selection)
      {
            case 1:add_begin();break;
            case 2:print();break;
            case 3:add_end();break;
            case 4:Clear();break;
            case 5:print_back();break;
            case 6:FindDelete();break;
            case 7:swap();break;
            case 8:print2();break;
            case 9:size=Size();
            case 10:print3();break;
            case 11:merge_lists(Head, Head2, Head3);break;
            cout<<"Розмір списку: "<<size<<endl;
            break;
            case 0:Clear();return 0;
            default:cout<<"Такої функції не існує"<<endl;
                
      }
    
    } while(selection=true);   
 
    
    system("pause");
}

2

Re: Злиття двох списків в один

Вітаю на форумі.
Вам не потрібні три однакові структури, вам потрібні три змінні одного типу. Ви намагаєтеся об'єднати змінні різних типів, коли це мають бути змінні одного типу, звідси і проблеми.

P.S. додав вам теги code