您的位置:首页 > 理论基础 > 数据结构算法

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

2015-09-27 21:23 671 查看
实现了链表的大部分操作

一共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


欢迎在下方留言交流
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: