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版)这本书中第二章线性表的源码抄下来,在学习的过程中有助于加深印 ...
随机推荐
- [oracle]TX行锁发生的常见场景(转贴)
TX行锁发生的常见场景: 1.当前会话要更新或删除的记录,已经被其他会话更新或删除. 2.对于表上有唯一索引的情况,多个会话插入或更新为相同的键值. 3.对于表上有位图索引的情况,多个会话即使更新不同 ...
- 001-jdk-数据结构-总览
一.集合类简介 1.1.背景 数组是很常用的一种的数据结构,用它可以满足很多的功能,但是,有时会遇到如下这样的问题: 1.需要该容器的长度是不确定的. 2.需要它能自动排序. 3.需要存储以键值对方式 ...
- java网络通信:异步非阻塞I/O (NIO)
转: java网络通信:异步非阻塞I/O (NIO) 首先是channel,是一个双向的全双工的通道,可同时读写,而输入输出流都是单工的,要么读要么写.Channel分为两大类,分别是用于网络数据的S ...
- C++ STL partial_sort_copy greater
#include <iostream>#include <deque>#include <algorithm>#include <vector>#inc ...
- MSE, MAE, Huber loss详解
转载:https://mp.weixin.qq.com/s/Xbi5iOh3xoBIK5kVmqbKYA https://baijiahao.baidu.com/s?id=16119517755261 ...
- Spring事务管理2----编程式事务管理
编程式事务管理 通过使用将Spring框架提供的TransactionTemplate模板注入到业务层来进行事务管理,这样对业务层原来的代码修改过多.不利于项目的后期维护. 以下是声明式事务管理的具体 ...
- windows和Linux下定时启动或关闭服务
http://blog.csdn.net/clare504/article/details/17410643 1.Windows下的定时启动程序可以采用系统的计划和任务,定时启动服务可以在计划任务中添 ...
- nginx反向代理本地 两台web负载均衡 使用ip+端口代理
环境: 本地外网ip:123.58.251.166 .配置index.html网页 [root@host---- conf.d]# cat /web/sing/index.html <h1> ...
- Saltstack之使用salt安装es6.0以上的head插件
本实验使用salt安装es6.0以上的head插件 ES6.0以上手动安装head插件参考:https://www.cnblogs.com/minseo/p/9117470.html 文件夹目录为 / ...
- 大话编程:非常有趣的循环(Python语言可视化海龟画图演示)
在日常工作和生活中,我们经常会遇到一件事情要重复做很多次的这种情况发生.在编程中,我们也会遇到这种情况,循环这种机制,就是专门用来处理这种需要不断重复做的事情的方法.通过几分钟的阅读,你将会掌握这种机 ...