单链表的实现
来源:互联网 发布:贝叶斯分类算法原理 编辑:程序博客网 时间:2024/06/06 13:16
1.Node.h文件
//节点类声明//成员变量:一个int型数据成员,一个指向Node型指针//成员函数:构造、析构、设置int、返回int、设置link、返回link、打印int #ifndef NODE_H#define NODE_H#include <cstdio>class LinkList;class Node{ friend class LinkList; public: Node(int data=0,Node *p=NULL); //带缺省值构造函数 ~Node(){} //构析函数暂时不写 void set_data(int i); //设置int int put_data(); //返回int void set_link(Node *p); //设置link Node* put_link(); //返回link void show(); //打印int private: int data; //数据成员 Node *link; //指针 };#endif
2.Node.cpp文件
//节点类实现#include <iostream>#include "Node.h"using namespace std;Node::Node(int data,Node *p){ this->data=data; this->link=p;}void Node::set_data(int i){ data=i;}int Node::put_data(){ return data;}void Node::set_link(Node *p){ link = p;}Node* Node::put_link(){ return link;}void Node::show(){ cout<<data;}
3.LinkList.h文件
//链表类声明//成员变量:一个指向Node型的头指针,带尾节点//成员函数:构造(带头节点)、判空、求长、添加节点、查找、打印 #ifndef LINKLIST_H#define LINKLIST_H#include "Node.cpp"class LinkList{ public: LinkList(); //构造函数 ~LinkList(){} //析构函数 bool IsEmpty(); //判空 int Length(); //求长 void addNode(int a); //尾插法添加节点 bool Find(int k,int &i); //查找第k个节点 int Search(const int &i); //搜索i值节点 bool Delete(int k); //删除第k个节点 void show(); //打印 private: Node *first;};#endif
4.LinkList.cpp文件
//链表类实现#include <iostream>#include "LinkList.h"using namespace std; //构造函数、 带头节点、值为0 LinkList::LinkList(){ Node *p = new Node; first = p;}//判空 bool LinkList::IsEmpty(){ return (first->put_link()==NULL)? true : false ;}//求表长 int LinkList::Length(){ Node *p = first; int i=0; while(p->put_link()) { i++; p=p->put_link(); } return i;}//尾插法添加节点 void LinkList::addNode(int i){ Node *p = new Node(i,NULL); Node *q = first; while(q->put_link()) { q=q->put_link(); } q->set_link(p); }//查找第k个节点 bool LinkList::Find(int k,int &x){ Node *p=first; int i=0; while(p->put_link()&&i<k) { p=p->put_link(); i++; } if(i==k) { x=p->put_data(); return true; } return false;} //查找x值节点,查找成功返回位置,查找失败返回0 int LinkList::Search(const int &x){ Node *p=first; int i=0; while(p->put_link()) { i++; p=p->put_link(); if(p->put_data()==x) return i; } return 0;}//删除第k个节点 bool LinkList::Delete(int k){ Node *q=first; int i=0; while(q->put_link()&&i<k-1) { i++; q=q->put_link(); } Node *p = q->put_link(); if(i==k-1&&p) { q->set_link(p->put_link()); delete p; return true; } else { cout<<"delete error"<<endl; return false; }}//打印全表 void LinkList::show(){ Node *p=first; while(p->put_link()) { p=p->put_link(); cout<<p->data<<' '; } cout<<endl;}
5.test.cpp文件
//测试文件#include <iostream>#include "LinkList.cpp"using namespace std;int main(){ //构造函数 LinkList *L = new LinkList; //判空 if(L->IsEmpty()) cout<<"Yes,it's Empty"<<endl; else cout<<"NO,it is not Empty"<<endl; //添加节点&&求长 L->addNode(21); L->addNode(12); L->addNode(50); if(L->IsEmpty()) cout<<"Now,it's Empty"<<endl; else cout<<"Now,it is not Empty"<<endl; cout<<"the length is :"<<L->Length()<<endl; //查找第1个节点 int temp=0; if(L->Find(1,temp)) cout<<"the 1th data is:"<<temp<<endl; //删除&&打印全表 L->Delete(2); L->show();}
文本输出:
Yes,it’s Empty
Now,it is not Empty
the length is :3
the 1th data is:21
21 50
<1>
以后不再在节点类中把访问私有成员变量的操作写成函数了,反正也把数据结构类定义成友元了,用成员函数来写总觉得其实并没有什么用,还显得很繁琐复杂。
<2>
这是暂时的一点感悟,像链表这样的数据结构,可能还比较考察C++的基本语法。
等到对类型的概念,对指针和地址的概念,对分配内存的概念深一点以后,这个并不很抽象的结构就能写出来了。
像我一开始总是不知道那个first到底是指针还是节点?到底代表着什么?
现在我的理解是,first是一个指向Node类的指针,在一个实例化的链表类对象中,是一个唯一的私有成员。该对象就可以通过这个指针,顺着一条链访问到整个链表。
而通常在链表类构造函数中,用new先开辟一个内存空间来存放一个无名Node对象,然后这个new语句返回该无名对象的初始地址,这个地址其实就是一个指向Node对象的指针,那么就将它赋值给first。
这样一来就可以通过first访问这第一个Node对象的成员,数据成员和一个又指向Node类的指针,然后就可以继续new Node对象通过指针,这样一个接一个连接起来。成为一个链表。
而真正实现的代码其实大同小异,一个操作每个人有每个人的写法,能够实现出来了就行,实际运用时还是要根据需要去设计。
0 0
- 单链表的基础实现
- 数据结构-单链表的实现
- 循环单链表的实现
- 单链表的手动实现
- 单链表的操作实现
- 一个单链表的实现
- C++实现的单链表
- C#单链表的实现
- 简洁的单链表实现
- 单链表的实现
- 单链表的实现
- 单链表的实现
- 单链表的实现
- 单链表的实现
- Java单链表的实现
- js 实现的单链表
- 单链表的实现
- 单链表的实现。。。。。。。
- noi-8169-加密的病历单
- JavaScript_2th_条件语句和循环语句
- iOS应用程序间共享数据
- C++类的认识与学习
- button标题点击大小变化
- 单链表的实现
- MySQL 只能用localhost不能用ip连接
- java程序中加入@SuppressWarnings("serial")是什么意思?
- cs231n assignment1--Softmax
- getCanonicalFile getAbsolutePath getPath
- ASTableNode+MJRefresh教程
- ch5 link analysis
- 深入嵌入式系统的bootloader
- iOS NSObject中forwardInvocation消息重定向