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版)这本书中第二章线性表的源码抄下来,在学习的过程中有助于加深印 ...
随机推荐
- ArcGIS超级工具SPTOOLS-线封闭,点集转面
一.线封闭 操作视频:https://weibo.com/tv/v/HvyvbAxKh?fid=1034:4375207666991674 将末端不闭合线,自动生成闭合的线,效果如下 原始线:末端不闭 ...
- ExtractIcon function Retrieves a handle to an icon from the specified executable file, DLL, or icon file.
https://msdn.microsoft.com/zh-cn/vstudio/ms648068(v=vs.90)
- [go]ini配置文件解析
// config.ini [app] server.port = 8080 name = resk enabled = false time = 10s ;我是一个注释 #mysql数据库配置 [m ...
- C++ nth_element greater
#include <iostream>#include <algorithm>#include <deque>#include <vector>#inc ...
- bs4笔记
1.网页输出乱码的解决办法 r= requests.get('https://www.baidu.com/') r.encoding = 'gbk2312' #有可能 gbk.utf-8 soup ...
- [ML] Linear Discriminant Analysis
虽然名字里有discriminat这个字,但却是生成模型,有点意思. 判别式 pk 生成式 阅读:生成方法 vs 判别方法 + 生成模型 vs 判别模型 举例: 判别式模型举例:要确定一个羊是山羊还是 ...
- delphi7 clientdataset 详解
delphi Midas SQLServer的自增字段的处理1.新增时,表中有自增字段,但是不希望用Refresh,直接ApplyUpdates直接看见自增字段的值在DataSetProvider.A ...
- golang web框架设计1:框架规划
GO WEB 编程13节,如何设计一个web框架 学习谢大的web框架设计 总体介绍 实现一个简易的web框架,我们采用mvc模式来进行开发. model:模型,代表数据结构.通常来说,模型类时包含查 ...
- VICA概述及架构设计
VICA全称VAT Invoice Client Platform(增值税发票客户端平台),顾名思义就是公司增值税发票业务相关处理的客户端集成平台.在VICA出现之前,公司发票开具的技术主要是依赖于A ...
- 一次Python操作数据库和excel过程
师从‘百测’besttest 最近牛大湿教了操作数据库和操作excel,写了一个小小的脚本,传入一个表名后,将表中所有数据写入excel中. 使用了pymysql,xlwt,需要自行安装. impor ...