国嵌数据结构学习之双向链表

单链表的局限:

    单链表的节点都只有一个指向下一个节点的指针。

    单链表的数据元素无法直接访问其前驱元素(逆序访问单链表中的元素是及其耗时的操作)。

双向链表的定义:

    在单链表的节点中增加一个指向其前驱的pre指针。


typedef void DLinkList;
typedef struct _tag_DLinkListNode DLinkListNode;
struct  _tag_DLinkListNode
{
    DLinkListNode* next;
    DLinkListNode* pre;    
};

实现代码:

    头文件:

    

#ifndef __DLISTLINK_H_
#define __DLISTLINK_H_

typedef void DLinkList;
typedef struct _tag_DLinkListNode DLinkListNode;
struct  _tag_DLinkListNode
{
    DLinkListNode* next;
    DLinkListNode* pre;    
};


DLinkList* DLinkList_Create();

void DLinkList_Destory(DLinkList* list);

void DLinkList_Clear(DLinkList* list);

int DLinkList_Length(DLinkList* list);

int DLinkList_Insert(DLinkList *list,DLinkListNode *node,int pos);

DLinkListNode *DLinkList_Get(DLinkList* list,int pos);

DLinkListNode *DLinkList_Delete(DLinkList *list,int pos);

DLinkListNode *DLinkList_DeleteNode(DLinkList *list,DLinkListNode *node);

DLinkListNode *DLinkListReset(DLinkList *list);

DLinkListNode *DLinkList_Current(DLinkList *list);

DLinkListNode *DLinkList_Next(DLinkList *list);

DLinkListNode *DLinkList_Pre(DLinkList *list);

#endif  

    实现的c文件:

    

#include <stdio.h>
#include <malloc.h>
#include "DLinkList.h"

typedef struct _tag_DLinkList
{
    DLinkListNode header;
    DLinkListNode *slider;
    int Length;        
}TDLinkList;
/*
创建一个头结点 
*/ 
DLinkList* DLinkList_Create()//O(1)
{
        TDLinkList *ret = (TDLinkList*)malloc(sizeof(TDLinkList));
        
        if(ret != NULL)
        {
            ret->Length = 0;
            ret->header.next = NULL;
            ret->header.pre = NULL;
            ret->slider = NULL;    
        }
        
        return ret;
}
/*
释放链表 
*/
void DLinkList_Destory(DLinkList* list)//O(1)
{
    free(list);    
}
/*
链表清空 
*/
void DLinkList_Clear(DLinkList* list)//O(1)
{
   TDLinkList *sList = (TDLinkList*)list;
   
   if(sList != NULL)
   {
       sList->Length = 0;
       sList->header.next = NULL;  
       sList->header.pre = NULL;
       sList->slider = NULL;            
   } 
}
/*
得到链表长度 
*/
int DLinkList_Length(DLinkList* list)//O(1)
{
     TDLinkList *sList = (TDLinkList*)list;
     int ret = -1;
     
     if(sList != NULL)
     {
        ret = sList->Length;       
     }    
     
     return ret;
}
/*
链表的插入 
*/
int DLinkList_Insert(DLinkList *list,DLinkListNode *node,int pos)//O(n)
{
   TDLinkList *sList = (TDLinkList*)list;
   int ret = (sList != NULL)&&(pos >= 0)&&(node != NULL);
   int i;
   
   if( ret )
   {
      DLinkListNode *current = (DLinkListNode*)sList;
      DLinkListNode *next = NULL;
      //移动到插入的位置 
      for(i=0; (i<pos)&&(current->next != NULL); i++)
      {
            current = current->next;      
      }
      
      next = current->next;
      
      current->next = node;
      node->next = next;
      //判断头结点后面不为空 
      if (next != NULL)
      {
            next->pre = node;      
      }
      node->pre = current; 
      //第一个节点的前向指针为空  
      if(sList->Length == 0)
      {
          node->pre = NULL;
          sList->slider = node;     
      }
      
      if(current == (DLinkListNode*)sList)
      {
        node->pre = NULL;      
      } 
      sList->Length++;      
   }
   
   return ret;     
} 
/*
链表的查找 
*/ 
DLinkListNode *DLinkList_Get(DLinkList* list,int pos)//O(n)
{
    TDLinkList *sList = (TDLinkList*)list;
    DLinkListNode *ret = NULL; 
    int i; 
    
    if( (0<=pos) && (sList != NULL) &&(pos < sList->Length))
    {
          DLinkListNode *current = (DLinkListNode*)sList;
          for(i=0; (i<pos); i++)
          {
            current = current->next;      
          } 
          ret = current->next; 
    }
    
    return ret;  
} 
/*
单链表的删除 
*/ 
DLinkListNode *DLinkList_Delete(DLinkList *list,int pos)//O(n)
{
    TDLinkList *sList = (TDLinkList*)list;
    DLinkListNode *ret = NULL; 
    int i; 
    
    if( (0<=pos) && (sList != NULL) &&(pos < sList->Length))
    {
          DLinkListNode *current = (DLinkListNode*)sList;
          DLinkListNode *next = NULL;
          for(i=0; (i<pos); i++)
          {
            current = current->next;      
          } 
          //指向要删除的节点 
          ret = current->next;
          //next指向要删除节点的下一个节点 
          next = ret->next;
          
          current->next = ret->next;
          //不是第一个节点 
          if(next != NULL)
          {
            next->pre = current;
            //判断是否是头节点 
            if(current == ( DLinkListNode*)sList)
            {
              next->pre = NULL;      
            }      
          }
          
          //如果删除第一个节点,slider指向第二个节点
          if( sList->slider == ret )
          {
            sList->slider = next;      
          } 
          
          sList->Length--;
    }
    return ret;     
}

DLinkListNode *DLinkList_DeleteNode(DLinkList *list,DLinkListNode *node)
{
    TDLinkList *sList = (TDLinkList*)list;
    DLinkListNode *ret = NULL; 
    int i = 0;
   
    //查找需要删除的节点
    if(sList != NULL)
    {
        DLinkListNode *current = (DLinkListNode*)sList;    
        for(i=0; i<DLinkList_Length(sList); i++)
        {
            if(current->next == node)
            {
                ret = current->next;
                break;
            }
            current = current->next;  
        }
        
        if(ret != NULL)
        {
           DLinkList_Delete(sList,i);     
        }
    }
    
    return ret;       
}

DLinkListNode *DLinkListReset(DLinkList *list)
{
    TDLinkList *sList = (TDLinkList*)list;
    DLinkListNode *ret = NULL; 
    //默认slider指向第一个节点 
    if(sList != NULL)
    {
        sList->slider = sList->header.next;
        ret = sList->slider;            
    }     
    
    return ret;
}

DLinkListNode *DLinkList_Current(DLinkList *list)
{
    TDLinkList *sList = (TDLinkList*)list;
    DLinkListNode *ret = NULL; 
    
     if(sList != NULL)
    {
        ret = sList->slider;            
    }     
    
    return ret;       
} 

DLinkListNode *DLinkList_Next(DLinkList *list)
{
  TDLinkList *sList = (TDLinkList*)list;
  DLinkListNode *ret = NULL;
 
  if( (sList != NULL) && (sList->slider != NULL) )
  {
       ret = sList->slider;
       sList->slider = ret->next;      
  }
  
  return ret;
         
}

DLinkListNode *DLinkList_Pre(DLinkList *list)
{
  TDLinkList *sList = (TDLinkList*)list;
  DLinkListNode *ret = NULL;
 
  if( (sList != NULL) && (sList->slider != NULL) )
  {
       ret = sList->slider;
       sList->slider = ret->pre;     
  }
  
   return ret;
         
}

测试代码:

    

#include <stdio.h>
#include "DLinkList.h"
#include <stdlib.h> 

struct Value
{
  DLinkListNode header;
  int v;      
};
int main(int argc, char *argv[])
{
  int i = 0;
  DLinkList *list = DLinkList_Create();
  
  struct Value v1;
  struct Value v2;
  struct Value v3;
  struct Value v4;
  struct Value v5;
  
  v1.v = 1;
  v2.v = 2;
  v3.v = 3;
  v4.v = 4;
  v5.v = 5;
  
  DLinkList_Insert(list,(DLinkListNode*)&v1,0);
  DLinkList_Insert(list,(DLinkListNode*)&v2,0);
  DLinkList_Insert(list,(DLinkListNode*)&v3,0);
  DLinkList_Insert(list,(DLinkListNode*)&v4,0);
  DLinkList_Insert(list,(DLinkListNode*)&v5,0);
  
  DLinkListReset(list);
  //DLinkList_Pre(list);
  
  printf("%x\n",DLinkList_Current(list)); 
  
  
  

  
  
  DLinkList_Destory(list);
  
  printf("Press enter to continue ...");
  getchar();	
  return 0;

}
/*测试代码 

  int i = 0;
  DLinkList *list = DLinkList_Create();
  
  struct Value v1;
  struct Value v2;
  struct Value v3;
  struct Value v4;
  struct Value v5;
  
  v1.v = 1;
  v2.v = 2;
  v3.v = 3;
  v4.v = 4;
  v5.v = 5;
  
  DLinkList_Insert(list,(DLinkListNode*)&v1,DLinkList_Length(list));
  DLinkList_Insert(list,(DLinkListNode*)&v2,DLinkList_Length(list));
  DLinkList_Insert(list,(DLinkListNode*)&v3,DLinkList_Length(list));
  DLinkList_Insert(list,(DLinkListNode*)&v4,DLinkList_Length(list));
  DLinkList_Insert(list,(DLinkListNode*)&v5,DLinkList_Length(list)); 
  
  for(i=0; i<DLinkList_Length(list); i++)
  {
    struct Value *pv =  (struct Value*)DLinkList_Get(list,i); 
    printf("%d\n",pv->v);     
  }
  
  printf("length = %d\n",DLinkList_Length(list)); 
  
  printf("\n");
  
  DLinkList_Delete(list,DLinkList_Length(list)-1);
  DLinkList_Delete(list,0);
  
  printf("\n");
  
  for(i=0; i<DLinkList_Length(list); i++)
  {
    struct Value *pv =  (struct Value*)DLinkList_Next(list); 
    printf("%d\n",pv->v);     
  }
  printf("length = %d\n",DLinkList_Length(list));
  
  printf("\n");
  
  DLinkListReset(list);
  DLinkList_Next(list);
  
  struct Value *pv =  (struct Value*)DLinkList_Current(list);
  printf("%d\n",pv->v); 
  printf("length = %d\n",DLinkList_Length(list));
  
  printf("\n");
  
  DLinkList_DeleteNode(list,(DLinkListNode*)pv);
  pv = (struct Value*)DLinkList_Current(list);
  printf("%d\n",pv->v);
  printf("length = %d\n",DLinkList_Length(list));
  
  DLinkListReset(list);
  for(i=0; i<DLinkList_Length(list); i++)
  {
    struct Value *pv =  (struct Value*)DLinkList_Next(list); 
    printf("%d\n",pv->v);     
  }
  printf("length = %d\n",DLinkList_Length(list));
  */

猜你喜欢

转载自blog.csdn.net/qq_34938530/article/details/80559095