链表操作

来源:互联网 发布:3d游戏视角移动 算法 编辑:程序博客网 时间:2024/04/28 02:21

#ifndef __LIST_H__
#define __LIST_H__


typedef struct list {
void *data;
struct list *next;
}List;


typedef int (*cmp_t)(void *, void *);
typedef void (*print_t)(void *);
typedef void (free_t)(void *);


 List *CreateList(void);
 int AddNodePrev(List *, void *);
 int AddNodeEnd(List *, void *);
 int DelNode(List *, void *, cmp_t, free_t);
 void DisplayNode(List *, print_t);
 void   *SearchNode(List *, void *, cmp_t);
 void FreeList(List *, free_t);
#endif /*__LIST_H__*/



//#include <common.h>

//#include <malloc.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "list.h"




/*创建一个头节点,有头的单向链表*/
List *CreateList(void)
{
List *Head = NULL;


Head = (List *)malloc(sizeof(List));
if(NULL == Head)
{
printf("Malloc Failed!# Functions:[%s];line:[%d]!\n", __FUNCTION__, __LINE__);
return NULL;
}
Head->next = NULL;
Head->data = NULL;


return Head;
}


int AddNodePrev(List *Head, void *data)
{
if(!Head)//没有什么可能性,除非操作出错
return -1;


List *new = NULL;

new = (List *)malloc(sizeof(List));
if(NULL == new)
{
printf("Malloc Failed!# Functions:[%s];line:[%d]!\n", __FUNCTION__, __LINE__);
return -1;
}


new->next = Head->next;
Head->next = new;
new->data = data;




return 0;
}


int AddNodeEnd(List *Head, void *data)
{
if(!Head)
return -1;


List *new = NULL, *tmp = NULL, *prev = NULL;


new = (List *)malloc(sizeof(List));
if(NULL == new)
{
printf("Malloc Failed! # Functions:[%s]:line:[%d]!\n", __FUNCTION__, __LINE__);
return -1;
}


tmp = Head;


while(tmp->next)
{
tmp = tmp->next;
}


tmp->next = new;
new->next = NULL;
new->data = data;


return 0;
}


int DelNode(List *Head, void *data, cmp_t compare, free_t freedata)
{
if(!Head || !compare)
return -1;


List *tmp = Head->next;
List *prev = Head;




while(tmp)
{
if(!compare(data, tmp->data))
{
freedata(tmp->data);
prev->next = tmp->next;
free(tmp);
tmp = NULL;
return 0;
}


prev = tmp;
tmp = tmp->next;
}


printf("This Node Not exist!\n");
return 0;
}


void DisplayNode(List *Head, print_t printdata)
{
if(!Head || !printdata)
return;


List *tmp = Head->next;

while(tmp)
{
printdata(tmp->data);
tmp = tmp->next;
}
}


void *SearchNode(List *Head, void *data, cmp_t compare)
{
if(!Head || !compare)
return NULL;


List *tmp = Head->next;
int i = 0;
while(tmp)
{
if(!compare(data, tmp->data))
return (void *)(tmp->data);
tmp = tmp->next;
}


return NULL;
}




/*清除掉整个链表,包括应用层传进来的数据,当然这个得应用层传函数指针进来*/
void FreeList(List *Head, free_t freedata)  //这个错了,要传指针的地址,有时间再来改
{
if(!Head || !freedata)
return -1;


List *tmp = Head->next;
while(tmp)
{
freedata(tmp->data);
Head->next = tmp->next;
free(tmp);
tmp = Head->next;
}


free(Head);
}