数据结构之单链表 c++

**

节点结构的定义:**

template<class T>
struct Node
{
T data;
Node * link;
Node(){Link=NULL;}
Node(T x,Node *next=NULL)
{ data=x; link=next; }
};

单链表类的定义

template<class T>
class LinkList 
{
   Node<T> * head;//单链表头指针
public:
   LinkList();//默认构造函数
   LinkList(T a[ ],int n);//生成有n个数据的链表(采用尾插法)
   ~LinkList();//析构函数
   Node<T> *invert(Node<T> *x);//单链表的反转
   int ListLength();//求单链表的长度
   T get(int pos);//按位查找
   int Locate(T item);//按值查找
   void PrintLinkList();//遍历单链表输出
   bool Insert(int i,const T &item);//单链表的插入
   bool Remove(int i,T&x);//单链表的删除
};

**

3 算法设计与实现(类的成员函数实现)

**
(1) 默认构造函数

template<class T>
LinkList<T>::LinkList()    //构造函数1
{ //创建带表头结点的空单链表
	head=new Node<T>;//创建表头结点
}

(2)有参构造函数

template<class T>
LinkList<T>::LinkList(T a[],int n)    //构造函数2
{  //用尾插法创建单链表
	Node<T> *p,*r;
	head=p=new Node<T>;//创建表头结点,p指针指向当前单链表的最后一个结点
	for(int i=0;i<n;i++)
	{
		r=new Node<T>(data[i]);
		p->link=r;       //链接到p指针所指结点之后
		p=p->link;       //p指针后移
	}
}

(3)析构函数

template<class T>
LinkList<T>::~LinkList()   //清空操作,将各元素结点空间释放,单链表为空表
{

Node<T> *current=head->link; // current指向首元结点
	while(current!=NULL) //依次扫描链表结点,并逐个释放空间
	{	
		Node<T> *r=current;
		current=current->link;
		delete r;
	}
	head->link =NULL; //单链表为空
}

(4)单链表的反转

template<classT>
Node<T> LinkList<T>::*invert(Node *x)
{
	Node<T> *p,*q,*r;
	p=x;
	q=NULL;
	while(p)
	{
		r=q;
		q=p;
		p=p->link;
		q->link=r;
	}
	return q;
}

(5)求单链表的长度

template<classT>
int LinkList<T>::ListLength()
{
	int num=0;
	Node<T> *p=head->link;
	while(P)
	{
		p=p->link;
		num++;
	}
	return num;
}

(6)按位查找

template<classT>
T LinkList<T>::Get(int pos)
{
	Node<T> *p=head->link;
	j=1;
	while(p&&j<pos)
	{
		p=p->link;
		j++;
     }
     if(!p||j>pos)
     {
	     cout<<"查找位置非法"<<endl;
	     exit(1);
     }
     else
      return p->data;
}

(7)按值查找

template<classT>
int LinkList<T>::Locate(T item)
{
	Node<T>*p=head->link;
	int j=1;
	while(p&&p->data!=item)
	{
		p=p->link;
		j++;
	}
	if(p) return j;
	else return 0;
}

(8) 插入操作
算法描述:
① 若i<1,则插入失败,结束;
② 扫描单链表,寻找单链表中第i-1个元素结点的指针p;
③ 若p存在(p非空)则在其后插入,操作成功,否则不能插入。

template<class T>
bool LinkList<T>::Insert(int i,const T&item)
{ //在单链表的第i个元素之前插入元素item,插入成功返回true,否则返回false。
	if(i<1) //插入位置不合法
		return false;
	Node<T> *s,*p=head;
	int count=0; // count是计数器
	while(p && count<i-1)//找第i-1个元素结点的指针front
	{
		p=p->link;
		count++;
	}
	if(!p) //插入位置不合法
		return false; 
	s=new Node<T>(item,p->link);
        s->data=item;
        s->link= p->link;//确定待插入结点(s所指结点)的link指针(s->link)指向
	p->link=s; //修改链表中的指针(p->link)指向
	return true;
}

(9) 删除操作
a) 算法步骤:(删除单链表中的第pos个元素)
① 若pos<1,则删除失败,结束;
② 在单链表中找第pos -1个元素结点的指针p;
③ 若p和p->link均非空,则删除p->link所指结点,否则删除失败。

template<classT>
bool LinkList<T>::Remove(int i,T&x) //删除单链表的第i个元素,并置入x
{
    if(i<1)   //删除位置不合法
        return false;
    Node<T> *current,*p=head;
    int count=0;// count是计数器
    while(p->link && count<i-1)//找第i-1个元素结点的指针
    {
        p=p->link;
        count++;
    }
    if(!p->link)  //删除位置不合法,pos大于表长
        return false;
    current=p->link;  // current指向被删除结点
    p->link=current->link; //修改链表指针
    x= current->data;
    delete current;
    return true;
}

(10)打印整个链表

template<class T>
void LinkList<T>::PrintLinkList()
{
	Node<T>*current = head->link;
	while(current)
	{
		cout<<current->data<<" ";
		current=current->link;
	}
	cout<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值