C++单链表类(带头结点)
Link.h
#ifndef _LINK_0411
#define _LINK_0411
#include <string>
#include <iostream>
//定义数据类型为整型
typedef int ElementType;
//定义结点
struct Node
{
ElementType data;
Node * next;
};
//带头结点链表
class Link
{
public:
Link();
~Link();
//选择排序
void select_sort();
//冒泡排序
void bubble_sort();
//头部插入
void insert_head(ElementType data);
//尾部插入
void insert_tail(ElementType data);
//查找结点,返回序号,如果不存在返回-1
int find(ElementType data);
//删除结点
bool delete_node(int pos);
//逆置
void reverse();
//打印链表
void display();
//打印提示信息
void printhelp();
//返回长度
int size();
private:
//头结点指针
Node * pHead;
//链表长度
size_t iSize;
};
#endif
Link.cpp
#include "Link.h" Link::Link():pHead(NULL), iSize()
{
pHead = new Node;
pHead->next = NULL;
} Link::~Link()
{
Node * tmpNode = NULL;
Node * p = pHead->next;
while (p != NULL)
{
tmpNode = p->next;
delete p;
p = tmpNode;
}
delete tmpNode;
tmpNode = NULL; delete pHead;
p = NULL; iSize = ;
} /**********************************
链表选择排序(递增)
***********************************/
void Link::select_sort()
{
Node * p , *q;
int temp; for (p = pHead; p != NULL; p = p->next)
for (q = p->next; q != NULL; q = q->next)
{
if (p->data > q->data)
{
temp = p->data;
p->data = q->data;
q->data = temp;
}
}
} /**********************************
链表冒泡排序(递增)
***********************************/
void Link::bubble_sort()
{
Node *p;
int temp; /************************************************************************/
/* 冒泡排序是每次从头开始比较相邻的两个数,大小相反则交换,结束的 */
/* 条件是这一轮中没有发生交换,flag用来记录是否发生了交换 */
/************************************************************************/
int flag;
while (true)
{
flag = ;
for (p = pHead; p->next != NULL; p = p->next)
{
if (p->data > p->next->data)
{
temp = p->data;
p->data = p->next->data;
p->next->data = temp;
flag = ;
}
}
if (flag == )
break;
}
} /********************************
链表头部插入
*****************************/
void Link::insert_head(ElementType data)
{
Node * tmpNode = new Node;
tmpNode->data = data; tmpNode->next = pHead->next;
pHead->next = tmpNode; iSize++; tmpNode = NULL;
} /********************************
链表尾部插入
*****************************/
void Link::insert_tail(ElementType data)
{
Node * tmpNode = new Node;
tmpNode->data = data;
tmpNode->next = NULL; Node * p = NULL;
p = pHead;
while (p->next != NULL)
{
p = p->next;
} p->next = tmpNode;
iSize++; //delete tmpNode;
tmpNode = NULL;
//delete p;
p = NULL;
} /********************************
打印链表
*****************************/
void Link::display()
{
int count = ;
Node * tmpNode = NULL; tmpNode = pHead->next;
while (tmpNode != NULL)
{
std::cout<<tmpNode->data<<" ";
tmpNode = tmpNode->next; /********************************
* 输出格式控制,每行10个
**********************************/
if (count % == )
{
std::cout<<std::endl;
}
count++;
}
std::cout<<std::endl;
tmpNode = NULL;
} /********************************
查找结点
*****************************/
int Link::find(ElementType data)
{
int pos = ;
Node * tmpNode = NULL; tmpNode = pHead->next;
while (tmpNode != NULL)
{
if ( tmpNode->data == data)
{
return pos;
}
tmpNode = tmpNode->next;
pos++;
} tmpNode = NULL;
return -;
} /********************************
删除结点
*****************************/
bool Link::delete_node(int pos)
{
//序号超过链表范围则报错退出
if (pos > iSize -)
{
return false;
}
else
{
int k = ;
Node * tmpNode = NULL;
tmpNode = pHead;
while ( k < pos)
{
tmpNode = tmpNode->next;
k++;
}
Node * p = NULL;
p = tmpNode->next; tmpNode->next = tmpNode->next->next;
delete p;
p = NULL;
iSize--;
return true;
}
} /********************************
返回链表的长度
*****************************/
int Link::size()
{
return iSize;
} /********************************
链表的逆置
*****************************/
void Link::reverse()
{
Node * preNode = NULL;
Node * curNode = NULL;
Node * afterNode = NULL; if ( iSize == || iSize == )
{
return;
}
else if ( iSize >= )
{
preNode = pHead->next;
curNode = preNode->next;
afterNode = curNode->next; preNode->next = NULL; while (afterNode != NULL)
{
curNode->next = preNode; preNode = curNode;
curNode = afterNode; afterNode = afterNode->next;
} /********************************************************************
* 将当前结点的next置为前一个结点的过程是在每一次循环的开始,而最后一次
* 循环后无法进入下一次循环,需要补一次设置curNode的next的过程
*********************************************************************/
curNode->next = preNode; pHead->next = curNode;
}
preNode = NULL;
curNode = NULL;
afterNode = NULL;
} void Link::printhelp()
{
std::cout<<"*****************************************\n";
std::cout<<"当前链表为:"<<std::endl;
if (iSize == )
std::cout<<"NULL"<<std::endl;
else
display();
std::cout<<"输入你的选择:\n"
"0.从头部插入结点\n"
"1.从尾部插入结点\n"
"2.逆置链表\n"
"3.打印链表\n"
"4.删除结点\n"
"5.输出链表长度\n"
"6.查找结点\n"
"7.选择排序\n"
"8.冒泡排序\n"
"9.退出"<<std::endl;
std::cout<<"*****************************************\n";
}
main函数
// linklist.cpp : 定义控制台应用程序的入口点。
// #include "Link.h" int main(int argc, char * argv[])
{
Link myLink;
int pos;
char choice;
ElementType find_num = ;
int delchoice; for (int i = ; i < ; i ++)
{
myLink.insert_head(rand()%);
} myLink.printhelp();
std::cout<<"请选择:";
while ( std::cin>> choice)
{
switch(choice)
{
case '':
case '':
std::cout<<"\n暂无此功能!\n";
break;
case '':
myLink.reverse();
std::cout<<"\n逆置成功!\n";
break;
case '':
myLink.display();
std::cout<<"\n打印成功!\n";
break;
case '':
std::cout<<"\n输入要删除的节点序号:";
std::cin>>delchoice;
if (myLink.delete_node(delchoice) == true)
{
std::cout<<"\n删除成功!\n";
}
else
{
std::cout<<"\n删除失败!\n";
}
break;
case '':
std::cout<<"链表长为:"<<myLink.size()<<std::endl;
break;
case '':
goto exit;
break;
case '':
myLink.select_sort();
break;
case '':
myLink.bubble_sort();
break;
case '':
goto exit;
break;
default:
break;
}
myLink.printhelp();
std::cout<<"请选择:";
} exit:
system("pause");
return ;
}
运行:
C++单链表类(带头结点)的更多相关文章
- C/C++语言实现单链表(带头结点)
彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按 ...
- C实现头插法和尾插法来构建单链表(带头结点)
我在之前一篇博客<C实现头插法和尾插法来构建单链表(不带头结点)>中具体实现了怎样使用头插法和尾插法来建立一个不带头结点的单链表,可是在实际使用中.我们用的最多的还是带头结点的单链表.今天 ...
- 数据结构实验2:C++实现单链表类
太简单了,直接贴题目然后上代码. 题目: 实验2 2.1 实验目的 熟练掌握线性表的链式存储结构. 熟练掌握单链表的有关算法设计. 根据具体问题的需要,设计出合理的表示数据的链式存储结构,并设计相关算 ...
- 数据结构-单链表-类定义2-C++
上一次的C++链表实现两个单链表的连接不太理想,此次听了一些视频课,自己补了个尾插法,很好的实现了两个链表的连接,当然了,我也是刚接触,可能是C++的一些语法还不太清楚,不过硬是花了一些时间尽量在数据 ...
- 求单链表L各结点的阶乘之和(c语言)
链表需要用到指针 阶乘需要用到递归 链表中的注意事项: 1.链表L是否等于NULL ----------是循环结束的条件 2.链表L->Data ---------取链表L中各个结点的值 3.L ...
- 数据结构-单链表-类定义C++
原理可访问https://www.cnblogs.com/yang901112/p/11674333.html 头文件 #ifndef RLIST_H #define RLIST_H #include ...
- Intersection of Two Linked Lists (求两个单链表的相交结点)
题目描述: Write a program to find the node at which the intersection of two singly linked lists begins. ...
- 单链表之C++实现
在实现单链表时要注意对单链表的逻辑存储.物理存储有清晰的概念. 如上图链表已经完成,其逻辑结构如上.当需要对其进行操作,比如插入.删除,通常需要引 入指针,如上的ptr1.ptr2.在编程时一定要注意 ...
- 线性表源码分享(c++),包含顺序表、单链表、循环链表、双向链表
---恢复内容开始--- 我是一个c++和数据结构的初学者,本文主要是把清华大学出版社的数据结构(用面向对象方法与c++语言描述)(第2版)这本书中第二章线性表的源码抄下来,在学习的过程中有助于加深印 ...
随机推荐
- 【转】Mac find 去除 “Permission denied” 信息的方法
转自 https://segmentfault.com/a/1190000007058875 Mac 下查找文件,最简单的方法应该是 mdfind filename 等同于 mdfind -name ...
- qt 创建及调用QT的 DLL
先讲一下对QT动态链接库的调用方法,主要包括: 1.显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法 2.显示链接DLL,调用DLL中类对象.成员函数.(通过对象即可实现类成员函数 ...
- ubantu 安装boost库 c++connector
安装libmysqlcppconn: sudo apt-get install libmysqlcppconn-dev 安装libboost: sudo apt-get install libboos ...
- DNS -- 快速清除DNS缓存
MAC: sudo dscacheutil -flushcache Linux: dnsmasq的是一个轻量级的DNS.TFTP和DHCP服务器.它的目的是给局域网提供配对的DNS和DHCP服务. d ...
- Facebook币Libra学习-2.交易生命周期
交易生命周期 为了更加深入的理解Libra的交易生命周期,我们将跟随一个交易的全过程,从其被提交到Libra validator始,直至其被添加到区块链上止.我们将“放大”来看每个validator逻 ...
- Android 显示系统:OpenGL简介和Gralloc代码分析
一.OpenGL ES与EGL Android的GUI系统是基于OpenGL/EGL来实现的. 由于OpenGL是通用函数库,在不同平台系统上需要被“本土化”——把它与具体平台的窗口系统建立起关联,F ...
- Oracle11g安装与卸载教程
1.1,前言: 电脑太卡,鄙人穷屌丝啊,没钱买新电脑,想想周六日还要耍游戏就给电脑重做了个系统,糟糕的是电脑上的各种环境,工具都需要重新装一边,包括oracle数据库- -,依稀记得昨天装了一上午的数 ...
- uni-app 使用 iconfont 图标 自定义图标
uni-app 的uni-ui 的 Icon 图标组件,裡面的图标只是移动端常见的图标,对于一些其他需求所要显示的图标,这个是完全不够用.那么怎么办?模仿它的组件,用阿里巴巴图标矢量库的图标,自己定义 ...
- python3 枚举enum定义和使用
两种方式定义枚举类: 1.直接使用Enum列出多个枚举值来创建枚举类. 2.通过集成Enum基类派生枚举类. 程序示范: 1.直接使用Enum列出多个枚举值来创建枚举类. from enum impo ...
- Python排序算法之选择排序定义与用法示例
Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...