在 C-struct 中查找相同的元素

Find the same elements in C-struct

我必须编写一个将元素添加到 C 结构的函数,但它不能添加相同的元素。例子: 输入: 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;
    }
};

目前你只是添加元素而不看它是否已经存在

定义可以类似于

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;
}

我鼓励您添加一个构造函数,这样您就不必在每次创建新实例后都设置数据和下一个字段

例子

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;
}

这是我的尝试。查找现有数据 首先 如果不存在则添加(现有代码没有变化)

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
}

所以我做了类似的事情,它适用于我拥有的数据。我想它一般都有效

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;
}
};