实现功能:
1. 用 C++ 编程实现一个模板链表类,并且简单测试其各种服务。
要求: a. 链表节点是一个类(或者结构)
b. 实现服务包括如下:
链表是否位空;
链表长度;
寻找链表中的第 k 个元素,并返回其值 ;
寻找元素 x ,如果发现 x ,则返回 x 的地址(在链表中的位置) ;
从链表中删除第 k 个元素,并且返回其值 ;
在第 k 个元素之后插入元素 x;
将链表所有元素送至输出流的服务 ;
重载输出流操作符 < <;
在链表尾部添加一个元素 ;
删除链表中的所有节点 ;
实现中必须考虑对一些异常的处理,同时我们必须保证在无法实现服务操作时程序仍然可以正确运行。
我的源代码:
#include <iostream.h>
template <class T>
class linear_list
{
public:
virtual int is_empty() = 0;
virtual int length() = 0;
virtual int find(int i, T &x) = 0;
virtual int search(T x) = 0;
virtual int insert(int i, T x) = 0;
virtual int _delete(int i) = 0;
virtual int updata(int i, T x) = 0;
virtual void output(ostream &out) = 0;
virtual int add(T x) = 0;
protected:
int n;
};
template <class T> class single_list;
template <class T>
class node
{
private:
T element;
node<T> *link;
friend class single_list<T>;
};
template <class T>
class single_list:public linear_list<T>
{
public:
single_list()
{
first = NULL;
n = 0;
};
~single_list();
int is_empty();
int length() ;
int find(int i, T &x);
int search(T x) ;
int insert(int i, T x);
int _delete(int i);
int update(int i, T x);
//void clear();
void output(ostream &out) ;
int add(T x);
ostream &operator <<(ostream &out, single_list &obj);
private:
node<T> *first;
};
template <class T>
single_list<T> :: ~single_list()
{
node<T> *p;
while (first)
{
p = first -> link;
delete first;
first = p;
}
}
template <class T>
int single_list<T> :: length()
{
return n;
}
template <class T>
int single_list<T> :: is_empty()
{
if (n == 0)
return 1;
else
return 0;
}
template <class T>
int single_list<T> :: find(int i, T &x)
{
if (i < 0 || i > n - 1)
{
cout << "Out Of Bounds";
return 0;
}
node<T> *p = first;
for(int j = 0; j < i; j++)
p = p -> link;
x = p -> element;
return 1;
}
template <class T>
int single_list<T> :: search(T x)
{
node<T> *p = first;
for (int j = 0; p && p -> element != x; j++)
p = p -> link;
if(p)
return j;
return -1;
}
template <class T>
int single_list<T> :: insert(int i, T x)
{
if (i < -1 || i > n-1)
{
cout << "Out Of Bounds";
return 0;
}
node<T> *q = new node<T>;
q -> element = x;
node<T> *p = first;
for(int j = 0; j < i; j++)
p = p -> link;
if (i > -1)
{
q -> link = p -> link;
p -> link = q;
}
else
{
q -> link = first;
first = q;
}
n++;
return 1;
}
template <class T>
int single_list<T> :: _delete(int i)
{
if (!n)
{
cout << "UnderFlow" << endl;
return 0;
}
if (i < 0 || i > n-1)
{
cout << "Out Of Bounds" << endl;
return 0;
}
node<T> *p = first, *q =first;
for(int j = 0; j < i-1; j++)
q = q -> link;
if (i == 0)
first = first -> link;
1. 用 C++ 编程实现一个模板链表类,并且简单测试其各种服务。
要求: a. 链表节点是一个类(或者结构)
b. 实现服务包括如下:
链表是否位空;
链表长度;
寻找链表中的第 k 个元素,并返回其值 ;
寻找元素 x ,如果发现 x ,则返回 x 的地址(在链表中的位置) ;
从链表中删除第 k 个元素,并且返回其值 ;
在第 k 个元素之后插入元素 x;
将链表所有元素送至输出流的服务 ;
重载输出流操作符 < <;
在链表尾部添加一个元素 ;
删除链表中的所有节点 ;
实现中必须考虑对一些异常的处理,同时我们必须保证在无法实现服务操作时程序仍然可以正确运行。
我的源代码:
#include <iostream.h>
template <class T>
class linear_list
{
public:
virtual int is_empty() = 0;
virtual int length() = 0;
virtual int find(int i, T &x) = 0;
virtual int search(T x) = 0;
virtual int insert(int i, T x) = 0;
virtual int _delete(int i) = 0;
virtual int updata(int i, T x) = 0;
virtual void output(ostream &out) = 0;
virtual int add(T x) = 0;
protected:
int n;
};
template <class T> class single_list;
template <class T>
class node
{
private:
T element;
node<T> *link;
friend class single_list<T>;
};
template <class T>
class single_list:public linear_list<T>
{
public:
single_list()
{
first = NULL;
n = 0;
};
~single_list();
int is_empty();
int length() ;
int find(int i, T &x);
int search(T x) ;
int insert(int i, T x);
int _delete(int i);
int update(int i, T x);
//void clear();
void output(ostream &out) ;
int add(T x);
ostream &operator <<(ostream &out, single_list &obj);
private:
node<T> *first;
};
template <class T>
single_list<T> :: ~single_list()
{
node<T> *p;
while (first)
{
p = first -> link;
delete first;
first = p;
}
}
template <class T>
int single_list<T> :: length()
{
return n;
}
template <class T>
int single_list<T> :: is_empty()
{
if (n == 0)
return 1;
else
return 0;
}
template <class T>
int single_list<T> :: find(int i, T &x)
{
if (i < 0 || i > n - 1)
{
cout << "Out Of Bounds";
return 0;
}
node<T> *p = first;
for(int j = 0; j < i; j++)
p = p -> link;
x = p -> element;
return 1;
}
template <class T>
int single_list<T> :: search(T x)
{
node<T> *p = first;
for (int j = 0; p && p -> element != x; j++)
p = p -> link;
if(p)
return j;
return -1;
}
template <class T>
int single_list<T> :: insert(int i, T x)
{
if (i < -1 || i > n-1)
{
cout << "Out Of Bounds";
return 0;
}
node<T> *q = new node<T>;
q -> element = x;
node<T> *p = first;
for(int j = 0; j < i; j++)
p = p -> link;
if (i > -1)
{
q -> link = p -> link;
p -> link = q;
}
else
{
q -> link = first;
first = q;
}
n++;
return 1;
}
template <class T>
int single_list<T> :: _delete(int i)
{
if (!n)
{
cout << "UnderFlow" << endl;
return 0;
}
if (i < 0 || i > n-1)
{
cout << "Out Of Bounds" << endl;
return 0;
}
node<T> *p = first, *q =first;
for(int j = 0; j < i-1; j++)
q = q -> link;
if (i == 0)
first = first -> link;

