c++语言程序设计(第四版)郑莉链表的实现源码

#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;
}

目前只发现这些错误,如再有发现烦请告知
这本教材里还是有很多错误的
对你有帮助的话点个赞吧>_<

猜你喜欢

转载自blog.csdn.net/lslfox/article/details/106753635