1. 程式人生 > >單鏈表的實現(C語言版)

單鏈表的實現(C語言版)

FLinkList.h標頭檔案:

#ifndef _FLINKLIST_H_
#define _FLINKLIST_H_

typedef void LinkList;  //利用void指標來接受任意型別的資料
typedef struct _tag_LinkListNode FLinkListNode;
struct _tag_LinkListNode
{
	FLinkListNode* 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

FLinkList.c實現:

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

typedef struct _tag_LinkList
{
	
	FLinkListNode header;
	int length;
	
}FLinkList;


FLinkList* LinkList_Create()
{
	FLinkList* ret=(FLinkList*)malloc(sizeof(FLinkList));
	if(ret!=NULL)
	{
		ret->length=0;
		ret->header.next=NULL;
	}	
}


void LinkList_Destroy(LinkList* list)
{
	free(list);	
}


void LinkList_Clear(LinkList* list)
{
	FLinkList* ret=(FLinkList*)list;
	if(ret!=NULL)
	{
	ret->length=0;
	ret->header.next=NULL;
	}
}

int LinkList_Length(LinkList* list)
{
	FLinkList* flist=(FLinkList*)list;
	int ret=-1;
	if(ret!=NULL)
	{
		return flist->length;
	}
	return ret;
}


int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{
	FLinkList* flist=(FLinkList*)list;
	
	int ret=((flist!=NULL)&&(pos>=0)&& (node!=NULL));
	int i=0;
	if(ret)
	{
		FLinkListNode* current=(FLinkListNode*)flist;
		for(;(i<pos)&&(current->next!=NULL);i++)
		{
			current=current->next;
			
		}
		node->next=current->next;
		current->next=node;
		
		flist->length++;
	}
	return ret;
}


LinkListNode* LinkList_Get(LinkList* list, int pos)
{
	FLinkList* flist=(FLinkList*)list;
	FLinkListNode* ret=NULL;
	int i=0;
	if((flist!=NULL)&&(pos>=0)&& (pos<=flist->length))
	{ 
		FLinkListNode* current=(FLinkListNode*) flist;
		for(;(i<pos);i++)
		{
			current=current->next;
		}
		ret=current->next;
		
	}
	return ret;
	
	
}
LinkListNode* LinkList_Delete(LinkList* list, int pos)
{
	
	FLinkList* flist=(FLinkList*)list;
	FLinkListNode* ret=NULL;
	int i=0;
	if((flist!=NULL)&&(pos>=0)&& (pos<=flist->length))
	{ 
		FLinkListNode* current=(FLinkListNode*) flist;
		for(;(i<pos);i++)
		{
			current=current->next;
		}
		ret=current->next;
		current->next=ret->next;
		flist->length--;
	}
	return ret;
}

連結串列功能檢測:

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct Value
{
    LinkListNode header;
    int v;
};

int main(int argc, char *argv[]) 
{
    int i = 0;
    LinkList* list = LinkList_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;
    
    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->v);
    }
    
    while( LinkList_Length(list) > 0 )
    {
        struct Value* pv = (struct Value*)LinkList_Delete(list, 0);
        
        printf("%d\n", pv->v);
    }
    
    LinkList_Destroy(list);
    
    return 0;
}

           程式碼首部的   struct  Value  結構體,定義了所需要在連結串列中插入的資料型別,在  GET  操作中的強轉是技術的關鍵,使得實現任意資料型別的插入!!