Функция специального использования - произведение двух списков - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть функция:

template <typename Key, typename Info>
Sequence<Key,Info> produce( Sequence<Key,Info> &s1, int start1, int length1, Sequence<Key,Info> &s2, int start2, int length2, int limit)

, где s1 и s2 - две последовательности, start1 и start2 - начальные позиции для обеих последовательностей, length1 и length2 - длины смещений и предел - длина всей создаваемой последовательности (произведение PRODUCE).

Пример s1 = [1 2 3 4 5]

s2 = [10 20 30 40 50]

s3 = продукты (s1, 2, 2, s2, 1, 3, 12) = [3 4 20 30 40 5 1 50 10 2]

предел равен 12, но мы использовали все элементы из обоих списков

class Sequence
{
struct Node{
    Key key;
    Info info;
    Node *next;
};

Node *head = NULL;

Когда s1, s2 пустые или limit = 0, возвращается пустой список:

if ((k == 0 && l == 0)|limit==0)
{
     return prod; // lays in a Sequence construction
} 

В противном случае:

typename Sequence<Key,Info>::iterator q;
typename Sequence<Key,Info>::iterator r;

q = s1.begin();
q = q + start1;

r = s2.begin();
r = r + start2;

Я понял, что нужно пройти через эти куски:

prod.insertFront(s1.get_key(q), s1.get_info(q));
if (s1.end(q))
{
q = s1.begin();
continue;
}
q = q + 1;

и

prod.insertFront(s2.get_key(r), s2.get_info(r));
if (s2.end(r))
{
r = s2.begin();
continue;
}
r = r + 1;

Теперь мне интересно, как собрать эти куски вместе для случая, когда мне нужно взять оставшиеся элементы и соединить их, когда итератор находится в конце последовательности и должен идти к голове, как в пример.

1 Ответ

0 голосов
/ 09 апреля 2019
template <typename Key, typename Info>
Sequence<Key,Info> produce( Sequence<Key,Info> &s1, int start1, int length1, Sequence<Key,Info> &s2, int start2, int length2, int limit)
{
Sequence<Key,Info> prod;
int k = s1.length();
int l = s2.length();
int m;

if ((k == 0 && l == 0)|limit==0)
{
cout<<"Test"<<endl;
 return prod;
}


typename Sequence<Key,Info>::iterator q;
typename Sequence<Key,Info>::iterator r;

 q = s1.begin();
 q = q + start1;

 r = s2.begin();
 r = r + start2;

if(length2!=0|| length1!=0 )
while (prod.length() < limit )
{


if(k==0)
{
 for (int j = 0; j < length2 && prod.length() < limit; j++)
 {
  prod.insertEnd(s2.get_key(r), s2.get_info(r));
  if (s2.end(r))
  {
   r = s2.begin();
   continue;
  }
 r = r + 1;
 }

}



if(l==0)
{
  for (int i = 0; i < length1 && prod.length() < limit; i++)
  {
   prod.insertEnd(s1.get_key(q), s1.get_info(q));
   if (s1.end(q))
  {
   q = s1.begin();
   continue;
  }
q = q + 1;
 }

}

//cout<<"zdjjdh"<<endl;
 if (k!= 0 && l!=0)
 {
  for (int i = 0; i < length1 && prod.length() < limit; i++)
  {
   prod.insertEnd(s1.get_key(q), s1.get_info(q));
   if (s1.end(q))
  {
   q = s1.begin();
   continue;
  }
q = q + 1;
 }
 for (int j = 0; j < length2 && prod.length() < limit; j++)
 {
  prod.insertEnd(s2.get_key(r), s2.get_info(r));
  if (s2.end(r))
  {
   r = s2.begin();
   continue;
  }
 r = r + 1;
 }
}


}

return prod;
cout<<endl;

}
...