C++ 单链表

来源:互联网 发布:网络金融销售 编辑:程序博客网 时间:2024/04/30 09:25

 完成单链表的建立,新增,插入,删除,打印

link.h

#ifndef LINK_H#define LINK_H#include<iostream>using namespace std;//目录void printMenu(){    cout<<"Menu"<<endl;    cout<<"1.Add Value"<<endl;    cout<<"2.Delete Value"<<endl;    cout<<"3.Insert Value"<<endl;    cout<<"4.Print Value"<<endl;    cout<<"5.Quit"<<endl;}class Node{private:    Node *next;    int value;public:    Node(){}    Node(const int newValue){value=newValue;next=NULL;}    void setNext(Node *newNext){next=newNext;}//设置下一个节点    int getValue()const{return value;}//获得该节点数据    Node *getNext()const{return next;}//获得下一个节点};class Link{private:    Node *headNode;    int numNode;public:    Link(){headNode=NULL;numNode=0;}    //查看头结点是否为空    bool headNodeIsEmpty();    //在链表尾部增加新节点    void addNewNode(const int newValue);    //插入节点    void insertNode(const int newValue,const int insertNumber);    //删除链表节点    void deleteNode(const int delNumber);    //打印链表    void printNode();};bool Link::headNodeIsEmpty(){    if(headNode==NULL){        return true;    }    else{        return false;    }}void Link::addNewNode(const int newValue){    Node *newNode=new Node(newValue);    if(headNodeIsEmpty()){         headNode=newNode;         headNode->setNext(NULL);    }    else{        newNode=headNode;        Node *addNode=new Node(newValue);        //获得最后一个节点        while(newNode->getNext()!=NULL){            newNode=newNode->getNext();        }        //将addNode添加到链表尾部        newNode->setNext(addNode);        //将addNode的下一个节点设置为空        addNode->setNext(NULL);    }    ++numNode;}void Link::insertNode(const int newValue, const int insertNumber){    Node *insertNode,*preInsertNode;    insertNode=new Node(newValue);    int currentNumber=1;    if(!headNodeIsEmpty()){        //插入节点不为头结点时        if(insertNumber!=1){            preInsertNode=headNode;            //将preInsertNode移动至插入点前一个节点            while(currentNumber++<insertNumber-1){                preInsertNode=preInsertNode->getNext();            }            //insertNode的下一个节点为preInsertNode的下一个节点            insertNode->setNext(preInsertNode->getNext());            //插入insertNode            preInsertNode->setNext(insertNode);        }        else{            insertNode->setNext(headNode);            headNode=insertNode;        }        ++numNode;    }}void Link::deleteNode(const int delNumber){    //delNode 为删除节点,preDelNode为该节点前一个节点,    //nextDelNode为该节点下一个节点    Node *delNode,*preDelNode,*nextDelNode;    int currentNumber=1;    if(!headNodeIsEmpty()){        //删除节点不为头结点        if(delNumber!=1){        preDelNode=headNode;        //将preDelNode移动至删除节点的前一个节点        while(currentNumber++<delNumber-1){            preDelNode=preDelNode->getNext();        }        cout<<"The Node "<<delNumber<<" has been deleted!"<<endl;        //标记需要删除的节点        delNode=preDelNode->getNext();        //将preDelNode的下一个节点设置为删除节点之后的节点        preDelNode->setNext(delNode->getNext());        //删除delNode        delete delNode;        }        //删除节点为头结点        else{            cout<<"The Node "<<delNumber<<" has been deleted!"<<endl;            //标记头结点            delNode=headNode;            //将第二个节点设置为新头结点            nextDelNode=delNode->getNext();            headNode=nextDelNode;            //删除头结点            delete delNode;        }        numNode--;    }}void Link::printNode(){    Node *printNode;    int printNumber=0;    if(!headNodeIsEmpty())    printNode=headNode;    while(printNumber++<numNode){        cout<<"No."<<printNumber<<" "<<printNode->getValue()<<endl;        printNode=printNode->getNext();    }}#endif // LINK_H

***************************************************

link.cc

#include"link.h"int main(void){    Link lin;    int selectNumber,delNumber,insertNumber;    int value;    printMenu();    while(cin>>selectNumber&&selectNumber!=5){        switch(selectNumber){        case 1:{            cout<<"Value:";            cin>>value;            lin.addNewNode(value);            break;        }        case 2:{            cout<<"Number of Node:";            cin>>delNumber;            lin.deleteNode(delNumber);            break;        }        case 3:{            cout<<"Value:";            cin>>value;            cout<<"Number of Node:";            cin>>insertNumber;            lin.insertNode(value,insertNumber);        }        case 4:{            lin.printNode();            break;        }        case 5:{            break;        }        default:{            cout<<"Wrong Number"<<endl;        }        }        printMenu();    }    return 0;}