您的位置:首页 > 编程语言 > C语言/C++

带头结点单链表的各种各种运算(C++模板类实现)

2011-10-26 22:53 796 查看
一切尽在代码中……

#include <iostream>
using namespace std;

template <typename T>//注意先声明
class SingleChain;

template <typename T>
class Node{
private:
Node *next;
T  _data;
friend class SingleChain<T>; //singleChain类可以自由访问Node类的所有成员,包括私有成员
};

template <class T>
class SingleChain{
public:
SingleChain(){
head = new Node<T>[sizeof(Node<T>)];//可以写成head = new Node<T>;
head->next = NULL;
}
bool IsEmpty() const;
int Length() const;
int CreateNode(int n);
int Insert(T data,int pos);
int FindElemPos(T data) const;
int DeleteSub(T data);
int DeleteSub(int pos,T &data);
void DestroyAll();
void DisplayAll(ostream&) const;

~SingleChain(){
delete head;
head = NULL; //删除后记得将head 置为NULL或0,不然成了野指针(wild pointer)
cout << "program is over,now delete all pointers..." << endl;
}
private:
Node<T> *head;
};
//疑问:在那些成员函数里定义的指针变量申请的动态内存空间是程序结束后自动释放系统回收。还是?
template <typename T>
bool SingleChain<T>::IsEmpty() const{  //判空运算
return  head->next == NULL;
}

template <typename T>
int SingleChain<T>::Length() const{  //返回链表长度
Node<T> *p;
p = head->next;
int len = 0;
while(p){
p = p->next;
len++;
}
return len;
}

template <typename T>
int SingleChain<T>::CreateNode(int n){ //创建n个结点
Node<T> *p,*q;
T tmp;
p = NULL;
q = head;
int i;
for(i = 1; i <= n; ++i){
p = new Node<T>[sizeof(Node<T>)];
if(p == NULL)
return -1;
cout << "node" << i << ":";
cin >> tmp;
p->_data = tmp;
p->next = NULL;
q->next = p;
q = p;
}
return 0;
}

template <typename T>
int SingleChain<T>::Insert(T data,int pos){ //在指定位置插入
Node<T> *p,*q;
p = head;
int cnt = 0;
while(cnt < pos - 1 && p != NULL){
p = p->next;
cnt++;
}
if(cnt < pos - 1 || p == NULL)
return -1;
q = new Node<T>[sizeof(Node<T>)];
if(q == NULL)
return -2;
q->_data = data;
q->next = p->next;
p->next = q;
return 0;
}

template <typename T>
int SingleChain<T>::FindElemPos(T data) const{ //查找元素返回其所在位置
int len = 1;
Node<T> *p = head->next;
while(p && p->_data != data){
p = p->next;
len++;
}
if(p == NULL)
return 0;

return len;
}

template <typename T>
void SingleChain<T>::DisplayAll(ostream& out) const{ //显示所有数据
Node<T> *p;
p = head->next;
while(p){
out << p->_data << " ";
p = p->next;
}
out << endl;
}

template <typename T>
int SingleChain<T>::DeleteSub(T data){ //删除指定值(如果有相同,则删掉最靠前的)
Node<T> *p,*q;
p= head->next;
q = head;
while(p && p->_data != data){
p = p->next;
q = q->next;
}
if(p == NULL)
return false;
q->next = p->next;
delete p;
// free(p);
return true;
}

template <typename T>
int SingleChain<T>::DeleteSub(int pos,T &data){ //删除指定位置的结点,并通过引用方式返回数据元素
Node<T> *p,*q;
p = head->next;
q = head;
int cnt = 0;
while(cnt < pos - 1 && p != NULL){
p = p->next;
q = q->next;
cnt++;
}
if(cnt > pos - 1 || p == NULL) //如果指定位置不存在
return -1;
data = p->_data;
q->next = p->next;
delete p;
return 0;

}

template <typename T>
void SingleChain<T>::DestroyAll(){ //清空整个链表(表头还在)
Node<T> *p;
while(head->next){
p = head->next;
head->next = p->next;
delete p;
}
cout << "Ok,all nodes are deleted..." << endl;
}

int main(){
SingleChain<char> snode;
int num,pos;
char elem;
cout << "Is Empty?:" << snode.IsEmpty() << endl;
cout << "how many elements you want to create:";
cin >> num;
snode.CreateNode(num);

cout << "now Length:" << snode.Length() << endl;

cout << "all elements are:";
snode.DisplayAll(cout);

cout << "insert elem and pos:";
cin >> elem >> pos;
if(!snode.Insert(elem,pos)){
cout << "Ok,insert successfully!" << endl;
}
else{
cout << "Insert failed." << endl;
}

cout << "what elem you want to find?:";
cin >> elem;
pos = snode.FindElemPos(elem);
if(!pos)
cout << "not exist..." << endl;
else
cout << "pos:" << pos << endl;
snode.DisplayAll(cout);

cout << "delete elem:";
cin >> elem;
snode.DeleteSub(elem);
snode.DisplayAll(cout);

cout << "delete pos:";
cin >> pos;
if(!snode.DeleteSub(pos,elem)){
snode.DisplayAll(cout);
cout << "pos" << pos << ":" << elem << endl;
}
else{
cout << "not exist..." << endl;
}

snode.DestroyAll();
cout << "Now Lenth:" << snode.Length() << endl;
return 0;
}

int CreateNodeFromFront(Node *head,int n){//头插法
Node *p;
DATA tmp;
int i;
for(i = n; i > 0; i--){
p = new Node[sizeof(Node)];
if(p == NULL)
return -1;
cout << "input data" << n - i << ":";
cin >> tmp;
p->data = tmp;
p->next = head->next;
head->next= p;
}
}
int Insert(Node *head,DATA data,int pos){ //插入的第二种方式
if(head->next== NULL)
return -1;
Node *p,*q;
p = head;
q = new Node[sizeof(Node)];
int len = Length(head);
if(pos > len || pos < 0)
return -1;
while(p && pos--){
p = p->next;
}
q->data = data;
q->next = p->next;
p->next = q;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: