c++语言程序设计(第四版)郑莉链表的实现
程序是在GitHub上找到的,也不知道是不是教材提供的源码,原链接如下:
链接
但是我在这里面找到了一处错误,就是打印链表时不显示最后一个节点
//LinkedList.h
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
//#include <cstdio>
#include <cassert>
#include "Node.h"
template<class T>
class LinkedList{
private:
Node<T>*front,*rear;
Node<T>*prevPtr,*currPtr;
int size;
int position;
Node<T>*newNode(const T&item,Node<T>*ptrNext=NULL);
void freeNode(Node<T>*p);
void copy(const LinkedList<T>& L);
public:
LinkedList();
LinkedList(const LinkedList<T>& L);
~LinkedList();
LinkedList<T>& operator=(const LinkedList<T>&L);
int getSize()const;
bool isEmpty() const;
void reset(int pos=0);
void next();
bool endOfList() const;
int currentPosition(void) const;
void insertFront(const T &item);
void insertRear(const T &item);
void insertAt(const T &item);
void insertAfter(const T &item);
T deleteFront();
void deleteCurrent();
T& data();
const T& data() const;
void clear();
};
template<class T>
void LinkedList<T>::freeNode(Node<T> *p){
delete p;
}
template<class T>
void LinkedList<T>::copy(const LinkedList<T> &L){
front = L.front;
rear = L.front;
currPtr = L.currPtr;
prevPtr = L.prevPtr;
size = L.size;
position = L.position;
}
template<class T>
LinkedList<T>::LinkedList():front(NULL), rear(NULL), prevPtr(NULL), currPtr(NULL), size(0), position(0) {}
template<class T>
LinkedList<T>::LinkedList(const LinkedList<T> &L){
copy(L);
}
template<class T>
LinkedList<T>::~LinkedList(){
clear();
delete prevPtr;
delete currPtr;
}
template<class T>
LinkedList<T> &LinkedList<T>::operator=(const LinkedList<T> &L){
copy(L);
}
template<class T>
int LinkedList<T>::getSize() const{
return size;
}
template<class T>
bool LinkedList<T>::isEmpty() const{
return size == 0;
}
template<class T>
void LinkedList<T>::reset(int pos){
if (pos >= 0 && pos <= size){
position = 0;
currPtr = front;
prevPtr = NULL;
while (pos--) next();
}
else {
position = pos;
currPtr = prevPtr = NULL;
}
}
template<class T>
void LinkedList<T>::next(){
++position;
prevPtr = currPtr;
if (currPtr != NULL) currPtr = currPtr->nextNode();
}
template<class T>
bool LinkedList<T>::endOfList() const{
return position == size;
/*错误的如下
return position == size - 1;
*/
}
template<class T>
int LinkedList<T>::currentPosition() const{
return position;
}
template<class T>
Node<T> *LinkedList<T>::newNode(const T &item, Node<T> *ptrNext){
Node<T> *p = new Node<T>(item, ptrNext);
assert(p != NULL);
return p;
}
template<class T>
void LinkedList<T>::insertFront(const T &item){
front = newNode(item, front);
if(isEmpty())
rear = front;
++size;
reset(++position);
}
template<class T>
void LinkedList<T>::insertRear(const T &item){
Node<T> *p = newNode(item);
if (isEmpty()) {
front = rear = p;
} else {
rear->insertAfter(p);
rear = p;
}
++size;
reset(position);
}
template<class T>
void LinkedList<T>::insertAt(const T &item){
if(currPtr != NULL){
Node<T> *p = newNode(item, currPtr);
if (prevPtr != NULL) prevPtr->insertAfter(p);
else front = rear = p;
++size;
reset(++position);
}
}
template<class T>
void LinkedList<T>::insertAfter(const T &item){
if(currPtr != NULL){
Node<T> *p = newNode(item, currPtr->next);
currPtr->insertAfter(p);
++size;
reset(position);
}
}
template<class T>
T LinkedList<T>::deleteFront(){
assert(!isEmpty());
Node<T> *p = front;
front = front->nextNode();
if (--size == 0) front = rear = NULL;
reset(--position);
T item = p->data;
freeNode(p);
return item;
}
template<class T>
void LinkedList<T>::deleteCurrent(){
assert(!isEmpty());
Node<T> *p = currPtr;
if(currPtr){
if (currPtr == front) front = front->nextNode();
else if (currPtr == rear) rear = prevPtr;
else if (prevPtr != NULL) prevPtr->deleteAfter();
freeNode(currPtr);
--size;
reset(position);
}
}
template<class T>
T &LinkedList<T>::data(){
return currPtr->data;
}
template<class T>
const T& LinkedList<T>::data() const{
return currPtr->data;
}
template<class T>
void LinkedList<T>::clear(){
while (!isEmpty())
deleteFront();
}
#endif //LINKEDLIST_H
然后是教材里提供的主函数中也有一个错误,比如说链表中两个相邻的5,第二的就不会被删除,改后如下:
#include<iostream>
#include"LinkedList.h"
using namespace std;
int main(){
LinkedList<int> list;
for(int i=0;i<10;i++){
int item;
cin>>item;
list.insertFront(item);
}
cout<<"List: ";
list.reset();
while(!list.endOfList()){
cout<<list.data()<<" ";
list.next();
}
cout<<endl;
//输入需要删除的整数
int key;
cout<<"Please enter some integer needed to be deleted: ";
cin>>key;
list.reset();
while(!list.endOfList()){
if(list.data()==key)
list.deleteCurrent();
else
list.next();
/*原文如下:
if(...)
list.delete....
list.next();
*/
}
//输出链表
cout<<"List: ";
list.reset();
while(!list.endOfList()){
cout<<list.data()<<" ";
list.next();
}
cout<<endl;
return 0;
}
目前只发现这些错误,如再有发现烦请告知
这本教材里还是有很多错误的
对你有帮助的话点个赞吧>_<