注释:吕鑫老师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. Ribbon 常用配置

    配置参数 默认值 说明 <client>.<namespace>.listOfServers 配置服务器列表 <client>.<namespace>. ...

  2. Ribbon 负载均衡机制

    Ribbon 提供了几个负载均衡的组件,其目的就是让请求转给合适的服务器处理,因此,如何选择合适的服务器变成了负载均衡机制的核心,Ribbon 提供了如下负载均衡规则: RoundRobinRule: ...

  3. OpenWrt路由器通过LuCI界面实现Guest SSID功能

    转自: http://blog.ltns.info/linux/guest_ssid_over_openwrt_router/ 之前尝试过 Tomato路由器设置VLAN实现Guest SSID功能, ...

  4. GTP+SDI工程播出部分思路整理(2)

    GTP+SDI工程播出部分思路整理(2) 以同样的方法来分析tx_video_a_c_in信号: SDI核中tx_video_a_c_in信号连接情况如下所示 .tx_video_a_c_in     ...

  5. python 中变量引用问题

    普通变量,如a=10,str="fdaf",它们在函数内的值是不会被带到函数外的,除非在函数内加上global,而引用是惰性原则,从最近的同名父级同名变量引用值 其它变量如列表,字 ...

  6. Delphi 与 C/C++ 数据类型对照表

    Delphi 数据类型 C/C++ ShorInt 8位有符号整数 char Byte 8位无符号整数 BYTE,unsigned short SmallInt 16位有符号整数 short Word ...

  7. require 与 include 的区别

    require 的英文意思是 需要,有赖于.如果使用了这条语句,也就是告诉PHP内核,我这个程序需要这个文件,有赖于这个文件.或者通俗点儿讲就是:我要她!所以,PHP如果发现require参数中的文件 ...

  8. QT中webkit去掉默认的右键菜单

    在qt设计师中,选择webview,按下图选择那一行设置contextMenuPolicy属性:

  9. java容器Container和组件Component之GUI

    GUI全称Graphical User Interfaces,意为图形用户户界面,又称为图形用户接口,GUI指的就是采用图形方式显示的计算机操作用户界面,打个比方吧,我们点击QQ图标,就会弹出一个QQ ...

  10. Hadoop 新增删除节点

    1 新增Data节点 1.1 修改/etc/hosts,增加datanode的ip 1.2 在新增加的节点启动服务 hadoop-daemon.sh start datanode yarn-daemo ...