单链表 C++实现
2015-12-03 23:31
288 查看
重新修改了下,单链表C++实现,Ubuntu14下测试可运行。
List.h
#include<stdlib.h>
#include<string>
using namespace std;
template<class T>
struct LinkNode{
T data;
LinkNode<T> * link;
LinkNode(LinkNode<T> *ptr = NULL) { link = ptr; }
LinkNode(const T& item, LinkNode<T> *ptr = NULL)
{
data = item; link = ptr;
}
};
template<class T>
class List{
public:
List(){ first = new LinkNode<T>; }
List(const T&x){ first = new LinkNode<T>(x); }
List(List<T>&L);
~List(){}
void makeEmpty();
LinkNode<T> *getHead() const { return first; }
LinkNode<T> *Search(T x);
LinkNode<T> *Locate(int i) const;
bool getData(int i, T & x) const;
void setData(int i, T &x);
bool Insert(int i, T &x);
bool Remove(int i, T&x);
bool IsEmpty() const
{
return first->link == NULL ? true : false;
}
bool IsFull()const { return false; }
void Show();
LinkNode<T>* deleteDuplicates(LinkNode<T>* p);
LinkNode<T>* first;
};
template<class T>
void List<T>::makeEmpty()
{
LinkNode<T>*q;
while (first->link != NULL){
q = first->link;
first->link = q->link;
delete q;
}
};
template<class T>
LinkNode<T>*List<T>::Locate(int i) const{
if (i < 0)return NULL;
LinkNode<T> *current = first; int k = 0;
while (current != NULL && k < i)
{
current = current->link; k++;
}
return current;
};
template<class T>
bool List<T>::getData(int i, T &x) const {
if (i < 0) return NULL;
LinkNode<T> *current = Locate(i);
if (current == NULL) return false;
else { x = current->data; return true; }
}
template<class T>
void List<T>::setData(int i, T &x) {
if (i <= 0) return;
LinkNode<T> *current = Locate(i);
if (current == NULL) return;
else { current->data = x; }
}
template<class T>
bool List<T>::Insert(int i, T &x)
{
if (first == NULL || i == 0)
{
LinkNode<T> *newNode = new LinkNode<T>(x);
newNode->link = first;
first = newNode;
}
else{
LinkNode<T> *current = first;
for (int k = 1; k < i; k++)
if (current == NULL) break;
else current = current->link;
if (current == NULL)
return false;
else
{
LinkNode<T> *newNode = new LinkNode<T>(x);
newNode->link = current->link;
current->link = newNode;
}
}
return true;
}
template<class T>
bool List<T>::Remove(int i, T&x){
LinkNode<T> *current = Locate(i - 1);
if (current == NULL || current->link == NULL) return false;
LinkNode<T> *del = current->link;
current->link = del->link;
x = del->data; delete del;
return true;
}
template<class T>
LinkNode<T>* List<T>::deleteDuplicates(LinkNode<T>* p) {
if (p == NULL)
return NULL;
LinkNode<T> *cur = first;
while (cur->link != NULL)
{
if (cur->link->data != cur->data)
{
cur = cur->link;
}
else
{
LinkNode<T> *del = cur->link;
if (del->link == NULL)
{
delete del;
}
else
{
cur->link = del->link;
delete del;
}
}
}
return p;
}
template<class T>
void List<T>::Show()
{
LinkNode<T>*current = first;
while (current->link != NULL)
{
cout << current->data << " ";
current = current->link;
}
}
List.h
#include<stdlib.h>
#include<string>
using namespace std;
template<class T>
struct LinkNode{
T data;
LinkNode<T> * link;
LinkNode(LinkNode<T> *ptr = NULL) { link = ptr; }
LinkNode(const T& item, LinkNode<T> *ptr = NULL)
{
data = item; link = ptr;
}
};
template<class T>
class List{
public:
List(){ first = new LinkNode<T>; }
List(const T&x){ first = new LinkNode<T>(x); }
List(List<T>&L);
~List(){}
void makeEmpty();
LinkNode<T> *getHead() const { return first; }
LinkNode<T> *Search(T x);
LinkNode<T> *Locate(int i) const;
bool getData(int i, T & x) const;
void setData(int i, T &x);
bool Insert(int i, T &x);
bool Remove(int i, T&x);
bool IsEmpty() const
{
return first->link == NULL ? true : false;
}
bool IsFull()const { return false; }
void Show();
LinkNode<T>* deleteDuplicates(LinkNode<T>* p);
LinkNode<T>* first;
};
template<class T>
void List<T>::makeEmpty()
{
LinkNode<T>*q;
while (first->link != NULL){
q = first->link;
first->link = q->link;
delete q;
}
};
template<class T>
LinkNode<T>*List<T>::Locate(int i) const{
if (i < 0)return NULL;
LinkNode<T> *current = first; int k = 0;
while (current != NULL && k < i)
{
current = current->link; k++;
}
return current;
};
template<class T>
bool List<T>::getData(int i, T &x) const {
if (i < 0) return NULL;
LinkNode<T> *current = Locate(i);
if (current == NULL) return false;
else { x = current->data; return true; }
}
template<class T>
void List<T>::setData(int i, T &x) {
if (i <= 0) return;
LinkNode<T> *current = Locate(i);
if (current == NULL) return;
else { current->data = x; }
}
template<class T>
bool List<T>::Insert(int i, T &x)
{
if (first == NULL || i == 0)
{
LinkNode<T> *newNode = new LinkNode<T>(x);
newNode->link = first;
first = newNode;
}
else{
LinkNode<T> *current = first;
for (int k = 1; k < i; k++)
if (current == NULL) break;
else current = current->link;
if (current == NULL)
return false;
else
{
LinkNode<T> *newNode = new LinkNode<T>(x);
newNode->link = current->link;
current->link = newNode;
}
}
return true;
}
template<class T>
bool List<T>::Remove(int i, T&x){
LinkNode<T> *current = Locate(i - 1);
if (current == NULL || current->link == NULL) return false;
LinkNode<T> *del = current->link;
current->link = del->link;
x = del->data; delete del;
return true;
}
template<class T>
LinkNode<T>* List<T>::deleteDuplicates(LinkNode<T>* p) {
if (p == NULL)
return NULL;
LinkNode<T> *cur = first;
while (cur->link != NULL)
{
if (cur->link->data != cur->data)
{
cur = cur->link;
}
else
{
LinkNode<T> *del = cur->link;
if (del->link == NULL)
{
delete del;
}
else
{
cur->link = del->link;
delete del;
}
}
}
return p;
}
template<class T>
void List<T>::Show()
{
LinkNode<T>*current = first;
while (current->link != NULL)
{
cout << current->data << " ";
current = current->link;
}
}
相关文章推荐
- c++ >>
- C++实现文件的遍历
- 【C语言提高22】const专题
- 【C语言提高21】关于字符串的一个例题
- 链表排序——插入排序(纯C语言版)
- C++UDP通信源码
- C/C++程序设计——指针与函数
- 普通二叉树C++实现
- C语言实现封装
- c_7: c语言函数
- 《C++标准程序库》笔记之二
- 派生类和基类的关系
- 一款C++静态分析工具 —— CppDepend
- C++ 下 typeof 的实现
- VS2012 打开C++项目时出现MSB8020的错误代码
- codeforces604B More Cowbell
- codeforces604C Alternative Thinking (脑洞大开 )
- c语言实现单链表
- C++11之美
- OJ提交题目中的语言选项里G++与C++的区别(转载)