注释:吕鑫老师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. 使用Jmeter创建ActiveMQ JMS POINT TO POINT请求,环境搭建、请求创建、插件安装、监听服务器资源等

    转自:http://www.cnblogs.com/qianyiliushang/p/4348584.html 准备工作: 安装JDK,推荐使用1.7以上版本,并设置JAVA_HOME 下载Jmete ...

  2. 修改 spawn node.exe" ENOENT at notFoundError问题

    Ionic server启动后,出现spawn node.exe" ENOENT at notFoundError ...\node_modules\cross-spawn\lib\enoe ...

  3. Go语言加解密--AES简单实践

    AES加解密的简单实现,代码如下. package main import ( "crypto/aes" "crypto/cipher" "encod ...

  4. c# 一些细节

    1.动态对象和匿名对象偶然看到一个语法,觉得特别方便然后频繁使用,但是没有深究,直到今天忽然发现我潜意思中对它的认知居然是错误的. var data=new { State=1,Message=&qu ...

  5. 排序算法<No.7>【希尔排序】

    排序算法进入到第7篇,这个也还是比较基础的一种,希尔排序,该排序算法,是依据该算法的发明人donald shell的名字命名的.1959年,shell基于传统的直接插入排序算法,对其性能做了下提升,其 ...

  6. overflow标签

    有时父标签设置了固定的宽高,但子标签把父标签给撑开了,就要在父标签里加一个overflow标签,等于hidden超出的地方隐藏,等于auto超出的地方隐藏,并且多个滚动条 <div style= ...

  7. C++11--右值引用(移动语义)

    /*################################################################## * 右值引用 (C++ 11) * 主要用于以下: * 1. ...

  8. Web jsp开发学习——点击菜单页面切换

      两个网页使用同一个head,在点击“首页”后,head的“首页”变成绿色,点击“新闻”后,head的“新闻”变成绿色,head的“首页”恢复原来的颜色   head.jsp <%@ page ...

  9. Ring0 - Lookaside结构

    由于频繁的申请,回收内存会导致在内存上产生大量的内存"空洞".这时使用Lookaside. 1.每次申请固定大小的内存. 2.申请和回收的操作十分频繁. 实现原理: 他先向wind ...

  10. openVPN设置本地密码验证

    wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh https://github.com/ ...