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

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

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 《C语言程序设计第四版》是一本针对C语言初学者的入门教材,是由著名的编程教育家郑莉编写而成的。这本书全面而系统地介绍了C语言的基础知识和程序设计技巧,内容包括C语言基本语法、指针、函数、结构体、文件处理等方面。此外,书中不仅有大量实例代码,还有练习题和解答,可供学习者进行练习和巩固。 在学习过程中,读者可以通过这本书深入了解C语言的运作原理和使用方法,从而掌握C语言的核心知识和技能。此外,该书还提供了一些进阶内容,如多文件编程、内存动态分配等,帮助学习者更加深入地理解C语言。 总的来说,《C语言程序设计第四版》是一本经典的C语言教材,对于想要学习C语言的初学者来说,是一本很好的入门读物。它的讲解清晰、编排严谨,适合初学者使用。同时,它也为有经验的程序员提供了一些有用的参考资料。如果想要系统地学习C语言,这本书是一个值得推荐的选择。 ### 回答2: 《C语言程序设计 第四版 郑莉PDF》是一本经典的C语言教材,该书作者郑莉是国内知名的计算机教育专家。本书全面介绍了C语言的基础知识和编程技巧,适合初学者和已经有一定编程基础的学习者参考使用。 该书内容包括C语言基础知识、数据类型、流程控制语句、数组、函数、指针、结构体、文件操作等方面,通过讲解理论知识和实际编程案例相结合的方式,帮助读者深入理解C语言编程思想和语法。 本书的特色在于强调了C语言编程实战技巧,实际编程案例丰富具体,让读者能够通过学习实际案例掌握C语言编程的技巧和方法。 总之,《C语言程序设计 第四版 郑莉PDF》是一本经典的C语言教材,无论是初学者还是有一定编程基础的学习者,都可以从中受益。读者可以通过阅读本书掌握C语言编程的基本思想和技能,提高编程水平。 ### 回答3: c语言程序设计第四版郑莉pdf是一本非常经典的编程教材,它涵盖了c语言编程的所有主要内容。这本书从一个非常基础的角度开始,逐步深入讲解了c语言的语法、编程思想和程序设计技巧等方面的知识。 第四版的修改和更新使它更加适合初学者,例如加入了最新c语言标准的特性,方便读者更好地理解和掌握c语言的编程思想。书中还配有大量的实例程序以及练习题目,帮助读者快速上手。 此外,本书还详细介绍了许多c语言相关的工具和技术,例如gcc编译器、makefile以及调试技巧等,方便读者更好地掌握c语言编程。 总之,c语言程序设计第四版郑莉pdf是一本非常权威、实用的编程教材,对于想要学习c语言编程的人来说是绝佳的参考书。它不仅能够帮助读者掌握c语言的基本语法和思想,还能够教会读者许多实用的编程技巧和工具,相信大家通过学习这本书都能成为出色的程序员。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值