zoukankan      html  css  js  c++  java
  • 循环双链表的简单实现

    <span style="font-size:18px;"><strong>//代码为自己编写。可能有问题,欢迎大家留言指正!</strong></span>
    <span style="font-size:18px;"><strong>
    </strong></span>
    #include <iostream>
    #include <string>
    using namespace std;
    typedef struct dnode
    {
    	int val;
    	dnode *prior;
    	dnode *next;
    }dnode;
    
    dnode * create();
    void traverse(dnode *pHead);
    bool insert(dnode *pHead,int pos,int val);
    bool del(dnode *pHead,int pos,int &val);
    void inverse(dnode *pHead);
    void main()
    {
    	dnode *pHead = create();
    	traverse(pHead);
    	insert(pHead,3,5);
    	traverse(pHead);
    	int val;
    	del(pHead,4,val);
    	cout<<val<<endl;
    	traverse(pHead);
    	inverse(pHead);
    	//traverse(pHead);
    }
    
    //建立循环双链表
    dnode *create()
    {
    	dnode *pHead = new dnode,*pTail;
    	pTail = pHead;
    	pTail->next = pHead;
    	//pHead->prior = pTail;
    	for (int i =0;i<4;i++)
    	{
    		dnode *pNew = new dnode;
    		pNew->val = i+1;
    		pNew->next = pTail->next;
    		pTail->next = pNew;
    		pNew->prior = pTail;
    		pTail = pNew;
    	}
    	pHead->prior = pTail;
    	return pHead;
    }
    
    void traverse(dnode *pHead)
    {
    	dnode *p =pHead->next;
    	while (p != pHead)
    	{
    		cout<<p->val<<" ";
    		p = p->next; 
    	}
    	cout<<endl;
    }
    
    bool insert(dnode *pHead,int pos,int val)
    {
    	dnode *p = pHead,*q;
    	int i = 1;
    	while (p->next != pHead && i < pos) //找到pos-1个节点(不包含头结点)
    	{
    		++i;
    		p = p->next;
    	}
    
    	if (i > pos || p->next == pHead)
    	{
    		return false;
    	}
    	dnode *pNew = new dnode;
    	q = p->next; 
    	pNew->val = val;
    	p->next = pNew;
    	pNew->prior = p;
    	pNew->next = q;
    	q->prior = pNew;
    	return true;
    }
    
    bool del(dnode *pHead,int pos,int &val)
    {
    	dnode *p = pHead,*q;
    	int i = 1;
    	while (p->next != pHead && i < pos) //找到pos-1个节点(不包含头结点)
    	{
    		++i;
    		p = p->next;
    	}
    
    	if (i > pos || p->next == pHead)
    	{
    		return false;
    	}
        q = p->next; //q为要删除的节点
     	val = q->val;
     	p->next = q->next;
     	q->next->prior = p;
     	delete q;
    	return true;
    }
    //逆序输出
    void inverse(dnode *pHead)
    {
    	dnode *p = pHead->prior; //p指向最后一个节点
    	while (p != pHead)
    	{
    		cout<<p->val<<" ";
    		p = p->prior;
    	}
    	cout<<endl;
    }

  • 相关阅读:
    DinnerNow中的Work Flow应用(上) 订单流程
    在Silverlight 2 (Beta2) 中使用webclient上传图片
    初尝dinnernow
    在silverlight 2 (beta1) 中使用BackgroundWorker
    徒劳的尝试 动态修改LINQ TO SQL的表名称
    你是否积极主动(Proactivity)?
    动态加载Silverlight应用的dll文件(可实现插件功能)
    silverlight与javascript交互操作
    DinnerNow中的Work Flow应用(下) 订单流程
    C#中winform窗体常用设置
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6736065.html
Copyright © 2011-2022 走看看