双向循环链表

来源:互联网 发布:一天赚几万的网络违法 编辑:程序博客网 时间:2024/05/02 01:53
 
                              双向循环链表
                                                                                             
背景:
  因链表操作是数据结构的基础。对每个程序员来说,都是最基础的编程技术。有必要熟练的掌握其中的技术。
分析
   链表的好处毋庸多说。关键点:1。存储空间是动态分配,2。熟练指针操作。
   在这里仅就一个插入节点的情况来分析:
                               tempAllot
 

新的节点
 

 

                     llink                         rlink
                         rlink                 llink 

后节点
前节点
                                 llink

                                 rlink
          temp                                        temp->rlink
插入节点的时候,好的方法就是:
1.将被temp的指针所指向的关系全部挂结到tempAllot上.
2.然后将tempAllot挂结到该挂结的指针上。
程序
/**********************************************/
//双向循环链表的操作
//author:cheng_rliang
/**********************************************/
#include <iostream>
using namespace std;
 
/*定义节点类型*/
typedef struct node
{
   int data;
   struct node * llink;
   struct node * rlink;
} NODE;
 
/*建立链表*/
NODE * createNode(int number)
{
    NODE *head,*temp,*tempAllot;
    if((head = (NODE*)malloc(sizeof(NODE))) == NULL)           /*分配头节点的空间*/
    {
        printf("allot memory failure");                           /*失败返回NULL*/
        exit(0);
    }
    head->data = 0;                                           /*头节点的初值*/
    head->llink = NULL;                                    
    head->rlink = NULL;
    temp = head;                                             /*定义一个临时节点*/
    for(int i = 0; i < number;i++)                                /*建指定个数节点*/
    {
       if((tempAllot = (NODE*)malloc(sizeof(NODE))) == NULL)
       {
           printf("allot memory failure");
           exit(0);
       }
       temp->rlink = tempAllot;
       tempAllot->llink = temp;
       tempAllot->rlink = NULL;
       printf("please insert data:");
       scanf("%d",&(tempAllot->data));
       temp = tempAllot;
    }
    head->llink = temp;                                    /*将末节点和首节点相连*/
    temp->rlink = head;
    return head;
}
 
/*查找指定信息的节点*/
NODE * selectNode(NODE *head,int data)
{
      NODE *temp = head;
      while((temp = temp->rlink) != head)
      {
         if(temp->data == data)
         {
            return temp;
         }
      }
      return NULL;
}
 
/*插入指定信息的节点*/
bool insertNode(NODE *head,int data)
{
     NODE *temp = head;
     NODE *tempAllot = (NODE*)malloc(sizeof(NODE));
     if(tempAllot == NULL)
         return false;
     tempAllot->data = data;
     tempAllot->llink = temp->llink;                  /*挂结左节点*/
     tempAllot->rlink = temp;                       /*挂结右节点*/
     temp->llink->rlink = tempAllot;                  /*挂结到右节点*/
     temp->llink = tempAllot;                       /*挂结到左节点*/ 
     return true;
}
 
/*删除指定信息的节点*/
bool deleteNode(NODE *head,int data)
{
    NODE *temp = head;
     while((temp = temp->rlink) != head)
     {
         if(temp->data == data)
         {
           temp->llink->rlink = temp->rlink;
           temp->rlink->llink = temp->llink;
           free(temp);                           /*切记:释放节点空间*/
           return true;
         }
    }
    return false;
}
 
/*打印整个链表*/
void printNode(NODE * head)
{
    NODE *temp = head;
    while((temp = temp->rlink) != head)
    {
        printf("%d/n",temp->data);
    }
}
 
int main()
{
// for testing
   NODE *noTemp = NULL;
   noTemp = createNode(5);
   insertNode(noTemp,10);
   printNode(noTemp);
   system("pause");
   return 0;
}
 
原创粉丝点击