遍历C中的非STL链表可能吗?

遍历C中的非STL链表可能吗?,第1张

概述假设我使用的是非标准的链表类List.h.这个类正在运行,模板化,并具有添加/删除到前面和添加/删除到后面,isEmpty()等的典型功能. 此列表没有任何begin()和end()功能.此外,链表类必须包含迭代器功能吗?或者,当我创建一个新列表时,我可以自己创建这些东西吗? 我习惯使用STL,所以我通常会使用这段代码: typedef vector<OBJECT>::iterator Quote 假设我使用的是非标准的链表类List.h.这个类正在运行,模板化,并具有添加/删除到前面和添加/删除到后面,isEmpty()等的典型功能.

此列表没有任何begin()和end()功能.此外,链表类必须包含迭代器功能吗?或者,当我创建一个新列表时,我可以自己创建这些东西吗?

我习惯使用STL,所以我通常会使用这段代码:

typedef vector<OBJECT>::iterator QuoteIt;for(QuoteIt i = deposits.begin(); i != deposits.end(); ++i)

无论如何,让我说我创建一个新的“列表”.

List<int>deposits;

甚至是对象列表

List<OBJECT>deposits;

所以我想说addToBack()有20个不同的整数,这样就可以创建适当的新节点数.

现在,我如何遍历此列表,以便找到所有这些整数的总和?这可能,或者我目前的功能是否可以阻止这种情况?我必须在List类中实现某种迭代器吗?

现在我知道我可以保留一个外部变量,每次我执行addToBack()调用以跟踪我的总和.但是,我希望代码也与对象列表兼容. (我希望能够在节点中搜索一个值,并最终在同一节点中检索另一个值)

我已经习惯了使用stl :: List并使用迭代器创建一个for循环,我真的不知道如何使用其他类.

顺便说一下这里是List()的代码:

template<class NODETYPE>class List{public:List();~List();voID insertAtFront(const NODETYPE &);voID insertAtBack(const NODETYPE  &);bool removeFromFront( NODETYPE &);bool removeFromBack( NODETYPE &);bool isEmpty() const;private:ListNode< NODETYPE > *firstPtr; //pointer to first nodeListNode< NODETYPE > *lastPtr;//Function to allocate a new nodeListNode< NODETYPE > *getNewNode ( const NODETYPE &);};//default constructortemplate <class NODETYPE>List< NODETYPE > ::List():  firstPtr(0),lastPtr(0){cout<<"Creating Nodes! \n\n!"<<endl;}//deconstructortemplate <class NODETYPE>List<NODETYPE>::~List(){    if(!isEmpty() ){        cout<<"Destroying nodes!"<<endl;        ListNode<NODETYPE> *currentPtr=firstPtr;        ListNode<NODETYPE> *tempPtr;        while( currentPtr !=0){            tempPtr = currentPtr;            currentPtr=currentPtr->nextPtr;            delete tempPtr;        }    }cout<<"All nodes destroyed! \n\n";}template <class NODETYPE>bool List <NODETYPE>::removeFromFront( NODETYPE & value){if ( isEmpty() )    return false;else{    ListNode<NODETYPE> *tempPtr = firstPtr;    if (firstPtr== lastPtr)        firstPtr=lastPtr = 0;    else        firstPtr=firstPtr->nextPtr;    value = tempPtr->data;    delete tempPtr;    return true;}    }     template <class NODETYPE>bool List<NODETYPE>::removeFromBack(NODETYPE &value){    if (isEmpty())        return false;    else{        ListNode< NODETYPE> *tempPtr = lastPtr;        if( firstPtr == lastPtr)            firstPtr = lastPtr = 0;        else{            ListNode<NODETYPE> *currentPtr=firstPtr;            //Finds second to last element            while(currentPtr->nextPtr !=lastPtr)                currentPtr=currentPtr->nextPtr;            lastPtr = currentPtr;            currentPtr->nextPtr=0;        }        value = tempPtr->data;        delete tempPtr;        return true;    }}//Checks to see if List is emptytemplate< class NODETYPE>bool List< NODETYPE >::isEmpty() const{return firstPtr == 0;}//returns a pointer to newly created Nodetemplate<class NODETYPE>ListNode<NODETYPE> *List<NODETYPE>::getNewNode(const NODETYPE &value){return new ListNode<NODETYPE>(value);}
解决方法 你的列表似乎有两种迭代方式(前后)

List<int>deposits;.. add stuff:int o;int sum = 0;while(deposits.removeFromFront(o)) {  sum+=o;}

不好的是,迭代它,你也破坏了列表,
你可以提供List :: firstPtr和ListNode :: nextPtr的公共访问器;在这种情况下你可以这样做:

List<int>deposits;.. add stuff:int sum = 0;for(ListNode<int> *ptr = deposits.firstPtr; ptr ; ptr = ptr->nextPtr)   sum+=ptr->data;

但是,如果可以,请使用现有的STL容器.

总结

以上是内存溢出为你收集整理的遍历C中的非STL链表可能吗?全部内容,希望文章能够帮你解决遍历C中的非STL链表可能吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1220608.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存