Найти те же элементы в C-struct - PullRequest
0 голосов
/ 03 января 2019

Мне нужно написать функцию, которая будет добавлять элементы в C-struct, но она не может добавить тот же элемент.Пример: ввод: 1 2 1 3

вывод:

ADDED 1
ADDED 2
NOT ADD 1
ADD 3

Элементы взяты из массива, вот фрагмент кода, который использует функцию, которую мне нужно написать:

int tab[] = {1,4,1,3,5};
Node* head = 0;
for (size_t i = 0, e = std::size(tab); i != e; ++i) {
    bool b = add(head,tab[i]);
    cout << tab[i] << (b ? "     " : " NOT ")
         << "added" << endl;
}

C-struct Node выглядит так:

struct Node {
  int   data;
  Node* next;
};

Вот что я написал, но он добавляет все элементы из массива.Я не могу изменить цикл, только add функция:

bool add(Node*& head, int data){
    Node *n = new Node;
    n->data = data;
    n->next = 0;

    if(!head)
        head = n;
    else{
        Node *tmp = head;
        while(tmp->next)
            tmp = tmp->next;
        tmp->next = n;
    }
};

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Вот моя попытка. Найдите существующие данные сначала , затем добавьте, если они отсутствуют (без изменений по сравнению с существующим кодом)

bool add(Node*& head, int data) {
    Node *tmp = head;
    while (tmp) {
        if (tmp->data == data)
            return false; // data already present
        tmp = tmp->next;
    }

    Node *n = new Node;
    n->data = data;
    n->next = 0;

    if (!head) {
        head = n;
    }
    else {
        Node *tmp = head;
        while(tmp->next)
            tmp = tmp->next;
        tmp->next = n;
    }
    return true; // data added
}
0 голосов
/ 03 января 2019

Итак, я сделал что-то подобное, и оно работает с имеющимися у меня данными.Я полагаю, это работает в целом

bool add(Node*& head, int data){

Node *n = new Node;
n->data = data;
n->next = 0;

if(!head)
    head = n;
else{
    Node *tmp = head;
    while(tmp->next){
        if(tmp->data == data)
            return false;
        else
        tmp = tmp->next;
    }
    tmp->next = n;
}
};
0 голосов
/ 03 января 2019

в настоящее время вы просто добавляете элемент, не глядя, присутствует ли он уже или нет

Определение может быть примерно таким:

bool add(Node*& head, int data){

  if(!head) {
    head = new Node;
    n->data = data;
    n->next = 0;
    return true;
  }

  Node *tmp = head;

  while (tmp->next) {
    if (tmp->data == data)
      return false;
    tmp = tmp->next;
  }
  if (tmp->data == data)
    return false;

  tmp->next = new Node;
  tmp->next->data = data;
  tmp->next->next = 0;
  return true;
}

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

Exemple

Node::Node(int d) : next(0), data(d) {
}

// add should be a static method of Node, to be able to access next and data while they are private
bool add(Node*& head, int data){
  if(!head) {
    head = new Node(data);
    return true;
  }

  Node *tmp = head;

  while (tmp->next) {
    if (tmp->data == data)
      return false;
    tmp = tmp->next;
  }

  if (tmp->data == data)
    return false;

  tmp->next = new Node(data);
  return true;
}
...