(C ++)如何创建一个接收两个已排序链接列表的函数,并返回两个列表中出现的第三个元素列表?

时间:2017-10-25 22:12:17

标签: c++ linked-list

因为这是一个赋值,所以我不能使用STD :: List。

Struct List :: Node是私有的,因此我无法从compareLists函数访问它。如何使用getHead()函数将每个列表的头指针传递给我可以用来浏览列表的变量?

#include <iostream>
#include <cstdlib>
#include<list>
#include "List.h"

using namespace std;

void compareLists(List L1, List L2){
    List::node* L1HeadPtr = L1.getHead();
    List::node* L2HeadPtr = L2.getHead();
}

List.h:

#ifndef LIST_H
#define LIST_H

class List {
private:

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

  node* head;
  node* curr;
  node* temp;

public:

  List();
  void AddNode(int addData);
  void DeleteNode(int delData);
  void PrintList();
  node* getHead();
};
 #endif // LIST_H

单独的文件:

#include <cstdlib>
#include <iostream>

#include "List.h"

using namespace std;

List::List(){
    head = NULL;
    curr = NULL;
    temp = NULL;
}

List::node* List::getHead(){
    return head;
}

2 个答案:

答案 0 :(得分:0)

假设这是一个学校练习(因为否则,USE std::list),这是发布迭代器的经典案例,如下所示:

List::node* List::NextNode(List::node* curr) {
    return (curr == NULL) ? head : curr->next;
}

并在compareLists中使用它:

void compareLists(List L1, List L2) {
    List::node* iter1 = NULL;
    List::node* iter2 = NULL;

    while ((iter1 = L1.NextNode(iter1)) != NULL &&
           (iter2 = L2.NextNode(iter2)) != NULL)
    {
        if (iter1->data == iter2->data) {
            // Use shared item
        }
    }
}

答案 1 :(得分:0)

struct node确实属于List的私人部分,
而你提供公共吸气者List::node* List::getHead()

因此,从课堂外部,我们不能使用名称List::node。我们可以使用auto

来解决这个问题
void compareLists(const List& L1, const List& L2){
    const auto* L1HeadPtr = L1.getHead();
    const auto* L2HeadPtr = L2.getHead();
    // ...
}

更简单,更直观的是在公共区域中移动struct List::node(正如您提供的getHead()):

class List {
public:
 struct node {
    int data;
    node* next = nullptr;
  };

private:
  node* head = nullptr;

public:

  List();
  void AddNode(int addData);
  void DeleteNode(int delData);
  void PrintList() const;
  node* getHead();
};

但遗憾的是,在您的getter getHead()中,您打破了类的封装,因为node*内容可以修改。