C++实现链表
来源:互联网 发布:软件市场营销方案 编辑:程序博客网 时间:2024/06/06 06:33
#pragma once#include<assert.h>typedef int DataType;class SListNode{ friend class SList; //友元:Slist能访问SListNodepublic: SListNode( DataType x ) :_data( x) , _next( NULL) {} private: DataType _data; SListNode* _next;//SListNode*};class SList{public: SList() :_head( NULL) , _tail( NULL) {} ~SList() { Clear(); } SList( const SList & s) :_head( NULL) , _tail( NULL) { SListNode* cur = s ._head; //s._head while (cur) { this->PushBack(cur->_data); cur = cur->_next; } } // old method //SList& operator=(const SList& s) //{ // if (this != &s) //自己不能给自己赋值 // { // this->Clear(); //?????????? // SListNode* cur = s._head; //和上面差不多 // while (cur) // { // this->PushBack(cur->_data); // cur = cur->_next; // } // } // return *this; //} //modern method SList& operator=(SList s) //无const & (SList s) { swap(_head, s._head); swap(_tail, s._tail); return *this ; }public: void PushBack(DataType x) { //1.空 if (_head == NULL ) { //new一个节点,利用SListNode构造函数进行初始化 _head = new SListNode (x); _tail = _head; //只有一个节点,_tail和_head都指向他 } else { //tail->next 进行插入,再把tail移动 _tail->_next = new SListNode (x); _tail = _tail->_next; _tail->_next = NULL; // 不知道用不用多此一举 } } void PopBack() { //1.NULL 2.one pop 3.more ->pop if (NULL == _head) return; else if (_head==_tail) { delete _head; _head = NULL; _tail = NULL; } else { SListNode* tail = _head; SListNode* prev = NULL ; while (tail->_next) { prev = tail; tail = tail->_next; } delete tail; prev->_next = NULL; } } void PushFront(DataType x) { //1.judge 2.none 3.one 4.more if (_head == NULL ) { PushBack( x); } else if (_head == _tail) { _head = new SListNode (x); _head->_next = _tail; } else { SListNode* tmp = new SListNode( x); tmp->_next = _head; _head = tmp; } } void PopFront() { //judge 1.NULL 2.one 3.more if (_head == _tail) { if (_head) { delete _head; _head = NULL; _tail = NULL; } } else { SListNode* del = _head; _head = _head->_next; delete del; } } void Insert(SListNode * pos, DataType x ) { //judge position 1.head .tail 3.mid assert(pos); if (pos == _tail) { PushBack( x); } else { SListNode* tmp = new SListNode( x); tmp->_next = pos->_next; pos->_next = tmp; } } SListNode* Find(DataType x)// SlistNode* { SListNode* cur = _head; while(cur) { if (cur->_data== x ) { return cur; } cur = cur->_next; } return NULL ; } void Erase(SListNode * pos) { //judge 1._head 2.tail 3.mid if (pos == _head) { PopFront(); } else if (pos == _tail) { PopBack(); } else { //找前驱结点 SListNode* prev = _head; while(prev) { if (prev->_next == pos )//如果前驱结点的后继等于Pos { //prev->next=pos->next prev->_next = pos->_next; delete pos ; break; } //prev动起来 prev = prev->_next; } } } void Clear() { SListNode* cur = _head; while (cur) { SListNode* del = cur; cur = cur->_next ; //_next为私有数据 应设置友元 delete del; } _head = NULL; _tail = NULL; } void PrintSList() { SListNode* cur = _head; while (cur) { cout << cur->_data << "->" ; cur = cur->_next; } cout << "NULL" << endl; }private: SListNode* _head;//不带头结点 //SListNode head;//带头结点 SListNode* _tail;};void TestSList1(){ SList s1; s1.PushBack(1); s1.PushBack(2); s1.PushBack(3); s1.PushBack(4); s1.PrintSList(); s1.PopBack(); s1.PopBack(); s1.PrintSList(); //SList s2(s1); //s1,s2都指向 链表1->2->3 两次析勾会造成崩溃 //s2.PrintSList(); /*SList s3; s3 = s1; s3.PrintSList();*/}//test PushFront/PopFrontvoid TestSList2(){ SList s1; s1.PushFront(1); s1.PushFront(2); s1.PushFront(3); s1.PushFront(4); s1.PushFront(5); s1.PushFront(6); s1.PushFront(7); s1.PrintSList(); s1.PopFront(); s1.PopFront(); s1.PopFront(); s1.PopFront(); s1.PopFront(); s1.PrintSList();}//test Find/Insertvoid TestSList3(){ SList s1; s1.PushBack(1); s1.PushBack(2); s1.PushBack(3); s1.PushBack(4); s1.PrintSList(); SListNode* pos = s1.Find(2); s1.Insert(pos, 10); s1.PrintSList();}// Erasevoid TestSList4(){ SList s1; s1.PushBack(1); s1.PushBack(2); s1.PushBack(3); s1.PushBack(4); s1.PrintSList(); SListNode* pos = s1.Find(2); s1.Erase(pos); s1.PrintSList();}
0 0
- C链表实现
- c链表实现
- C/C++/JAVA 双向链表实现
- 【库】c实现链表
- C/C++链表实现
- c语言实现链表
- c的链表实现
- C的链表实现
- C语言实现链表
- 静态链表 C实现
- c链表的实现
- c语言-链表实现
- C语言链表实现。
- C实现链表操作
- 简单链表(C实现)
- 链表堆栈C实现
- C语言实现链表
- C++:单向链表实现
- Java 7之基础 - 强引用、弱引用、软引用、虚引用
- 为MySQL数据库建立索引
- 闭包学习
- 【Android】50、碎片的简单用法
- hdu2256Problem of Precision+矩阵快速幂+广义斐波拉契
- C++实现链表
- hadoop启动错误:Path /XXX should be specified as a URI in configuration file
- 大数据入门,这10点你是必须要知道的
- linux上创建线程的类
- 金蝶打开软件时提示以独占的方式被打开
- block,inline和inline-block概念和区别
- sqlmap用户手册
- 薛开宇caffe学习笔记的补充笔记1
- SQL Server 2008重装系统后还原原来的数据库