链表操作
来源:互联网 发布: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);
}
- 实现链表基本操作(简单操作)
- 链表操作源程序
- 链表操作
- C++ 链表操作
- 链表的操作
- 链表操作源程序
- 链表的操作
- 链表的操作
- C++链表操作
- 链表操作
- 链表操作
- 链表基本操作
- LinkList链表操作
- 合并链表操作
- 链表简单操作
- 链表的操作
- 链表操作
- 操作链表
- 动态链接库简介
- poj-1611
- Linux 多线程编程入门--线程函数解释
- LPC11Cxx GPIOSetDir GPIOSetValue 函数分析
- aptitude命令软件状态标志含义
- 链表操作
- helloworld
- 折叠眼镜
- Linux 信号说明列表
- Android缩放图片<高质量 新>
- Linux网络编程poll模型
- 一个极客的意外死亡
- 抓取Webservice Soap请求
- howto dump ROM file from MTK 657* phone or pad?