01--数据结构——动态链表(C++)
定义一个节点:
- #include <iostream>
- using namespace std;
- typedef int T;
- struct Node{
- T data;
- Node* next;
- Node(const T& d):data(d), next(NULL){}
- operator T(){
- return data;
- }
- };
- int main(){
- Node a(10), b(20);
- cout << "a=" << a << ", b=" << b << endl;
- return 0;
- }
上面的运算符重载,先将a类型强转为T类型(也就是int),Java中的toString实际上就是类似的强转成string类型的。
输出一段简单的链表
- #include <iostream>
- using namespace std;
- typedef int T;
- struct Node{
- T data;
- Node* next;
- Node(const T& d):data(d), next(NULL){}
- operator T(){
- return data;
- }
- };
- int main(){
- Node a(10), b(20), c(30), d(40), e(50);
- a.next = &b;
- b.next = &c;
- c.next = &d;
- Node *p = &a;
- while(p != NULL){
- cout << *p << ' ';
- p = p->next;
- }
- cout << endl;
- return 0;
- }
给链表添加一个元素
- #include <iostream>
- using namespace std;
- typedef int T;
- struct Node{
- T data;
- Node* next;
- Node(const T& d):data(d), next(NULL){}
- operator T(){
- return data;
- }
- };
- //输出链表
- void showlist(Node* p){
- while(p != NULL){
- cout << *p << ' ';
- p = p->next;
- }
- cout << endl;
- }
- int main(){
- Node a(10), b(20), c(30), d(40), e(50);
- a.next = &b;
- b.next = &c;
- c.next = &d;
- showlist(&a);
- //添加一个节点
- Node* & p = b.next;//取b.next指针的别名
- e.next = p;
- p = &e;
- showlist(&a);
- //再添加一个节点
- Node* k = new Node(70);
- Node*& r = c.next;
- k->next = r;
- r = k;
- return 0;
- }
一个C++实现的链表如下:
- #include <iostream>
- using namespace std;
- typedef int T;
- class List{
- struct Node{
- T data;
- Node * next;
- //T()零初始化
- Node(const T& d=T()):data(d), next(0){}
- };
- Node * head; //头指针
- int len;
- public:
- List():head(NULL),len(0){ }
- //插入到任何位置
- //1、在链表里找到指向那个位置的指针pn
- //2、让新节点的next成员和pn指向同一个地方
- //3、再让pn指向新节点
- void insert(const T&d, int pos){
- Node*& pn = getptr(pos);
- Node* p = new Node(d);
- p->next = pn;
- pn = p;
- len++;
- }
- //返回链表长度
- int size()const{
- return len;
- }
- //尾插
- void push_back(const T& d){
- insert(d, size());
- }
- //找链表中指向指定位置的指针
- Node*& getptr(int pos){
- if(pos<0 || pos>size()) pos = 0;
- if(pos==0) return head;
- Node* p = head;
- for(int i=1; i<pos; i++)
- p = p->next;
- return p->next;
- }
- //前插
- void push_front(const T& d){
- insert(d, 0);
- }
- //遍历
- void travel()const{
- Node* p = head;
- while(p!=NULL){
- cout << p->data << ' ';
- p = p->next;
- }
- cout << endl;
- }
- //清空
- void clear(){
- while(head!=NULL){
- Node * p = head->next;
- delete head;
- head = p;
- }
- len = 0;
- }
- ~List(){
- clear();
- }
- //按照位置删除
- //1、找到链表中指向那个位置的指针
- //2、把那个指针另存一份
- //3、让那个指针指向下一个节点
- //4、释放那个指针的动态内存
- void erase(int pos){
- if(pos<0 || pos>=size()) return;
- Node *& pn = getptr(pos);
- Node * p = pn;
- pn = pn->next;
- delete p;
- --len;
- }
- //根据元素查找位置
- int find(const T& d)const{
- int pos = 0;
- Node* p = head;
- while(p){
- if(p->data==d) return pos;
- p = p->next;
- ++pos;
- }
- return -1;
- }
- //根据元素删除
- void remove(const T& d){
- int pos;
- while((pos = find(d)) != -1)
- erase(pos);
- }
- };
- int main(){
- List l;
- l.push_front(5);
- l.push_front(8);
- l.push_front(20);
- //在第2个位置插入9
- l.insert(9, 2);
- l.travel();
- return 0;
- }
通过上图可以看出来,如果我们要插入一个节点,就需要找到指向该位置的指针(或者前一个结点),比如上图的p->next指针就是我们需要找到的。删除一个节点也一样,需要找到指向该节点的指针。
版权声明:本文出自水寒的原创文章,未经博主允许不得转载。
定义一个节点:
- #include <iostream>
- using namespace std;
- typedef int T;
- struct Node{
- T data;
- Node* next;
- Node(const T& d):data(d), next(NULL){}
- operator T(){
- return data;
- }
- };
- int main(){
- Node a(10), b(20);
- cout << "a=" << a << ", b=" << b << endl;
- return 0;
- }
上面的运算符重载,先将a类型强转为T类型(也就是int),Java中的toString实际上就是类似的强转成string类型的。
输出一段简单的链表
- #include <iostream>
- using namespace std;
- typedef int T;
- struct Node{
- T data;
- Node* next;
- Node(const T& d):data(d), next(NULL){}
- operator T(){
- return data;
- }
- };
- int main(){
- Node a(10), b(20), c(30), d(40), e(50);
- a.next = &b;
- b.next = &c;
- c.next = &d;
- Node *p = &a;
- while(p != NULL){
- cout << *p << ' ';
- p = p->next;
- }
- cout << endl;
- return 0;
- }
给链表添加一个元素
- #include <iostream>
- using namespace std;
- typedef int T;
- struct Node{
- T data;
- Node* next;
- Node(const T& d):data(d), next(NULL){}
- operator T(){
- return data;
- }
- };
- //输出链表
- void showlist(Node* p){
- while(p != NULL){
- cout << *p << ' ';
- p = p->next;
- }
- cout << endl;
- }
- int main(){
- Node a(10), b(20), c(30), d(40), e(50);
- a.next = &b;
- b.next = &c;
- c.next = &d;
- showlist(&a);
- //添加一个节点
- Node* & p = b.next;//取b.next指针的别名
- e.next = p;
- p = &e;
- showlist(&a);
- //再添加一个节点
- Node* k = new Node(70);
- Node*& r = c.next;
- k->next = r;
- r = k;
- return 0;
- }
一个C++实现的链表如下:
- #include <iostream>
- using namespace std;
- typedef int T;
- class List{
- struct Node{
- T data;
- Node * next;
- //T()零初始化
- Node(const T& d=T()):data(d), next(0){}
- };
- Node * head; //头指针
- int len;
- public:
- List():head(NULL),len(0){ }
- //插入到任何位置
- //1、在链表里找到指向那个位置的指针pn
- //2、让新节点的next成员和pn指向同一个地方
- //3、再让pn指向新节点
- void insert(const T&d, int pos){
- Node*& pn = getptr(pos);
- Node* p = new Node(d);
- p->next = pn;
- pn = p;
- len++;
- }
- //返回链表长度
- int size()const{
- return len;
- }
- //尾插
- void push_back(const T& d){
- insert(d, size());
- }
- //找链表中指向指定位置的指针
- Node*& getptr(int pos){
- if(pos<0 || pos>size()) pos = 0;
- if(pos==0) return head;
- Node* p = head;
- for(int i=1; i<pos; i++)
- p = p->next;
- return p->next;
- }
- //前插
- void push_front(const T& d){
- insert(d, 0);
- }
- //遍历
- void travel()const{
- Node* p = head;
- while(p!=NULL){
- cout << p->data << ' ';
- p = p->next;
- }
- cout << endl;
- }
- //清空
- void clear(){
- while(head!=NULL){
- Node * p = head->next;
- delete head;
- head = p;
- }
- len = 0;
- }
- ~List(){
- clear();
- }
- //按照位置删除
- //1、找到链表中指向那个位置的指针
- //2、把那个指针另存一份
- //3、让那个指针指向下一个节点
- //4、释放那个指针的动态内存
- void erase(int pos){
- if(pos<0 || pos>=size()) return;
- Node *& pn = getptr(pos);
- Node * p = pn;
- pn = pn->next;
- delete p;
- --len;
- }
- //根据元素查找位置
- int find(const T& d)const{
- int pos = 0;
- Node* p = head;
- while(p){
- if(p->data==d) return pos;
- p = p->next;
- ++pos;
- }
- return -1;
- }
- //根据元素删除
- void remove(const T& d){
- int pos;
- while((pos = find(d)) != -1)
- erase(pos);
- }
- };
- int main(){
- List l;
- l.push_front(5);
- l.push_front(8);
- l.push_front(20);
- //在第2个位置插入9
- l.insert(9, 2);
- l.travel();
- return 0;
- }
通过上图可以看出来,如果我们要插入一个节点,就需要找到指向该位置的指针(或者前一个结点),比如上图的p->next指针就是我们需要找到的。删除一个节点也一样,需要找到指向该节点的指针。
01--数据结构——动态链表(C++)的更多相关文章
- 数据结构——动态链表(C++)
定义一个节点: [cpp] view plain copy print? #include <iostream> using namespace std; typedef int T; ...
- HDU 2095 find your present (2) 动态链表
解题报告:输入一个n,后面紧跟着输入n个数,输入的这n个数中,除了有一个数的个数为奇数外,其它的数的个数都是偶数个,现在要你找出这个个数为奇数的这个数. 看起来好像很简单的样子,不过,这题的重点不在这 ...
- C++ 数据结构模板 队列 栈 动态链表 模板 Queue Stack List
C++数据结构模板,可以实现基本功能,用法和stl差不多,比如Q.pop();Q.push(a);Q.front();...... (由于动态链表用的不多,若有错误望各位大神不吝赐教:) 队列: cl ...
- vc++基础班[28]---动态数组及动态链表的讲解
C++中也有相应的动态数组.动态链表.映射表的模板类,就是STL中的:vector.list.map 他们属于C++标准中的一部分,对于程序的移植性来说也是不错的,但是在MFC编程中使用 CArray ...
- Linux C 数据结构 ->单向链表<-(~千金散尽还复来~)
之前看到一篇单向链表的博文,代码也看着很舒服,于是乎记录下来,留给自己~,循序渐进,慢慢 延伸到真正的内核链表~(敢问路在何方?路在脚下~) 1. 简介 链表是Linux 内核中最简单,最普通的数据结 ...
- Linux C 数据结构 ->单向链表
之前看到一篇单向链表的博文,代码也看着很舒服,于是乎记录下来,留给自己~,循序渐进,慢慢 延伸到真正的内核链表~(敢问路在何方?路在脚下~) 1. 简介 链表是Linux 内核中最简单,最普通的数据结 ...
- 学习javascript数据结构(二)——链表
前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...
- 使用C语言描述静态链表和动态链表
静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...
- linux内核数据结构之链表
linux内核数据结构之链表 1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域.后来看代码注释发现该 ...
随机推荐
- 绝对好用的浏览器json解析网址
你们是否经常在浏览器输入请求地址解析遇到中文乱码的情况,今天我找到了一个好用的浏览器解析json网址,绝对好用. 1.直接输入网址 http://pro.jsonlint.com/ 2.输入要解析的j ...
- 洛谷P1090 合并果子【贪心】
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所 ...
- [luogu1034] 矩形覆盖 (暴力)
传送门 Description 给n(n<=50)个点(x,y),要求用k(1<=k<=4)个没有联系的矩形覆盖住求矩形最小面积 Solution 感觉不是很可做,结果看TJ后发现数 ...
- 【例题4-3 uva 133】The Dole Queue
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 写个数组模拟链表 但注意,得用个辅助数组flag.. 不然可能会出现没能跳过中间的被占区域的情况. 比如 1 2 idx # # # ...
- mongodb--update高级用法
配合update使用的函数 $set 修改某列的值 $unset 删除某个列 $rename 重命名某个列 $inc 增长某个列 $setOnInsert 当upsert为true时,并且发生了ins ...
- C#--Task知识点
5天玩转C#并行和多线程编程 TASK使用总结 Task是什么,字面意思是任务 表示一个异步操作.它是异步操作的首选方式.Task是FRAMEWORK4中的新特性,封装了以前的Thread,并管理Th ...
- asp.net--常用的数据库链接字符串
本地连接 privatestring conn_string ="Data Source=localhost;Initial Catalog=SQLtest;Integrated Secur ...
- 一、Redis 基础命令---总括
1.redis命令不区分大写和小写.可是KEY区分大写和小写. 2.redis-cli -h 127.0.0.1 -p 6379 依据IP/PORT链接服务端 3.redis-server --por ...
- maven环境配置好,一直提示mvn不是内部命令
设置了环境变量 M2_HOME 跟path ,在cmd中输入mvn一直提示不是内部命令 解决办法:通过命令设置path 如下:set path=输入值
- servlet 处理过程
刚才花了一个小时找 servlet 的一个错误.终于找出来了,也大概明确 tomcat server对请求的处理顺序.以下做简单总结: 浏览器发送请求,传给 tomcat 在此请求地址指向的文件中定义 ...