数据结构 链式存储源码

#ifndef _LINKLIST_H_
#define _LINKLIST_H_

typedef void LinkList;

typedef struct _tag_LinkListNode LinkListNode;

struct _tag_LinkListNode
{
     LinkListNode* next;	
}; 

LinkList* LinkList_Create();

void LinkList_Destroy(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






#include "LinkList.h" 
#include <malloc.h>
#include <stdio.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_Destroy(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);
	int i = 0;
	
	ret  = ret && (pos>=0) && (node != NULL);
	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 = 0;
	
	if((sList != NULL) && (pos>=0) && (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 = 0;
	
	if((sList != NULL) && (pos>=0) && (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;
}

/*
	小结:
		优点: 无需一次性定制链表的容量
		插入和删除操作无需移动数据元素
		
		缺点:数据元素必须 保存后继元素的位置信息
		获取指定数据的元素操作需要顺序访问之前的元素。 
*/

你可能感兴趣的:(数据结构,c,源码,链式存储)