zoukankan      html  css  js  c++  java
  • 双向链表

    双向链表是为了解决在链表中访问直接前驱和直接后继的问题。很简单:

    抽象类定义:

    //双向链表结点结构体
    struct DouLinkNode
    {
    	int data;
    	DouLinkNode *lLink,*rLink;
    };
    //双向链表抽象数据类型定义
    class DouLinkList
    {
    public:
    	//构造函数和析构函数
    	DouLinkList()
    	{
    		head=NULL;
    		current=head;
    	}
    	~DouLinkList(){}
    	//插入、删除、搜索、输出 dir=0,前驱方向 dir=1,后继方向
    	bool Insert(int i,int x,int dir);	
    	bool Delete(int i,int dir);
    	DouLinkNode *Search(int i,int dir);
    	void Output(int dir);
    private:
    	DouLinkNode *head;
    	DouLinkNode *current;		//定位指针
    };
    

    主要算法:

    /*
    插入算法:
    1、
    */
    bool DouLinkList::Insert(int i,int x,int dir)
    {
    
    	DouLinkNode *newNode;
    	//如果插入的是第一个结点
    	if(head==NULL&&i==0)
    	{
    		head=new DouLinkNode;
    		if(head==NULL)
    		{
    			cout<<"内存分配失败"<<endl;
    			return false;
    		}
    		//创建一个头结点,并处理其左右链接域
    		head->data=x;
    		head->lLink=head->rLink=head;	//初始值
    		current=head;
    		return true;
    	}
    	else
    	{
    		if(dir==1)	//按照后继方向插入,先处理后继结点
    		{
    			newNode=new DouLinkNode;
    			if(newNode==NULL)
    			{
    				cout<<"内存分配失败"<<endl;
    				return false;
    			}
    			newNode->data=x;
    			//1、先处理新结点的后继
    			newNode->rLink=current->rLink;	//统一表达,current->rLink在下一步会被改变
    			current->rLink=newNode;
    			newNode->rLink->lLink=newNode;	//统一表达,转大圈
    			newNode->lLink=current;
    
    			//顺序插入
    			current=current->rLink;
    
    		}
    		else		//先处理前驱结点,转大圈
    		{
    			newNode=new DouLinkNode;
    			if(newNode==NULL)
    			{
    				cout<<"内存分配失败"<<endl;
    				return false;
    			}
    
    			newNode->data=x;
    
    			newNode->lLink=current->lLink;
    			current->lLink=newNode;
    			newNode->lLink->rLink=newNode;
    			newNode->rLink=current;
    
    			//顺序插入,相当于定位
    			current=current->lLink;
    		}
    	
    	}
    	return true;
    }
    
    /*
    输出算法:
    1、
    */
    void DouLinkList::Output(int dir)
    {
    	DouLinkNode *output=head;
    	if(dir==1)
    	{
    		while(output->rLink!=head)
    		{
    			cout<<"-------------------------------"<<endl;
    			cout<<"该结点值为:"<<output->data<<endl;
    			cout<<"前驱结点为:"<<output->lLink->data<<"  ";
    			cout<<"后继结点为:"<<output->rLink->data<<endl;
    			cout<<"-------------------------------"<<endl;
    			output=output->rLink;
    		}
    			cout<<"-------------------------------"<<endl;
    			cout<<"该结点值为:"<<output->data<<endl;
    			cout<<"前驱结点为:"<<output->lLink->data<<"  ";
    			cout<<"后继结点为:"<<output->rLink->data<<endl;
    			cout<<"-------------------------------"<<endl;
    	}
    	else
    	{
    		while(output->lLink!=head)
    		{
    			cout<<"-------------------------------"<<endl;
    			cout<<"该结点值为:"<<output->data<<endl;
    			cout<<"前驱结点为:"<<output->lLink->data<<"  ";
    			cout<<"后继结点为:"<<output->rLink->data<<endl;
    			cout<<"-------------------------------"<<endl;
    			output=output->lLink;
    		}
    			cout<<"-------------------------------"<<endl;
    			cout<<"该结点值为:"<<output->data<<endl;
    			cout<<"前驱结点为:"<<output->lLink->data<<"  ";
    			cout<<"后继结点为:"<<output->rLink->data<<endl;
    			cout<<"-------------------------------"<<endl;
    	}
    }
    
    /*
    删除算法:
    1、
    */
    bool DouLinkList::Delete(int i,int dir)
    {
    	int count=0;
    	DouLinkNode *p;
    	DouLinkNode *current=head;
    	while(count!=i-1)
    	{
    		current=current->rLink;
    		count++;
    	}
    	p=current->rLink;
    	current->rLink=p->rLink;
    	p->rLink->lLink=current->lLink;
    	delete p;
    	return true;
    }
    
    /*
    搜索算法:
    1、
    */
    DouLinkNode *DouLinkList::Search(int i,int dir)
    {
    	int count=0;
    	
    	DouLinkNode *current=head;
    	while(count!=i)
    	{
    		current=current->rLink;
    		count++;
    	}
    	return current;
    
    }
    

    主程序:

    int _tmain(int argc, _TCHAR* argv[])
    {
    	cout<<"------双向链表-------"<<endl;
    	DouLinkList dll;
    	dll.Insert(0,0,0);
    	dll.Insert(1,1,0);
    	dll.Insert(2,2,0);
    	dll.Insert(3,3,0);
    	dll.Insert(4,4,0);
    	dll.Insert(5,5,0);
    	dll.Output(1);
    	
    	cout<<"搜索到的结点是"<<dll.Search(3,1)->data<<endl;
    
    	dll.Delete(3,1);
    	dll.Output(1);
    	return 0;
    }
    

    测试结果:

    ------双向链表-------
    -------------------------------
    该结点值为:0
    前驱结点为:1 后继结点为:5
    -------------------------------
    -------------------------------
    该结点值为:5
    前驱结点为:0 后继结点为:4
    -------------------------------
    -------------------------------
    该结点值为:4
    前驱结点为:5 后继结点为:3
    -------------------------------
    -------------------------------
    该结点值为:3
    前驱结点为:4 后继结点为:2
    -------------------------------
    -------------------------------
    该结点值为:2
    前驱结点为:3 后继结点为:1
    -------------------------------
    -------------------------------
    该结点值为:1
    前驱结点为:2 后继结点为:0
    -------------------------------
    搜索到的结点是3
    -------------------------------
    该结点值为:0
    前驱结点为:1 后继结点为:5
    -------------------------------
    -------------------------------
    该结点值为:5
    前驱结点为:0 后继结点为:4
    -------------------------------
    -------------------------------
    该结点值为:4
    前驱结点为:5 后继结点为:2
    -------------------------------
    -------------------------------
    该结点值为:2
    前驱结点为:5 后继结点为:1
    -------------------------------
    -------------------------------
    该结点值为:1
    前驱结点为:2 后继结点为:0
    -------------------------------
    请按任意键继续. . .

  • 相关阅读:
    [转帖]gesture recognition
    [转帖]了解AmbiLight知识
    [转帖]AVS音视频编解码技术了解
    [笔记]新概念英语听力
    ES 学习记录
    Spring Aop 错误之:No MethodInvocation found ... the ExposeInvocationInterceptor is upfront in the interceptor chain. Specifically, note that advices with order HIGHEST
    AOP无法切入同类调用方法解决办法
    多数据源 Spring 1.x 和 spring 2.x区别
    Intellij IDEA 在一个窗口添加多个项目并全部加入version control
    PageHelper 分页和排序之间的关系
  • 原文地址:https://www.cnblogs.com/fistao/p/3098504.html
Copyright © 2011-2022 走看看