国嵌数据结构学习之单链表

链式存储定义:

    为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本省的信息外,还需要存储指示其直接后继的信息。


链式存储逻辑结构:

    n个结点链接成一个链式线性表的结构叫做链表,当每个节点中只包含一个指针域时叫单链表。

国嵌实现的是可复用的链表,和大多数书上实现的代码结构不一样。他实现的结构体里面只有一个指针,当你实现链表时,把什么链表头,链表元素,统统强制转换LinkListNode*,但要保证每个结构中都有LinkListNode* next成员。

typedef void LinkList;
typedef struct _tag_LinkListNode LinkListNode;
struct  _tag_LinkListNode
{
    LinkListNode* next;     
};

实现代码:

    头文件定义:

#ifndef __LISTLINK_H_
#define __LISTLINK_H_

typedef void LinkList;
typedef struct _tag_LinkListNode LinkListNode;
struct  _tag_LinkListNode
{
    LinkListNode* next;         
};

LinkList* LinkList_Create();

void LinkList_Destory(LinkList* list);

void LinkList_Clear(LinkList* list);

int LinkList_Length(LinkList* list);

int LinkList_Insert(LinkList *list,LinkListNode *node,int pos);

LinkListNode *LinkList_Get(LinkList* list,int pos);

LinkListNode *LinkList_Delete(LinkList *list,int pos);

#endif  

    c实现文件:

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

typedef struct _tag_LinkList
{
    LinkListNode header;    //结构体的首地址 
    int Length;        
}TLinkList;
/*
创建一个头结点 
*/ 
LinkList* LinkList_Create()//O(1)
{
        TLinkList *ret = (TLinkList*)malloc(sizeof(TLinkList));
        
        if(ret != NULL)
        {
            ret->Length = 0;
            ret->header.next = NULL;    
        }
        
        return ret;
}
/*
释放链表 
*/
void LinkList_Destory(LinkList* list)//O(1)
{
    free(list);    
}
/*
链表清空 
*/
void LinkList_Clear(LinkList* list)//O(1)
{
   TLinkList *sList = (TLinkList*)list;
   
   if(sList != NULL)
   {
       sList->Length = 0;
       sList->header.next = NULL;            
   } 
}
/*
得到链表长度 
*/
int LinkList_Length(LinkList* list)//O(1)
{
     TLinkList *sList = (TLinkList*)list;
     int ret = -1;
     
     if(sList != NULL)
     {
        ret = sList->Length;       
     }    
     
     return ret;
}
/*
链表的插入 
*/
int LinkList_Insert(LinkList *list,LinkListNode *node,int pos)//O(n)
{
   TLinkList *sList = (TLinkList*)list;
   int ret = (sList != NULL)&&(pos >= 0)&&(node != NULL);
   int i;
   
   if( ret )
   {
      LinkListNode *current = (LinkListNode*)sList;
      
      for(i=0; (i<pos)&&(current->next != NULL); i++)
      {
            current = current->next;      
      }
      
      node->next = current->next; 
      current->next = node;
      
      sList->Length++;      
   }
   
   return ret;     
} 
/*
链表的查找 
*/ 
LinkListNode *LinkList_Get(LinkList* list,int pos)//O(n)
{
    TLinkList *sList = (TLinkList*)list;
    LinkListNode *ret = NULL; 
    int i; 
    
    if( (0<=pos) && (sList != NULL) &&(pos < sList->Length))
    {
          LinkListNode *current = (LinkListNode*)sList;
          for(i=0; (i<pos); i++)
          {
            current = current->next;      
          } 
          ret = current->next; 
    }
    
    return ret;  
} 
/*
单链表的删除 
*/ 
LinkListNode *LinkList_Delete(LinkList *list,int pos)//O(n)
{
    TLinkList *sList = (TLinkList*)list;
    LinkListNode *ret = NULL; 
    int i; 
    
    if( (0<=pos) && (sList != NULL) &&(pos < sList->Length))
    {
          LinkListNode *current = (LinkListNode*)sList;
          for(i=0; (i<pos); i++)
          {
            current = current->next;      
          } 
          ret = current->next; 
          current->next = ret->next;
          
          sList->Length--;
    }
    return ret;     
} 

测试代码:

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

struct Value
{
    LinkListNode* header;      
    int value;  
};

int main(void)
{
    int i = 0;
    LinkList* list = LinkList_Create();

    struct Value v1;
    struct Value v2;
    struct Value v3;
    struct Value v4;
    struct Value v5;
    
    v1.value = 1;
    v2.value = 2;
    v3.value = 3;
    v4.value = 4;
    v5.value = 5;
    /*//头插法 
    LinkList_Insert(list,(LinkListNode*)&v1,0); 
    LinkList_Insert(list,(LinkListNode*)&v2,0); 
    LinkList_Insert(list,(LinkListNode*)&v3,0); 
    LinkList_Insert(list,(LinkListNode*)&v4,0); 
    LinkList_Insert(list,(LinkListNode*)&v5,0);
    */
    //尾插法 
    LinkList_Insert(list,(LinkListNode*)&v1,LinkList_Length(list)); 
    LinkList_Insert(list,(LinkListNode*)&v2,LinkList_Length(list)); 
    LinkList_Insert(list,(LinkListNode*)&v3,LinkList_Length(list)); 
    LinkList_Insert(list,(LinkListNode*)&v4,LinkList_Length(list)); 
    LinkList_Insert(list,(LinkListNode*)&v5,LinkList_Length(list));
    
    for(i=0; i<LinkList_Length(list);i++)
    {
       struct Value* pv =   (struct Value*)LinkList_Get(list,i);
       printf("%d\n",pv->value);    
    } 
    printf("删除:\n");
    struct Value* ret = (struct Value*)LinkList_Delete(list,1);
    printf("%d\n",ret->value);
    printf("\n");
    
    for(i=0; i<LinkList_Length(list);i++)
    {
       struct Value* pv =   (struct Value*)LinkList_Get(list,i);
       printf("%d\n",pv->value);    
    } 
    
    LinkList_Destory(list);
    printf("Press any key to continue");
    getchar();
    
    return 0;    
}

猜你喜欢

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