注释:吕鑫老师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++数据结构-快速拾遗》 手写链表的更多相关文章

  1. codevs1281 矩阵乘法 快速幂 !!!手写乘法取模!!! 练习struct的构造函数和成员函数

    对于这道题目以及我的快速幂以及我的一节半晚自习我表示无力吐槽,, 首先矩阵乘法和快速幂没必要太多说吧,,嗯没必要,,我相信没必要,,实在做不出来写两个矩阵手推一下也就能理解矩阵的顺序了,要格外注意一些 ...

  2. 《C++数据结构-快速拾遗》 树结构

    1.简单的二叉树结构 #include <iostream> using namespace std; typedef int DATA; //建立二叉树的简单结构 typedef str ...

  3. 《C++数据结构-快速拾遗》 基础常识

    1.命名空间函数 namespace wjy { void print() { cout<<"; } int load(int num) { return num; } } us ...

  4. 教你如何使用Java手写一个基于链表的队列

    在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...

  5. 算法是什么(二)手写个链表(java)

    算法是什么(二)手写个链表(java)   liuyuhang原创,未经允许禁止转载 目录 算法是什么(〇) 很多语言的API中都提供了链表实现,或者扩展库中实现了链表. 但是更多的情况下,Map(或 ...

  6. [快速傅立叶变换&快速傅里叶变换]【旧 手写笔记】

    $FFT$好美啊 参考资料: 1.算法导论 2.Miskcoo 3.Menci 4.虚数的意义-阮一峰 简单说一下,具体在下面的图片 实现: 可以用$complex$也可以手写 和计算几何差不多 注意 ...

  7. <数据结构系列1>封装自己的数组——手写动态泛型数组(简化版ArrayList)

    哈哈,距离上一次写博客已经快过去半个月了,这这这,好像有点慢啊,话不多说,开始我们的手写动态泛型数组 首先是我们自己写一个自己的动态数组类,代码如下所示: public class Array< ...

  8. 手写数字识别——利用keras高层API快速搭建并优化网络模型

    在<手写数字识别——手动搭建全连接层>一文中,我们通过机器学习的基本公式构建出了一个网络模型,其实现过程毫无疑问是过于复杂了——不得不考虑诸如数据类型匹配.梯度计算.准确度的统计等问题,但 ...

  9. (手写识别) Zinnia库及其实现方法研究

    Zinnia库及其实现方法研究 (转) zinnia是一个开源的手写识别库.采用C++实现.具有手写识别,学习以及文字模型数据制作转换等功能. 项目地址 [http://zinnia.sourcefo ...

随机推荐

  1. WCF入门教程(二)从零做起-创建WCF服务

    通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) 定义了协议,具体什么操作,操作的参数和返回值 ...

  2. kafka_2.11-0.8.2.1+java 生产消费程序demo示例

      Kafka学习8_kafka java 生产消费程序demo示例 kafka是吞吐量巨大的一个消息系统,它是用scala写的,和普通的消息的生产消费还有所不同,写了个demo程序供大家参考.kaf ...

  3. mongodb morphia删除数组中指定条件的数据

    先看mongodb操作: db.test.update({"msgid":170},{"$pull":{"msg":{"comti ...

  4. 【java】注释

    一.注释   1. 注释类型 [a]. 单行注释 // 单行注释 [b]. 多行注释 /* 多行注释 */ [c]. 文档注释 /** 文档注释 */ 一般情况下,需求,实现方式用多行注释,类和方法上 ...

  5. [转]【NLP】干货!Python NLTK结合stanford NLP工具包进行文本处理 阅读目录

    [NLP]干货!Python NLTK结合stanford NLP工具包进行文本处理  原贴:   https://www.cnblogs.com/baiboy/p/nltk1.html 阅读目录 目 ...

  6. [蓝桥杯]ALGO-15.算法训练_旅行家的预算

    问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...

  7. VMWare VSphere6.0的实验笔记

    在现有的一个vsphere6.0虚拟平台上环境下搭建一套VSphere环境平台. 任务1: 1.建立1个win2008主机,192.168.12.10.16Gram,40G硬盘1独立存储+150G硬盘 ...

  8. Quartz不用配置文件配置启动

    StdSchedulerFactory schedulerFactory = null; try { schedulerFactory = new StdSchedulerFactory(); Pro ...

  9. 【Mysql】事务日志-Write Ahead logging vs command-logging(转)

    原理讲解: Write Ahead logging vs command logging Write Ahead logging 持久化数据保存在磁盘,数据的存储是随机的,并非顺序: 内存中保存磁盘数 ...

  10. 陷入了一个NGUI自适应的一个坑

    自己对anchor的乱用.造成自己深陷anchor来搞自适应 耽误了太多的精力,最终也是回到正轨的途径 这期间浪费的太多精力了. 沉迷一件错误的事情过久 就 要果断的跳出 调整 . 但凡让自己觉得别扭 ...