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

(C++)How do I create a function that receives two sorted linked lists and returns a third list of elements appearing in both lists?

本文关键字:列表 两个 返回 C++ 元素 三个 链表 函数 一个 创建 排序      更新时间:2023-10-16

因为这是一个作业,所以我不能使用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();
}

列表.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;
}

struct node确实在List的私人部分,
而您提供公共获取者List::node* List::getHead().

所以从类之外,我们不能使用 name List::node . 我们可以使用 auto 来解决这个问题:

void compareLists(const List& L1, const List& L2){
    const auto* L1HeadPtr = L1.getHead();
    const auto* L2HeadPtr = L2.getHead();
    // ...
}

更简单,更直观的是在公共部分中移动结构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*因为内容可以修改。

假设这是一个学校练习(因为否则,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
        }
    }
}