p45-03

数据结构与算法 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值