《C++数据结构-快速拾遗》 手写链表
注释:吕鑫老师C++对于找工作真的是很好的教程,基本什么方面都讲的很细致,但是对于大多数人只有快进快进再快进~~
注释:基本链表信息自己百度,这里只是一个快速拾遗过程。
1.链表定义
typedef int DATA;//int的别名,为了便于管理 //定义链表一个链节点
typedef struct SNode
{
DATA data;//数据,可以是结构体和类等,4字节
SNode *pNext;//指针,指向下一个节点,4字节
};
2.插入一个节点
#include <iostream> using namespace std; //#define DATA int
typedef int DATA;//int的别名,为了便于管理 //定义链表一个链节点
typedef struct SNode
{
DATA data;//数据,可以是结构体和类等,4字节
SNode *pNext;//指针,指向下一个节点,4字节
};
SNode* g_pHead = NULL;//第一个链表是空链表
//从头插入一个数据
void AddHead(DATA data)
{
SNode* p = new SNode;//申请一个堆空间,8字节
p->data = data;
p->pNext = g_pHead;
g_pHead = p;//把新插入的节点当做头
}
int main(int argc, char**argv[])
{
AddHead();
AddHead();
AddHead();
cout<<g_pHead->data<<endl<<g_pHead->pNext->data<<endl<<g_pHead->pNext->pNext->data<<endl;
return ;
}

3.从尾部插入一个节点
#include <iostream> using namespace std; //#define DATA int
typedef int DATA;//int的别名,为了便于管理 //定义链表一个链节点
typedef struct SNode
{
DATA data;//数据,可以是结构体和类等,4字节
SNode *pNext;//指针,指向下一个节点,4字节
};
SNode* g_pHead = NULL;//第一个链表是空链表
//从尾插入一个数据
void AddTail(DATA data)
{
SNode* p = g_pHead;//防止改变头结点的指针
//建立新的节点
SNode* p1 = new SNode;
p1->data = data;
p1->pNext = NULL;
if(!p)//如果一开始就是空链表
{
g_pHead = p1;
return;
}
while(p->pNext)//找到最尾部的节点
{
p = p->pNext;
}
p->pNext = p1;
}
int main(int argc, char**argv[])
{
/* AddHead(1);
AddHead(2);
AddHead(3); */
AddTail();
AddTail();
AddTail();
while(g_pHead)
{
cout<<g_pHead->data<<endl;
g_pHead = g_pHead->pNext;
}
//cout<<g_pHead->data<<endl<<g_pHead->pNext->data<<endl<<g_pHead->pNext->pNext->data<<endl;
return ;
}

4.修改节点数据
#include <iostream> using namespace std; //#define DATA int
typedef int DATA;//int的别名,为了便于管理 //定义链表一个链节点
typedef struct SNode
{
DATA data;//数据,可以是结构体和类等,4字节
SNode *pNext;//指针,指向下一个节点,4字节
};
SNode* g_pHead = NULL;//第一个链表是空链表
//从尾插入一个数据
void AddTail(DATA data)
{
SNode* p = g_pHead;//防止改变头结点的指针
//建立新的节点
SNode* p1 = new SNode;
p1->data = data;
p1->pNext = NULL;
if(!p)//如果一开始就是空链表
{
g_pHead = p1;
return;
}
while(p->pNext)//找到最尾部的节点
{
p = p->pNext;
}
p->pNext = p1;
}
void Modify(DATA data, DATA newData)
{
SNode* p = g_pHead;
SNode* p1 = new SNode;
if (!p)
{
p1->data = newData;
p1->pNext = NULL;
g_pHead = p1;
return;
}
while(p)
{
if (p->data==data)
{
p->data = newData;
}
p = p->pNext;
}
}
int main(int argc, char**argv[])
{
/* AddHead(1);
AddHead(2);
AddHead(3); */
AddTail();
AddTail();
AddTail();
Modify(,);
while(g_pHead)
{
cout<<g_pHead->data<<endl;
g_pHead = g_pHead->pNext;
}
cout<<"hell2";
return ;
}

5.查找和打印链表
#include <iostream> using namespace std; //#define DATA int
typedef int DATA;//int的别名,为了便于管理 //定义链表一个链节点
typedef struct SNode
{
DATA data;//数据,可以是结构体和类等,4字节
SNode *pNext;//指针,指向下一个节点,4字节
};
SNode* g_pHead = NULL;//第一个链表是空链表
//从尾插入一个数据
void AddTail(DATA data)
{
SNode* p = g_pHead;//防止改变头结点的指针
//建立新的节点
SNode* p1 = new SNode;
p1->data = data;
p1->pNext = NULL;
if(!p)//如果一开始就是空链表
{
g_pHead = p1;
return;
}
while(p->pNext)//找到最尾部的节点
{
p = p->pNext;
}
p->pNext = p1;
}
//查找某个数据
bool Find(DATA data)
{
SNode* p = g_pHead;
while(p)
{
if(p->data == data) return true;
p = p->pNext;
}
return false;
}
void print()
{
SNode* p = g_pHead;
while(p)
{
cout<<p->data<<endl;
p = p->pNext;
}
}
int main(int argc, char**argv[])
{
/* AddHead(1);
AddHead(2);
AddHead(3); */
AddTail();
AddTail();
AddTail();
//Modify(13,16);
print();
cout<<"shifou : "<<Find();
return ;
}

6.删除链表节点
#include <iostream> using namespace std; //#define DATA int
typedef int DATA;//int的别名,为了便于管理 //定义链表一个链节点
typedef struct SNode
{
DATA data;//数据,可以是结构体和类等,4字节
SNode *pNext;//指针,指向下一个节点,4字节
};
SNode* g_pHead = NULL;//第一个链表是空链表
//从尾插入一个数据
void AddTail(DATA data)
{
SNode* p = g_pHead;//防止改变头结点的指针
//建立新的节点
SNode* p1 = new SNode;
p1->data = data;
p1->pNext = NULL;
if(!p)//如果一开始就是空链表
{
g_pHead = p1;
return;
}
while(p->pNext)//找到最尾部的节点
{
p = p->pNext;
}
p->pNext = p1;
}
//删除某个节点
bool Delete(DATA data)
{
SNode* p = g_pHead;//当前节点
SNode* p1 = NULL;//下一个节点
if(!p) return false;//空链表直接返回
if(p->data == data )//删除第一个节点
{
g_pHead = p->pNext;
delete p;
return true;
}
while(p)//删除中间和结尾节点
{
if(p->data == data)
{
p1->pNext = p->pNext;
delete p;
return true;
}
p1 = p;
p = p->pNext;
}
return false;
}
void print()
{
SNode* p = g_pHead;
while(p)
{
cout<<p->data<<endl;
p = p->pNext;
}
}
int main(int argc, char**argv[])
{
/* AddHead(1);
AddHead(2);
AddHead(3); */
AddTail();
AddTail();
AddTail();
//Modify(13,16);
Delete();
print();
cout<<"shifou : "<<Find();
return ;
}

7.排序链表
以后面试再看链表外排和内排:https://chuanke.baidu.com/v1760453-135963-545032.html
#include <iostream> using namespace std; //#define DATA int
typedef int DATA;//int的别名,为了便于管理
//定义一个结构体当做数据
/* typedef struct DATA
{
int nNumb;
char sName[20];
float fMath;
}; */
//定义链表一个链节点
typedef struct SNode
{
DATA data;//数据,可以是结构体和类等,4字节
SNode *pNext;//指针,指向下一个节点,4字节
}SNode;
SNode* g_pHead = NULL;//第一个链表是空链表
//从尾插入一个数据
void AddTail(DATA data)
{
SNode* p = g_pHead;//防止改变头结点的指针
//建立新的节点
SNode* p1 = new SNode;
p1->data = data;
p1->pNext = NULL;
if(!p)//如果一开始就是空链表
{
g_pHead = p1;
return;
}
while(p->pNext)//找到最尾部的节点
{
p = p->pNext;
}
p->pNext = p1;
}
//打印全部节点数据
void print()
{
SNode* p = g_pHead;
while(p)
{
cout<<p->data<<endl;
p = p->pNext;
}
}
//交换数据的排序
void sortByNum(bool reverse = true)
{
SNode* p = g_pHead;
SNode* m = NULL;
while(p)
{
m = p->pNext;
while(m)
{
if(p->data > m->data && reverse)
{
DATA midData;
midData = p->data;
p->data = m->data;
m->data = midData;
}
else if(p->data < m->data && !reverse)
{
DATA midData;
midData = p->data;
p->data = m->data;
m->data = midData;
}
m = m->pNext;
}
p=p->pNext;
}
}
int main(int argc, char*argv[])
{
/* AddHead(1);
AddHead(2);
AddHead(3); */
AddTail();
AddTail();
AddTail();
AddTail();
AddTail();
AddTail();
//Modify(13,16);
//Delete(13);
print();
sortByNum(false);
print();
return ;
}

8.总链表(结构体版)
#include <iostream> using namespace std; //#define DATA int
typedef int DATA;//int的别名,为了便于管理
//定义一个结构体当做数据
/* typedef struct DATA
{
int nNumb;
char sName[20];
float fMath;
}; */
//定义链表一个链节点
typedef struct SNode
{
DATA data;//数据,可以是结构体和类等,4字节
SNode *pNext;//指针,指向下一个节点,4字节
}SNode;
SNode* g_pHead = NULL;//第一个链表是空链表
//从尾插入一个数据
void AddTail(DATA data)
{
SNode* p = g_pHead;//防止改变头结点的指针
//建立新的节点
SNode* p1 = new SNode;
p1->data = data;
p1->pNext = NULL;
if(!p)//如果一开始就是空链表
{
g_pHead = p1;
return;
}
while(p->pNext)//找到最尾部的节点
{
p = p->pNext;
}
p->pNext = p1;
}
//从头插入一个数据
void AddHead(DATA data)
{
SNode* p = new SNode;//申请一个堆空间,8字节
p->data = data;
p->pNext = g_pHead;
g_pHead = p;//把新插入的节点当做头
}
//修改链表节点数据
void Modify(DATA data, DATA newData)
{
SNode* p = g_pHead;
SNode* p1 = new SNode;
if (!p)
{
p1->data = newData;
p1->pNext = NULL;
g_pHead = p1;
return;
}
while(p)
{
if (p->data==data)
{
p->data = newData;
}
p = p->pNext;
}
}
//查找某个数据
bool Find(DATA data)
{
SNode* p = g_pHead;
while(p)
{
if(p->data == data) return true;
p = p->pNext;
}
return false;
}
//删除某个节点
bool Delete(DATA data)
{
SNode* p = g_pHead;//当前节点
SNode* p1 = NULL;//下一个节点
if(!p) return false;//空链表直接返回
if(p->data == data )//删除第一个节点
{
g_pHead = p->pNext;
delete p;
return true;
}
while(p)//删除中间和结尾节点
{
if(p->data == data)
{
p1->pNext = p->pNext;
delete p;
return true;
}
p1 = p;
p = p->pNext;
}
return false;
}
//打印全部节点数据
void print()
{
SNode* p = g_pHead;
while(p)
{
cout<<p->data<<endl;
p = p->pNext;
}
}
//交换数据的排序
void sortByNum(bool reverse = true)
{
SNode* p = g_pHead;
SNode* m = NULL;
while(p)
{
m = p->pNext;
while(m)
{
if(p->data > m->data && reverse)
{
DATA midData;
midData = p->data;
p->data = m->data;
m->data = midData;
}
else if(p->data < m->data && !reverse)
{
DATA midData;
midData = p->data;
p->data = m->data;
m->data = midData;
}
m = m->pNext;
}
p=p->pNext;
}
}
int main(int argc, char*argv[])
{
/* AddHead(1);
AddHead(2);
AddHead(3); */
AddTail();
AddTail();
AddTail();
AddTail();
AddTail();
AddTail();
//Modify(13,16);
//Delete(13);
print();
sortByNum(false);
print();
return ;
}
9.总链表(类版本)
#include <iostream> using namespace std;
/*
typedef struct DATA
{
int sNum;
char sName[20];
}DATA;
*/
typedef int DATA;
typedef struct SNode
{
DATA data;
SNode* pNext;
}SNode;
class CList
{
public:
CList();
~CList();
CList(CList&p);
void AddTail(DATA data);
void AddHead(DATA data);
void Modify(DATA data, DATA newData);
bool Find(DATA data);
bool Delete(DATA data);
void print();
void sortByNum(bool reverse = true);
private:
SNode* m_pHead;
}; int main(int argc,char*argv[])
{
CList list1, list2;
list1.AddHead();
list1.AddHead();
list1.AddHead();
list1.AddHead();
list1.AddHead();
list1.AddHead();
list1.print(); list1.sortByNum();
list1.print();
list2 = list1;
list2.print();
return ;
} CList::CList()
{
m_pHead = NULL;//
} CList::~CList()
{//析构函数,C++自动清除堆空间数据
}
CList::CList(CList& p)
{
memcpy(this,&p,sizeof(p));//拷贝构造函数
}
//从尾插入一个数据
void CList::AddTail(DATA data)
{
SNode* p = m_pHead;//防止改变头结点的指针
//建立新的节点
SNode* p1 = new SNode;
p1->data = data;
p1->pNext = NULL;
if (!p)//如果一开始就是空链表
{
m_pHead = p1;
return;
}
while (p->pNext)//找到最尾部的节点
{
p = p->pNext;
}
p->pNext = p1;
}
//从头插入一个数据
void CList::AddHead(DATA data)
{
SNode* p = new SNode;//申请一个堆空间,8字节
p->data = data;
p->pNext = m_pHead;
m_pHead = p;//把新插入的节点当做头
}
//修改链表节点数据
void CList::Modify(DATA data, DATA newData)
{
SNode* p = m_pHead;
SNode* p1 = new SNode;
if (!p)
{
p1->data = newData;
p1->pNext = NULL;
m_pHead = p1;
return;
}
while (p)
{
if (p->data == data)
{
p->data = newData;
}
p = p->pNext;
}
}
//查找某个数据
bool CList::Find(DATA data)
{
SNode* p = m_pHead;
while (p)
{
if (p->data == data) return true;
p = p->pNext;
}
return false;
}
//删除某个节点
bool CList::Delete(DATA data)
{
SNode* p = m_pHead;//当前节点
SNode* p1 = NULL;//下一个节点
if (!p) return false;//空链表直接返回
if (p->data == data)//删除第一个节点
{
m_pHead = p->pNext;
delete p;
return true;
}
while (p)//删除中间和结尾节点
{
if (p->data == data)
{
p1->pNext = p->pNext;
delete p;
return true;
}
p1 = p;
p = p->pNext;
}
return false;
}
//打印全部节点数据
void CList::print()
{
SNode* p = m_pHead;
while (p)
{
cout << p->data << endl;
p = p->pNext;
}
}
//交换数据的排序
void CList::sortByNum(bool reverse)
{
SNode* p = m_pHead;
SNode* m = NULL;
while (p)
{
m = p->pNext;
while (m)
{
if (p->data > m->data && reverse)
{
DATA midData;
midData = p->data;
p->data = m->data;
m->data = midData;
}
else if (p->data < m->data && !reverse)
{
DATA midData;
midData = p->data;
p->data = m->data;
m->data = midData;
}
m = m->pNext;
}
p = p->pNext;
}
}
9.改进版
《C++数据结构-快速拾遗》 手写链表的更多相关文章
- codevs1281 矩阵乘法 快速幂 !!!手写乘法取模!!! 练习struct的构造函数和成员函数
对于这道题目以及我的快速幂以及我的一节半晚自习我表示无力吐槽,, 首先矩阵乘法和快速幂没必要太多说吧,,嗯没必要,,我相信没必要,,实在做不出来写两个矩阵手推一下也就能理解矩阵的顺序了,要格外注意一些 ...
- 《C++数据结构-快速拾遗》 树结构
1.简单的二叉树结构 #include <iostream> using namespace std; typedef int DATA; //建立二叉树的简单结构 typedef str ...
- 《C++数据结构-快速拾遗》 基础常识
1.命名空间函数 namespace wjy { void print() { cout<<"; } int load(int num) { return num; } } us ...
- 教你如何使用Java手写一个基于链表的队列
在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...
- 算法是什么(二)手写个链表(java)
算法是什么(二)手写个链表(java) liuyuhang原创,未经允许禁止转载 目录 算法是什么(〇) 很多语言的API中都提供了链表实现,或者扩展库中实现了链表. 但是更多的情况下,Map(或 ...
- [快速傅立叶变换&快速傅里叶变换]【旧 手写笔记】
$FFT$好美啊 参考资料: 1.算法导论 2.Miskcoo 3.Menci 4.虚数的意义-阮一峰 简单说一下,具体在下面的图片 实现: 可以用$complex$也可以手写 和计算几何差不多 注意 ...
- <数据结构系列1>封装自己的数组——手写动态泛型数组(简化版ArrayList)
哈哈,距离上一次写博客已经快过去半个月了,这这这,好像有点慢啊,话不多说,开始我们的手写动态泛型数组 首先是我们自己写一个自己的动态数组类,代码如下所示: public class Array< ...
- 手写数字识别——利用keras高层API快速搭建并优化网络模型
在<手写数字识别——手动搭建全连接层>一文中,我们通过机器学习的基本公式构建出了一个网络模型,其实现过程毫无疑问是过于复杂了——不得不考虑诸如数据类型匹配.梯度计算.准确度的统计等问题,但 ...
- (手写识别) Zinnia库及其实现方法研究
Zinnia库及其实现方法研究 (转) zinnia是一个开源的手写识别库.采用C++实现.具有手写识别,学习以及文字模型数据制作转换等功能. 项目地址 [http://zinnia.sourcefo ...
随机推荐
- Window下Tomcat单机部署多应用
1. 新增tomcat相关环境变量 如上图,有两个tomcat,tomcat1和tomcat2 2.修改catalina.bat 文件 第一个tomcat不变 第二个tamcat的catalina.b ...
- MapReduce案例:统计共同好友+订单表多表合并+求每个订单中最贵的商品
案例三: 统计共同好友 任务需求: 如下的文本, A:B,C,D,F,E,OB:A,C,E,KC:F,A,D,ID:A,E,F,LE:B,C,D,M,LF:A,B,C,D,E,O,MG:A,C,D,E ...
- 主流开源SQL(on Hadoop)总结
转载至 大数据杂谈 (BigdataTina2016),同时参考学习 http://www.cnblogs.com/barrywxx/p/4257166.html 进行整理. 使用SQL 引擎一词是有 ...
- ML: 降维算法-LE
PCA的降维原则是最小化投影损失,或者是最大化保留投影后数据的方差.LDA降维需要知道降维前数据分别属于哪一类,而且还要知道数据完整的高维信息.拉普拉斯特征映射 (Laplacian Eigenmap ...
- 【java】函数重载
重载概念(Overloading): 在同一个类中,允许存在一个以上的同名函数,主要他们的参数个数和参数类型不同即可 重载特点: 与返回值无关,只和参数类型和参数个数有关系(重载只和参数列表有关系) ...
- 关于SQL Server 无法生成 FRunCM 线程(不完全)
在五一的前一天,准备启动数据库完成我剩下的项目代码时,数据库配置管理器出现了一个让人蛋疼的问题sqlserv配置管理器出现请求失败或服务器未及时响应关于这个问题的处理方法,经过我两个小时的百度,网上对 ...
- mysql 高可用架构
什么是高可用 不可用出现的情况 如何实现高可用 第一种方法 第二种方法 MMM 和 MHA MHA更好的处理方式 安装步骤 优缺点 读写分离
- 关于JAVA文件的字节转字符练习
PrintWriter向文件写入字符,接收Writer对象.BufferedWriter是Writer对象还具有缓冲作用让写入更加高效,同时最重要的是BufferedWriter接 收转换流对象Fil ...
- g++编译后中文显示乱码解决方案(c++)
g++编译后中文显示乱码解决方案 环境:Windows 10 专业版 GCC版本:5.3.0 测试代码: 1 #include <iostream> 2 using namespace ...
- python--BUG--python socket.error: [Errno 9] Bad file descriptor的解决办法
这个错误很明显 ,是因为关闭了套接字对象后,又再次去调用了套接字对象,此时套接字链接已经被关闭,不能再去调用,所以才会出现这种错误,复查一下代码,很快就可以解决.