Тема: Злиття двох списків в один
Є програма для роботи з списком. Не можу зробити злиття двох списків в один. Зробив щоб виводило окремо і перший і другий список а злиття не виходить. Потрібно виправити функцію 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");
}