数据结构与算法 p45-03
设线性表中的数据元素值递增有序排,并以单链表作为存储结构。
设计一个高效的算法,删除表中所有值大于min且小于max的元素
#include<iostream.h>
typedef int T;
template<class T>
struct Node
{
T data;//数据域,存放表元素
Node *next;//指针域,指向下一个结点
};
template <class T>
class LinkList
{
private:
Node<T> *Head;// 链表头指针
public:
LinkList() ;//构造函数, 创建空链表
~LinkList();//析构函数,删除表空间
void CreateList(int n);//创建具有n个元素的线性链表
void Delete(int i,int j);//删除表中第i个元素
int Locate(T e);//在链表中查找值为e的元素
void ListDisplay();
};
template<class T>
LinkList<T>::LinkList()
{//构建函数,建一空链表
Head=new Node<T>;
Head->next=NULL;
}
template<class T>
LinkList<T>::~LinkList()
{//析构函数,释放链表所占空间
Node<T> *p;
while(Head)//从头结点开始,依次释放结点
{
p=Head;
Head=Head->next;
delete p;
}
Head=NULL;//头结点指向空
}
template<class T>
void LinkList<T>::CreateList(int n)
{//尾插法(正序)创建具有n个元素的线性表
Node<T> *p,*s;//设置工作指针。p指向尾结点
p=Head;
int start,step;
cout<<"请依次输入初始值和步长:"<<endl;
cin>>start>>step;
for(int i=1;i<=n;i++)
{
s=new Node<T>;//新建元素结点
s->data=start+(i-1)*step;//输入新建数据元素值
s->next=p->next;//新结点链入表尾
p->next=s;
p=s;
}
}
template <class T>
void LinkList<T>::Delete (int i,int j)
{//删除指定位置元素
Node<T> *p,*s;//设置工作指针
p=Head;//查找从头结点开始
s=Head;
int h=0,k=0;//计数器初始化
while(p->next && k<i)//p定位到删除点的前驱
{
p=p->next;//
k++;
}
while(s->next && h<j-1)//p定位到删除点的前驱
{
s=s->next;//
h++;
}
p->next=s->next;//从链表中摘除删除结点
//没有释放别删除的结点空间,sorry,求教
}
template<class T>
int LinkList<T>::Locate (T e)
{//按元素值查找,找到,返回元素在表中的位序;否则,返回0
int j=1;
Node<T> *p;//工作指针
p=Head->next;//首元结点为查找起始位置
while(p && p->data<e )
{
p=p->next;
j++;
}
if(p==NULL) return 0;//末找到,返回0
else return j; //找到,返回位序
}
template <class T>
void LinkList<T>::ListDisplay()
{//遍历显示链表
Node<T> *p;//设置工作指针
p=Head->next;//从首元结点开始遍历
int i=1;//元素位序
while(p)
{
cout<<p->data<<"\t";
p=p->next;
i++;
}
cout<<endl;
}
//主函数
int main()
{
int n,min,max;
LinkList<int> L;
cout<<"请输入要创建的链表中元素个数:";
cin>>n;
cout<<endl;
L.CreateList(n);
L.ListDisplay();
cout<<endl;
cout<<"要求删除大于min,小于max的元素:"<<endl;
cout<<"分别输入min,max"<<endl;
cin>>min>>max;
int min_index=L.Locate(min);
int max_index=L.Locate(max);
L.Delete(min_index,max_index);
L.ListDisplay();
cout<<endl;
return 0;
}