List(3)List的单链式实现的增强版(保留当前位置)

list.h


/*-----------------------------------------------   
Created By EverSteins   
Email:EverSteins@gmail.com  
转载请注明出处  
------------------------------------------------*/ 

typedef int ElemType;

typedef struct Node
{
	ElemType entry;
	Node *next;

	Node():entry(0),next(NULL){}
	Node(ElemType entry):entry(entry),next(NULL){}
	Node(ElemType entry,Node *link=NULL):entry(entry),next(link){}
}Node;

class List
{
public:
	List():count(0),head_node(NULL),current_position(0),current_node(NULL){}
	//List(const ElemType ©);
	//void operator=(const ElemType ©);
	~List();

	bool insert(int position,const ElemType &x);
	bool remove(int position,ElemType &x);
	bool empty() const;

	void showAll() ;
protected:
	int count;
	Node *head_node;
	mutable int current_position;
	mutable Node *current_node;

	void set_position(int position) const;
};

list.cc


/*-----------------------------------------------   
Created By EverSteins   
Email:EverSteins@gmail.com  
转载请注明出处  
------------------------------------------------*/ 

#include "stdafx.h"
#include "utility.h"
#include "list.h"
using namespace std;

void List::set_position(int position) const
{
	//pre:0<=position<count
	
	if (position<current_position)
	{
		current_position=0;
		current_node=head_node;
	}
	for (;current_position!=position;current_position++)
		current_node=current_node->next;
}

bool List::insert(int position,const ElemType &x)
{
	//pre:0<=position<count

	if (position<0 || position>count)
		return false;

	if (position>0)
	{		
		set_position(position-1);
		Node *old_node=current_node->next;
		Node *new_node=new Node(x,old_node);
		current_node->next=new_node;
	}
	else
	{
		Node *new_node=new Node(x,head_node);
		head_node=new_node;

		current_position=0;
		current_node=head_node;
	}

	count++;
	return true;
}

bool List::remove(int position,ElemType &x)
{
	if (position<0 || position>=count)
		return false;

	if (position>0)
	{
		set_position(position-1);
		Node *remove_node=current_node->next;
		Node *remove_following_node=remove_node->next;
		current_node->next=remove_following_node;

		x=remove_node->entry;
		delete remove_node;
	}
	else
	{
		//todo
	}

	count--;
	return true;
}

bool List::empty() const
{
	return count<=0;
}

void List::showAll() 
{
	Node *current_node=head_node;
	while (NULL != current_node)
	{
		cout<<current_node->entry<<" ";
		current_node=current_node->next;
	}
}

List::~List()
{
	
	Node *current_node=head_node;
	while (NULL != current_node)
	{
		Node *following_node=current_node->next;
		delete current_node;
		current_node=following_node;
		
	}
}

main.cc

/*-----------------------------------------------   
Created By EverSteins   
Email:EverSteins@gmail.com  
转载请注明出处  
------------------------------------------------*/ 

#include "stdafx.h"
#include "utility.h"
#include "list.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	List list;
	list.insert(0,0);
	list.insert(1,10);
	list.insert(2,20);
	list.insert(3,30);
	list.insert(4,40);
	list.insert(5,50);

	list.insert(3,-1);
	list.insert(3,-2);
	list.insert(3,-3);

	list.showAll();

	return 0;
}






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值