[英](C++)How do I create a function that receives two sorted linked lists and returns a third list of elements appearing in both lists?
因為這是一個作業,所以我不能使用 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;
}
假設這是一個學校練習(因為否則,使用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
}
}
}
struct node
確實在List
私有部分,
而您提供公共 getter 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*
內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.