簡體   English   中英

(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?

因為這是一個作業,所以我不能使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM