链表的实现(类模板)
来源:互联网 发布:蔡珍妮淘宝退货地址 编辑:程序博客网 时间:2024/06/07 18:14
上一篇文章的链表实现有点小问题,此处使用类模板再做描述,不过部分代码有所不同。
#include<iostream>#include<cstdlib>#include<cstdio>using namespace std;template<class T>class LinkList; //类的声明template<class T>class ListNode{ //由于结构体不太便于描述,故此处使用类来描述结点public: friend class LinkList<T>; //为了使LinkList类能访问该类的私有变量,应将其设为ListNode的友元类 //friend void f();private: T data; ListNode<T>* next;};template<class T>class LinkList{public: LinkList(){head = NULL;} //构造函数,初始化链表 ~LinkList(){}; //析构函数 bool ListEmpty(){return head == NULL;} int ListLength(); //求链表长度 void CreateListF(); //头插法构造链表 void CreateListR(); //尾插法构造链表 void CreateList(); //带头结点的尾插法 bool GetElem(int i,T& x); //判断第i个结点是否存在,若存在,将其记录在x中 int LocateElem(T x); //求x所在的位置 void InsertNode(int i,T x);//在第i个元素前插入x void DeleteNode(int i,T& x);//删除第i个元素,并将其记录在x中 void PrintList(); //打印该链表 //void f();private: ListNode<T>* head;};template<class T>void LinkList<T>::CreateListF(){ ListNode<T>* p = head,* s; T ch; ch = getchar(); while(ch != '\n'){ //换行符作为结束标志 s = new ListNode<T>; s -> data = ch; s -> next = p; p = s; ch = getchar(); } head = p;}template<class T>void LinkList<T>::CreateListR(){ ListNode<T>* s,* rear = NULL; T ch; ch =getchar(); while(ch != '\n'){ s = new ListNode<T>; s -> data = ch; if(head == NULL) head = s; else rear = s; ch = getchar(); } rear -> next = NULL;}template<class T>void LinkList<T>::CreateList(){ ListNode<T>* s,* rear = NULL; T ch; head = new ListNode<T>; rear = head; ch = getchar(); while(ch != '\n'){ s = new ListNode<T>; s -> data = ch; rear -> next = s; rear = s; ch = getchar(); } rear -> next = NULL;}template<class T>int LinkList<T>::ListLength(){ ListNode<T>* p = head -> next; int num = 1; while(p){ p = p -> next; num ++; } return num;}template<class T>bool LinkList<T>::GetElem(int i, T& x){ int j = 1; ListNode<T>* p = head -> next; while(p && j < i){ p = p -> next; j ++; } if(p){ x = p -> data; return 0; } return -1;}template<class T>int LinkList<T>::LocateElem(T x){ int num = 0; ListNode<T>* p = head -> next; while(p && p -> data != x){ num ++; p = p -> next; } if(p) return ++ num; else return -1;}template<class T>void LinkList<T>::InsertNode(int i, T x){ ListNode<T>* p = head,* s; int j = 0; while(p && j < i - 1){ p = p -> next; j ++; } if(i < 1 || i > ListLength() + 1) return ; s = new ListNode<T>; s -> data = x; s -> next = p -> next; p -> next = s;}template<class T>void LinkList<T>::DeleteNode(int i,T& x){ ListNode<T>* p = head,* u; int j = 0; while(p && j < i- 1){ p = p -> next; j ++; } if(i < 1 || i > ListLength() + 1) return; u = new ListNode<T>; u = p -> next; p -> next = u -> next; x = u -> data; delete u;}template<class T>void LinkList<T>::PrintList(){ ListNode<T>* p = head -> next; while(p){ cout<<p -> data<<" "; p = p -> next; } cout<<endl;}int main(){ LinkList<char>L; char ch; int k; L.CreateList(); L.PrintList(); if(L.GetElem(8,ch) == 0) cout<<"这个位置的元素是:"<<ch<<endl; else cout<<"没有这个序号!"<<endl; L.InsertNode(5,'t'); cout<<"在位置5插入t之后的内容如下:\n"; L.PrintList(); cout<<"删除位置5后的内容如下:\n"; L.DeleteNode(5,ch); L.PrintList(); cout<<"被删除的元素是:"<<ch<<endl; ch = 'm'; k = L.LocateElem(ch); if(k != -1) cout<<"元素"<<ch<<"所在位置为:"<<k<<endl;
0 0
- 链表的实现(类模板)
- C++ 类模板小结(双向链表的类模板实现)
- Queue类模板的链表实现(基本功能)
- [数据结构]链表的实现(c++/类模板)
- 链表的模板实现
- 链表的模板实现
- //链表的模板实现
- 类模板 实现链表
- 类模板 实现链表
- 链表的顺序表示和实现(C++模板类实现)
- 【c++模板】模拟实现有模板的双向链表(List)(声明和定义分离)
- 双向链表的C++类模板实现
- 二叉树之二叉链表的类模板实现
- 数据结构学习:单向链表的模板类实现
- C++模板实现的单向链表
- 栈模板的链表实现
- 链队列的模板类实现
- [数据结构] 顺序表的实现(c++/类模板)
- 工厂设计模式
- BSTR用法详解
- Android Design Support Library使用详解
- 构建二叉树
- 工作问题-java-单值查询renderJson返回
- 链表的实现(类模板)
- 记录 机器学习牛人
- LeetCode 72. Edit Distance
- 学习笔记之深入浅出MFC 第6章 Console程序介绍
- TEST
- 建站笔记1:centos6.5下安装mysql
- 启动tomcat 卡在Initializing Spring root WebApplicationContext
- MarkDown基本语法
- C++类的对象和类的指针的区别