我正在寻找一个帮助理解链表。我有这样一个任务:aclass DNAList:
- 这个类是一个节点链表,它有指向DNA对象的指针(不是副本),并且至少应该包含:
- 合适的构造函数和析构函数 要存储的数据成员:指针指向列表
- 一个DNANode结构体或类,包含指向DNA对象的指针和指向DNANode对象的"next"指针(如果使用双链表,还有"prev"指针)。
- push_back(DNA* newDNA)方法,将节点添加到列表的末尾
- 一个find(int id)方法,如果列表中存在id的DNA对象,则返回一个DNA*;否则返回NULL
- 一个obliterate(int id)方法,用于删除带有加入号id的DNA条目并删除相应的节点
- 一个int size()方法,返回列表中元素的个数
首先,我尝试做push_back(DNA* newDNA)方法。请帮忙好吗?
谢谢。
DNAList.h
#ifndef DNALIST_H
#define DNALIST_H
#include <iostream>
#include <string>
#include "DNA.h"
class DNAList{
//data members
private:
DNA* headPtr;
public:
DNAList();
~DNAList();
struct DNANode;
void push_back(DNA* newDNA);
DNA* find(int id);
void obliterate(int id);
int size();
DNA* getHeadPtr(){
return headPtr;
}
void setHeadPtr(DNA* head){
headPtr= head;
}
};
#endif
DNAList.cpp
#include <iostream>
#include <string>
#include "DNAList.h"
//constrictor
DNAList::DNAList(){}
//destructor
DNAList::~DNAList(){
delete headPtr;
headPtr = NULL;
}
//struct that holds pointer to a DNA object and a "next" pointer to a
DNANode object
struct DNANode{
DNA* dnaPtr;
DNANode* next;
};
//
void push_back(DNA* newDNA){
//dnaPtr = new DNANode;
}
DNA* find(int id){
}
void obliterate(int id){
}
int size(){
return 0;
}
拥有DNA*
链表的最简单方法是使用标准的<list>
容器并使用list<DNA*>
。并且为了避免内存泄漏,甚至list<shared_ptr<DNA>>
.
但是你的任务似乎是一个学习链表的练习。所以这里有一些关于你自己的push_back()
的提示:
void push_back(DNA* newDNA)
{
DNANode *element = new DNANode;// create a new node
element->dnaPtr = newDNA; // set it up
element->next = nullptr; // it has no next element now
if (headPtr==nullptr) // hoping you have initalized the head at construction
headPtr = element; // either it's first element of empty list
else { // or you need to find the last node
DNANode *last = headPtr; // starting at head
while (last->next) // and going from node to node
last = last->next;
last->next = element; // here you are
}
}
你可以从中启发自己来写你的find()
和size()
(如果你不维护数据元素的大小),甚至obliterate()
。