双链表实现

/*************************************************************
 * FileName: doubleLink.cpp   
 * Description: implemention for doublelink
 * Author: Cui Xiaofeng
 * Date: 2008/04/23
**************************************************************
*/

#include 
< iostream >
#include 
< ctime >
using   namespace  std;

/* 链表节点类 */
class  Dnode
{
public:
    Dnode(
int _data, Dnode *_next = NULL, Dnode *_prev = NULL)
    
{
        data 
= _data;
        next 
= _next;
        prev 
= _prev;
    }

    friend 
class Dlink;
private:
    
int data;
    Dnode 
*next;
    Dnode 
*prev;
}
;

/* 双向链表类 */
class  Dlink
{
public:
    Dlink(Dnode 
*_head = NULL):head(_head) {}
    
~Dlink();
    Dnode
* CreateDlink();
    Dnode
* Insert(int key, int position);
    Dnode
* Delete(int key);
    
void Print();
    
int Length();
private:
    Dnode 
*head;
}
;

Dnode
*  Dlink::CreateDlink()
{
    srand(time(NULL));
    
for (int i = 0; i < 10; i++)
    
{
        Dnode 
*temp = new Dnode(rand() % 100, head, NULL);
        
if (head != NULL)
        
{
            head
->prev = temp;
        }
        
        head 
= temp;
    }

    
return head;
}


/* 在链表的位置position(从1开始), 插入key的节点 */
Dnode
*  Dlink::Insert( int  key,  int  position)
{    
    Dnode 
*= head;
    
int i = 0;
    
if (NULL == head)
    
{
        head 
= new Dnode(key, NULL, NULL);
        
return head;
    }

    
else if (position == 1)
    
{
        Dnode 
*temp = new Dnode(key, head, NULL);
        head 
= temp;
        
return head;
    }


    
while (p->next != NULL)
    
{        
        i
++;
        
if (i == position - 1)
        
{
            
break;
        }

        p 
= p->next;
    }


    Dnode 
*pNext = p->next;
    Dnode 
*temp = new Dnode(key, pNext, p);
    
if (pNext != NULL)
    
{    
        pNext
->prev = temp;
    }

    p
->next = temp;

    
return head;
}

/* 从链表中删除等于key的节点 */
Dnode
*  Dlink::Delete( int  key)
{
    Dnode 
*= NULL;
    
for (p = head; p != NULL; p = p->next)
    
{
        
if (p->data == key)
        
{
            
break;
        }

    }


    
if (NULL == p)
    
{
        fprintf(stderr, 
"no the data!");
        
return head;
    }

    
else if (p == head)
    
{
        head 
= p->next;
    }

    
else
    
{
        p
->prev->next = p->next;
        
if (p->next != NULL)
        
{
            p
->next->prev = p->prev;
        }

    }

    
return head;
}


Dlink::
~ Dlink()
{
    Dnode 
*temp = NULL;
    
for (Dnode *= head; p != NULL; )
    
{
        temp 
= p->next;
        delete p;
        p 
= temp;
    }

}

/* 计算链表中元素的个数 */
int  Dlink::Length()
{    
    
int i = 0;
    
for (Dnode *= head; p != NULL; p = p->next)
    
{
        i
++;
    }

    
return i;
}


void  Dlink::Print()
{
    
for (Dnode *= head; p != NULL; p = p->next)
    
{
        printf(
"%d ", p->data);
    }

}


/* 测试程序 */
int  main()
{
    Dlink d;
    d.CreateDlink();
    d.Print();
    d.Insert(
12343);
    cout 
<< "inset 1234:" << endl;
    d.Print();
    cout 
<< "delete 1234:" << endl;
    d.Delete(
1234);
    d.Print();
    cout 
<< endl << d.Length() << endl;
    
    
return 0;
}

你可能感兴趣的:(双链表实现)