数据结构 带头结点的单链表 操作大全 最全的链表操作(c++实现)

实现了链表的大部分操作

一共1800多行代码,22个功能,应该是目前网上最全的了

代码均为原创,如需转载请注明出处http://blog.csdn.net/u012350104

欢迎交流


采用多文件编程,层次清晰



对各个可能出错的地方进行了验证,拒绝bug


下面这个排序函数虽然功能正常完成,但实际上是我按照结果进行补救的结果,如果哪位大神帮忙,感激不尽

bool sort(string elementDetailType,string upOrDown);//按升(降)排序(冒泡)


实现的功能:

=====开始=====

==增加(1==

==删除(2==

==修改(3==

==查询(4==

==退出(0==

============


==============增加==============

==输入一个元素,到链表末尾-1==

==输入一个元素,到第n个位置--2==

==插入三个预设元素到表末尾---3==

============返回(0============

================================


=====================删除=================

==删除所有的元素(除第头节点)(双指针)-1==

==删除所有的元素(除第头节点)(递归)---2==

==删除第n个元素----------------------3==

==查找元素,并删除--------------------4==

==================返回(0================

=========================================


==============修改==============

==输入一个元素,替换第n个元素(1==

==把第n1个元素和第n2个交换--2==

==按升(降)排序(冒泡法)---3==

==移除所有重复节点----------4==

============返回(0============

================================


===================查询=================

==得到存储的元素个数----------------1==

==得到链表容量---------------------2==

==输出第n个元素的细节---------------3==

==输出 倒数 n个节点的信息(双指针)-4==

==输出 倒数 n个节点的信息(递归)---5==

==输出 中间 节点的信息(双指针)------6==

==输出 中间 节点的信息(递归)-------7==

==输出所有的元素细节----------------8==

==逆序 输出所有节点的信息(递归)-----9==

==通过某个元素细节找到元素位置--------10==

==查找元素并输出--------------------11==

===================返回(0=============

========================================


所有代码一共由7个文档组成,我打了个包,欢迎下载交流:

http://download.csdn.net/detail/u012350104/9143185


代码对应的函数关系讲解PPT:

http://download.csdn.net/detail/u012350104/9143181


代码量太大,我在这里只放出主函数及头文件,具体实现请按照上面的链接下载


//
//  main.cpp
//  链表
//
//  Created by Fred韩 on 15/9/2.
//  Copyright (c) 2015年 Fred韩. All rights reserved.
//

#include <iostream>
#include "LinkedList.h"
using namespace std;

int main(int argc, const char * argv[])
{
    cout<<"Copyright (c) 2015年 Fred韩. All rights reserved."<<endl;
    cout<<"实现了对链表的增删改查等操作"<<endl;
    cout<<endl;
    LinkedList list;
    list.startControlLoop();
    cout<<"程序已退出,感谢使用。"<<endl;
    cout<<"Copyright (c) 2015年 Fred韩. All rights reserved."<<endl;
    return 0;
}

//
//  ElemType.h
//  链表
//
//  Created by Fred韩 on 15/9/2.
//  Copyright (c) 2015年 Fred韩. All rights reserved.
//

#ifndef __ELEMTYPE_H__
#define __ELEMTYPE_H__

#include <iostream>
#include <string>
using namespace std;

class ElemType
{
protected:
    string m_flight;//航班号
    string m_type;//飞机型号
    string m_begin;//起飞时间
    string m_end;//到达时间
    string m_from;//出发地
    string m_to;//目的地
public:
    ElemType();//构造函数,不进行任何操作,创建数组时,系统会自动调用无参数的构造函数,但因重载过下面的构造函数,系统默认的构造函数失效,需要手动写出这个无参数的构造函数才行
    ElemType(string flight,string type,string begin,string end,string from,string to);//直接设置所有细节的构造函数
    ElemType(const ElemType &element);//复制构造函数
    
    bool showDetail();//在控制台显示细节
    bool setDetail(string flight,string type,string begin,string end,string from,string to);//设置所有细节
    bool inputDetail();//在控制台输入细节
    
    //对成员属性进行封装,set方法中包含合法性验证
    string getFlight();
    static bool isFlightRight(string flight);
    bool setFlight(string flight);
    
    string getType();
    static bool isTypeRight(string type);
    bool setType(string type);
    
    string getBegin();
    static bool isBeginRight(string begin);
    bool setBegin(string begin);
    
    string getEnd();
    static bool isEndRight(string end);
    bool setEnd(string end);
    
    string getFrom();
    static bool isFromRight(string from);
    bool setFrom(string from);
    
    string getTo();
    static bool isToRight(string to);
    bool setTo(string to);
    
    string getTime();//通过起飞时间和降落时间计算出飞行时间长度(按飞行时间不超过24小时计算)
    static bool isEqual(ElemType elem1,ElemType elem2);//判断两个ElemType类型的对象是否相同
};

#endif

//__ELEMTYPE_H__

//
//  Node.h
//  链表
//
//  Created by Fred韩 on 15/9/2.
//  Copyright (c) 2015年 Fred韩. All rights reserved.
//

#ifndef __NODE_H__
#define __NODE_H__

#include "ElemType.h"

class Node
{
protected:
    ElemType m_data;
    Node* m_next;
public:
    Node();
    Node(string flight,string type,string begin,string end,string from,string to);
    Node* getNext();
    bool setNext(Node* next);
    ElemType& getData();
    bool setData(ElemType data);
};

#endif//__NODE_H__

//
//  LinkedList.h
//  链表
//
//  Created by Fred韩 on 15/9/2.
//  Copyright (c) 2015年 Fred韩. All rights reserved.
//

#ifndef __LINKED_LIST_H__
#define __LINKED_LIST_H__

#include "Node.h"
#include "ElemType.h"

class LinkedList
{
protected:
    Node* m_head;
public:
    LinkedList();//构造函数,初始化头指针,并添加开始节点
    
    Node* getHead();
    bool setHead(Node* head);
    
    bool addNode();//添加3个预设的节点,到链表末尾
    bool addNode(Node* node);//添加节点到链表末尾
    bool addNode(Node* node,size_t n);//添加节点,使其成为第n个节点,其余节点后移
    bool inputNode();//输入一个节点的信息,并添加到链表的末尾
    bool inputNode(size_t n);//输入一个节点的信息,使其成为第n个节点,其余节点后移
    
    bool delNode();//删除所有的节点(除第头节点)(双指针)
    bool delNode2();//删除所有的节点(除第头节点)(递归)
    void delNode2Recursive(Node* node);//删除所有的节点的 递归函数
    bool delNode(size_t n);//删除第n个节点
    bool delNode(string elementDetailType,string elementDetail);//输入要查找的条目和要查找的内容,找到对应节点并删除
    
    bool replaceNode(Node* node,size_t n);//用一个节点,替换掉第n个节点
    bool exchangeNode(size_t n1,size_t n2);//把第n1个节点,与第n2个节点,交换位置
    bool sort(string elementDetailType,string upOrDown);//按升(降)排序(冒泡)
    bool removeSameNode();//移除所有重复节点
    
    size_t getLength();//得到节点数
    Node* getNode(size_t n);//得到第n个节点的指针
    
    bool showNode();//输出所有节点的信息
    bool showNodeStatFromEnd();//逆序 输出所有节点的信息(递归)
    void showNodeStatFromEndRecursive(Node* node);//逆序 输出所有节点的信息的 递归函数
    bool showNode(size_t n);//输出第n个节点的信息
    bool showNodeStartFromEnd(size_t n);//输出 倒数 第n个节点的信息(双指针)
    bool showNodeStartFromEnd2(size_t n);//输出 倒数 第n个节点的信息(递归)
    void showNodeStartFromEnd2Recursive(Node* node,size_t &n);//输出 倒数 第n个节点的信息的 递归函数
    bool showCentralNode();//输出 中间 节点的信息(双指针)
    bool showCentralNode2();//输出 中间 节点的信息(递归)
    void showCentralNode2Recursive(Node* node,int &n,int &max);//输出 中间 节点的信息的 递归函数
    bool showNode(string elementDetailType,string elementDetail);//输入要查找的条目和要查找的内容,找到对应节点并输出
    size_t findNode(string elementDetailType,string elementDetail);//传入查找的条目和要查找的内容,输出节点位置
    
    static int inputAInt(int min = 0,int max = 9,int defaultValue = -1);//从键盘读取,限制为一个min到max间的整数,非法情况返回defaultValue
    void startControlLoop();//打开控制界面
    
    ~LinkedList();//析构函数,释放new出来的空间
};

#endif//__LINKED_LIST_H__ 1878

欢迎在下方留言交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值