Метод для слияния 2-ух List'ов С++

205
25 марта 2018, 21:44
#include<iostream>
using namespace std;
struct Node {
        //data members
        int data;
        Node *next;
        // constructors
        Node();
        Node(int d, Node *link = NULL);
}; // struct Node = class Node all members have public access by default
class List {
public:
        // methods of the List ADT
        List(); //default constructor
        ~List(); //destructor
        bool isFull();
        bool isEmpty();
        void makeEmpty();
        int listSize();
        void printList();
        bool search(int item);
        int retrieve(int item);
        int deleteItem(int item);
        void addItem(int item);
        void RL(List item);
private:
        // data members for linked list implementation
        int count;
        Node *first;
};//List
void main()
{
        List A; //object A of class List with int items Note: without parenthesis!!
        if (!A.isFull())
                A.addItem(80);
        else  cout << "List was full. Item was not added\n";
        A.printList();
        if (!A.isFull())
                A.addItem(30);
        else  cout << "List was full. Item was not added\n";
        A.printList();
        if (!A.isFull())
                A.addItem(40);
        else  cout << "List was full. Item was not added\n";
        A.printList();
        if (!A.isFull())
                A.addItem(25);
        else  cout << "List was full. Item was not added\n";
        A.printList();
        if (A.search(30))
                cout << "deleted item = " << A.deleteItem(30) << endl;
        else  cout << "Item was not found. Item was not deleted\n";
        A.printList();
        if (A.search(70))
                cout << "deleted item = " << A.deleteItem(70) << endl;
        else  cout << "Item was not found. Item was not deleted\n";
        A.printList();
        //deleting without checking the precondition
        cout << "deleted item = " << A.deleteItem(60) << endl;
        A.printList();
        cout << "retrieved item = " << A.retrieve(25) << endl;  //without checking the precondition
        A.printList();
        cout << "list size = " << A.listSize() << endl;
        List B;
        if (!B.isFull())
                B.addItem(81);
        else  cout << "List was full. Item was not added\n";
        B.printList();
        if (!B.isFull())
                B.addItem(29);
        else  cout << "List was full. Item was not added\n";
        B.printList();
        if (!B.isFull())
                B.addItem(42);
        else  cout << "List was full. Item was not added\n";
        B.printList();
        if (!B.isFull())
                B.addItem(24);
        else  cout << "List was full. Item was not added\n";
        B.printList();
        A.printList();
        system("pause");
}//main
Node::Node()
{
        next = NULL;
} //constructor for an empty node
Node::Node(int item, Node * link)
{
        data = item;
        next = link;
} //node constructor with initial values
bool List::isEmpty()
{
        return count == 0; // return first == NULL; }//empty
}
        List::List()
        {
                count = 0;
                first = NULL;
        }//empty
        List::~List()
        {
                count = 0;
                Node *temp;
                while (first != NULL)
                {
                        temp = first;
                        first = first->next;
                        delete temp;
                }
        }//~List
        int List::listSize()
        { 
                return count;
        }//listSize


        bool List::isFull()
        {
                bool result = false;
                Node *temp;
                temp = new Node();
                if (temp == NULL) result = true;
                else         delete temp;
                return result;
        }//isFull
        void List::makeEmpty()
        {
                count = 0;
                Node *temp;
                while (first != NULL)
                {
                        temp = first;
                        first = first->next;
                        delete temp;
                }
        }//makeEmpty

        void List::addItem(int item)
                // item position is found then item is inserted at this position in a list.
        {
                if (isFull())
                {
                        cout << "List overflow\n";
                        return; //return to the calling function
                }
                else
                {
                        Node *previous = NULL, *following = first;
                        while (following != NULL && following->data < item)
                        {
                                previous = following;
                                following = following->next;
                        }//while
                        if (previous == NULL) //insert at the beginning  
                                first = new Node(item, first);
                        else   //insert not at the beginning
                                previous->next = new Node(item, following);
                        count++;
                }
        }
        bool List::search(int item)
                //returns true if item is in list, false otherwise
        {
                Node *p = first;
                while (p != NULL)
                {
                        if (p->data == item)  return true;
                        else   p = p->next;
                }//while
                return false;
        }//search



        void List::printList()
        {
                cout << "List content:\n";
                if (count == 0)
                        cout << "list is empty.\n";
                Node *p = first;
                while (p != NULL)
                {
                        cout << p->data << ", ";
                        p = p->next;
                }//while
                cout << endl;
        }//printList

        int List::retrieve(int item)
        {
                Node *p = first;
                while (p != NULL)
                {
                        if (p->data == item)  return p->data;
                        else   p = p->next;
                }//while
                cout << "item was not found, was not retrieved\n";
                return -10000; //to signal not found 
        }//retrieve

        int List::deleteItem(int item)
        {
                int result = 0;
                if (isEmpty()) {
                        cout << "List underflow\n";
                        return -10000;
                }
                Node *previous = NULL, *following = first;
                while (following != NULL && following->data != item)
                {
                        previous = following;
                        following = following->next;
                }//while
                 //deleting 1st node
                if (previous == NULL && following != NULL && following->data == item)
                {
                        result = following->data;
                        first = first->next;
                        delete following; //releasing memory
                        count--;
                        return result;
                }
                else
                        if (previous != NULL && following != NULL && following->data == item)
                        {
                                result = following->data; //deleting not 1st  node.
                                previous->next = following->next;
                                delete following;
                                count--;
                                return result;
                        }
                        else //item was not found
                        {
                                cout << "Item was not found and not deleted\n";
                                return -10000;
                        }
        }//deleteItem

Необходимо написать метод для отсортированного слияния List A и List B. Пример: List A 10 20 30 40 List B 15 25 35 Результат List C 10 15 20 25 30 35 40

Answer 1

В стандартной библиотеке уже есть std::merge. Там же есть примеры возможной реализации.

Answer 2

Необходимо расширить функционал вашего List - добавьте метод firstItem:

int List::firstItem() {
    if (first != NULL) {
        return first->data;
    }
    else {
        return -10000;
    }
}

Тогда слияние переносом производится так:

int item = -10000;
while ((item = B.firstItem()) != -10000) {
    B.deleteItem(item);
    A.addItem(item);
}

Если изначальные A.printList() и B.printList() выдают:

List content: 24, 29, 42, 81,
List content: 25, 40, 80,

То после слияние A.printList();:

List content: 24, 25, 29, 40, 42, 80, 81,

Слияние копированием:

void List::mergerTo(List& dest) {
    Node *thisNode = first;
    while (thisNode != NULL) {
        dest.addItem(thisNode->data);
        thisNode = thisNode->next;
    }
}

При использовании B.mergerTo(A); элементы B будут скопированы в A со всеми плюшками которые реализуются в List::addItem.

Answer 3

Вы добавляете в список так, чтоб список оставался сортированным, наверное и слиять нужно также. Тогда добавьте в класс метод:

List& mymerge( List& l) {
            for (int i = 0; i < l.listSize(); ++i) {
                addItem(l.first->data);
                l.first = l.first->next;
            }
            l.makeEmpty();
        }

А можете писать и без последней строки: l.makeEmpty(); Тогда другой список не очистится

READ ALSO
boost::any копирует значение?

boost::any копирует значение?

Почему не совпадает указатель на объект, если сначала его превратит в any, а потом обратно в тот-же тип?

190
Перевод выражения в код ассемблера

Перевод выражения в код ассемблера

Есть программа который переводит выражение в обратную польскую запись и потом вычисляет результатмне нужно в момент вычисления транслировать...

197
Открытие файла без расширения в С++

Открытие файла без расширения в С++

Есть файл, путь - C:\Windows\System32\config\SYSTEM "SYSTEM" - сам файл, лог, в С++ пишу такой код, но файл невозможно открыть:

176
Вызов функции через адрес поля класса

Вызов функции через адрес поля класса

Могу ли я определить указатель на функцию как поле в классе, записать в нее адрес функции (зная сигнатуру метода) и обращаться к данному полю...

180