List.h头文件源代码:
#ifndef
_LIST_H_
#define
_LIST_H_
//链表类的前置声明
template
class
List;
template
class
ListNode //节点类
{
friend
class List;
private:
Type
data; //节点存储数据
ListNode*
link; //指向下一个节点的指针
ListNode(Type); //节点的构造函数
};
template
class
List //链表类
{
public:
List(){first=0;}; //链表的构造函数
void
Insert(Type); //插入节点
void
Delete(Type); //删除节点
void
Invert(); //反转链表
void
Concatenate(List); //合并链表
void
Show();
private:
ListNode*
first;
};
//节点构造函数的实现
template
ListNode::ListNode(Type
elemnt)
{
data=elemnt;
link=0;
}
//链表类插入函数的实现
template
void
List::Insert(Type k)
{
ListNode*
newnode=new ListNode(k);
newnode->link=first; //原来的头指针后移
first=newnode; //插入的新的节点指针成为头指针
}
template
void
List::Delete(Type k)
{
ListNode*
previous=0; //保存前一个节点
ListNode*
current; //循环指针
for(current=first;current&¤t->data!=k;previous=current,current=current->link)
{
//空循环
}
if(current)
{
if(previous) //删除节点不是第一个节点的情况
previous->link=current->link;
else //删除节点为第一个节点的情况
first=first->link;
delete
current;
}
}
//链表类中反转链表
template
void
List::Invert()
{
ListNode*
p=first; //声明两个指针,这个指针指向头节点
ListNode*
q=0; //这个指针指向尾节点
while(p)
{
ListNode*
r=q;
q=p;
p=p->link;
q->link=r;
}
first=q;
}
//链表类中实现两个链表的连结
template
void
List::Concatenate(List b)
{
if(!first)
{
first=b.first;
return;
}
if(b.first)
{
ListNode*
p;
for(p=first;p->link;p=p->link); //空循环,寻找第一个链表的尾节点
p->link=b.first;
}
}
template
void
List::Show()
{
for(ListNode*current=first;current;current=current->link)
{
std::cout<<current->data;
if(current->link)
std::cout<<"
-> ";
}
std::cout<<std::endl;
}
#endif主程序源代码:
#include
#include"List.h"
using
namespace std;
int
main()
{
List
intList;
intList.Insert(5);
intList.Insert(15);
intList.Insert(25);
intList.Insert(35);
intList.Show();
intList.Delete(15);
intList.Show();
List
charList;
charList.Insert('a');
charList.Insert('b');
charList.Insert('c');
charList.Insert('d');
charList.Show();
charList.Invert();
charList.Show();
List
char2List;
char2List.Insert('e');
char2List.Insert('f');
char2List.Show();
char2List.Invert();
char2List.Show();
charList.Concatenate(char2List);
charList.Show();
return
0;
}
运行结果: