#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
В стандартной библиотеке уже есть std::merge. Там же есть примеры возможной реализации.
Необходимо расширить функционал вашего 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
.
Вы добавляете в список так, чтоб список оставался сортированным, наверное и слиять нужно также. Тогда добавьте в класс метод:
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(); Тогда другой список не очистится
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Почему не совпадает указатель на объект, если сначала его превратит в any, а потом обратно в тот-же тип?
Есть программа который переводит выражение в обратную польскую запись и потом вычисляет результатмне нужно в момент вычисления транслировать...
Есть файл, путь - C:\Windows\System32\config\SYSTEM "SYSTEM" - сам файл, лог, в С++ пишу такой код, но файл невозможно открыть:
Могу ли я определить указатель на функцию как поле в классе, записать в нее адрес функции (зная сигнатуру метода) и обращаться к данному полю...