“link.h” 头文件
#include<assert.h>
template<typename T>class link
{
struct node
{
T data;
struct node *next;
};
struct node *p;
public:
link(){ p=NULL; }
~link(){erase();puts("已经析构");}
void assign(T *begin, T* end);
void push( T val);
void pop();
void erase();
void erase( T val);
void print();
void sort();
T at(unsigned );
unsigned length();
};
template<typename T>
T link<T>::at(unsigned i)
{
assert( i<length() ); //越界检查
node *pp=p;
for (unsigned k=0; k<i; k++)
{
pp=pp->next;
}
return pp->data;
}
template<typename T>
void link<T>::sort()
{
int size=length();
for (int i=1; i<size; i++)
{
node *p1=p;
for (int j=0; j<size -i; j++)
{
node* p2=p1->next;
if (p1->data> p2->data)
{
T tem=p2->data;
p2->data=p1->data;
p1->data=tem;
}
p1= p2;
}
}
}
template<typename T>
unsigned link<T> ::length ()
{
unsigned n=0;
node*pp=p;
while (pp!=NULL)
{
pp= pp->next;
n++;
}
return(n);
}
template<typename T>
void link<T>:: print()
{
cout<<"The records in link are : "<<endl;
int n=0;
node *pp=p;
while(pp !=NULL)
{
cout<<"["<<n++<<"]: "<<pp->data<<endl;
pp= pp->next;
}
}
template<typename T>
void link<T>::erase( T val)
{
node *p1=p,*p2;
while(val !=p1->data&& p1->next !=NULL)
{
p2=p1;
p1=p1->next;
}
if (val ==p1->data)
{
if (p1==p)
p=p1->next;
else
p2->next=p1->next;
free(p1);
}
else
cout<<"not found !"<<endl;
}
template<typename T>
void link<T>::push( T val)
{
if (p ==NULL)
{
p=new node ;
p->data=val;
p->next=NULL;
return;
}
node *pp=p;
node *tem;
while(pp!=NULL)
{
tem=pp;
pp=pp->next;
}
pp=tem->next=new node;
pp->data=val;
pp->next=NULL;
}
template<typename T>
void link<T>::pop()
{
if(p ==NULL)
return;
node *tem,*pp=p;
while(pp->next !=NULL)
{
tem=pp;
pp=pp->next;
}
tem->next=NULL;
free(pp);
}
template<typename T>
void link<T>::erase()
{
if (p ==NULL)
return;
node* tem,*pp= p;
while(pp->next !=NULL)
{
tem=pp;
pp=pp->next;
free(tem);
}
free(pp);
p=NULL;
}
template<typename T>
void link<T>::assign ( T *begin, T* end)
{
erase();
node *pp,*s;
p=(node*)malloc(sizeof(node));
p->data=*begin;
p->next= NULL;
if(begin==end)
return;
begin++;
pp=p;
while(begin != end)
{
s=(node*)malloc(sizeof(node));
s->data= *begin;
pp->next=s;
pp=s;
begin++;
}
pp->next=NULL;
}
主函数
#include <iostream>
#include "link.h"
#include <ctime>
using namespace std;
int main()
{
srand((unsigned)time(0));
link<int> ln;
for (int i =0; i< 5; i++)
ln.push( rand()%10 );
cout<<"len : "<<ln.length()<<endl;
ln.print();
ln.sort();
ln.print();
double aa[]={8.1,6.4,5.2,6.3,7.9};
link<double>ld;
ld.assign(aa,aa+5);
ld.print();
ld.sort();
ld.print();
cout<< "at(1): "<<ld.at(1)<<endl;
ld.pop();
ld.print();
link<char>lc;
for (int i =0; i< 5; i++)
lc.push( 'a'+i );
lc.print();
return 0;
system("pause");
return 0;
}