数据结构学习(1)-链表
2015-11-03 18:41
627 查看
最近在学习数据结构,最先看了几天书,啥的没看懂,什么链表,堆栈,树,一塌糊涂。没办法把书丢一边,过了一段时间,又看了一点清华大学的严蔚敏的数据结构,恍然大悟。原来链表就是用指针把他们给串起来。早说啊,搞得我这么暝是苦想这么久。
那我就先贴个代码,(先声明代码不是我原创,是一位叫Kyle Loudon的大神写的)是单向链表的代码
先是list.c
#include <stdlib.h>
#include <string.h>
#include "list.h"
/*
*********************************************************************************************************
*函数名:list_init()
*功能说明:初始化链表
*形参:
*返回值:
*********************************************************************************************************
*/
void list_init(List *list,void (*destory)(void *data))
{
list->size=0;
list->destory=destory;
list->head=NULL;
list->tail;
return;
}
/*
*********************************************************************************************************
*函数名:list_destroy()
*功能说明:消除链表
*形参:
*返回值:
*********************************************************************************************************
*/
void list_destory(List *list)
{
void *data;
while(list_size(list)>0)
{
if(list_rem_next(list,NULL,(void **)&data)==0&&list->destory!=NULL)
{
list->destory(data);
}
}
memset(list,0,sizeof(List));
return;
}
/*
*********************************************************************************************************
*函数名:list_ins_next()
*功能说明:将一个元素插入链表
*形参:
*返回值:
*********************************************************************************************************
*/
int list_ins_next(List *list,ListEmlt *element,const void *data)
{
ListEmlt *new_element;
if((new_element=(ListEmlt *)malloc(sizeof(ListEmlt)))==NULL)
{
return -1;
}
new_element->data=(void *)data;
if (element==NULL)
{
if (list_size(list)==0)
list->tail=new_element;
new_element->next=list_head;
list->head=new_element;
}
else
{
if (element->next==NULL)
{
list_tail=new_element;
}
new_element->next=element;
element->next=new_element;
}
list->size++;
return 0;
}
/*
*********************************************************************************************************
*函数名:list_init()
*功能说明:将一个元素移除链表
*形参:
*返回值:
*********************************************************************************************************
*/
int list_rem_next(List *list,ListEmlt *element,void **data)
{
ListEmlt *old_element;
if (list_size(list)==0)
{
return -1;
}
if (element==NULL)
{
*data=list->head->data;
old_element=list->head;
list->head=list->head->next;
if (list_size(list)==NULL)
{
list->tail=NULL;
}
}
else
{
*data=element->next->data;
old_element=element->next;
element->next=element->next->next;
if (element->next==NULL)
{
list->tail=element;
}
}
free(old_element);
list->size--;
return 0;
}
然后是list.h
#ifndef LISH_H
#define LISH_H
#include <stdlib.h>
typedef struct ListElmt_
{
void *data;
struct ListElmt_ *nest;
}ListEmlt;//一个元素的单位
typedef sturct List_
{
int size;
int (*mtch)(cost void *key1,const void *key2);//不是链表本身的使用,是链表数据结构派生的新类型使用
void (*destory)(void *data);//destory是封装之后的传递给List_init的析构函数
ListEmlt *head;
List *tail;
}List//定义一个链表的结构体
void list_Init(List *list,void (*destory)(void *data));
void list_destory(list *list);
int list_ins_nest(List *list,ListEmlt *element,const void *data);
int list_rem_nest(List *list,ListElmt *element,void **data);
#define list_size(list) ((list)->head)
#define list_head(list) ((list)->tail)
#define list_tail(list) ((list)->tail)
#define listz_is_head(list,element) ((element)==(list)->head?1:0)
#define list_is_tail(element) ((element)->next==NULL?1:0)
#define list_data(element) ((element)->data)
#define list_nest(element) ((element)->next)
#endif
对,我就是一个抄代码的,鄙视我的请左转出门不送。
那我就先贴个代码,(先声明代码不是我原创,是一位叫Kyle Loudon的大神写的)是单向链表的代码
先是list.c
#include <stdlib.h>
#include <string.h>
#include "list.h"
/*
*********************************************************************************************************
*函数名:list_init()
*功能说明:初始化链表
*形参:
*返回值:
*********************************************************************************************************
*/
void list_init(List *list,void (*destory)(void *data))
{
list->size=0;
list->destory=destory;
list->head=NULL;
list->tail;
return;
}
/*
*********************************************************************************************************
*函数名:list_destroy()
*功能说明:消除链表
*形参:
*返回值:
*********************************************************************************************************
*/
void list_destory(List *list)
{
void *data;
while(list_size(list)>0)
{
if(list_rem_next(list,NULL,(void **)&data)==0&&list->destory!=NULL)
{
list->destory(data);
}
}
memset(list,0,sizeof(List));
return;
}
/*
*********************************************************************************************************
*函数名:list_ins_next()
*功能说明:将一个元素插入链表
*形参:
*返回值:
*********************************************************************************************************
*/
int list_ins_next(List *list,ListEmlt *element,const void *data)
{
ListEmlt *new_element;
if((new_element=(ListEmlt *)malloc(sizeof(ListEmlt)))==NULL)
{
return -1;
}
new_element->data=(void *)data;
if (element==NULL)
{
if (list_size(list)==0)
list->tail=new_element;
new_element->next=list_head;
list->head=new_element;
}
else
{
if (element->next==NULL)
{
list_tail=new_element;
}
new_element->next=element;
element->next=new_element;
}
list->size++;
return 0;
}
/*
*********************************************************************************************************
*函数名:list_init()
*功能说明:将一个元素移除链表
*形参:
*返回值:
*********************************************************************************************************
*/
int list_rem_next(List *list,ListEmlt *element,void **data)
{
ListEmlt *old_element;
if (list_size(list)==0)
{
return -1;
}
if (element==NULL)
{
*data=list->head->data;
old_element=list->head;
list->head=list->head->next;
if (list_size(list)==NULL)
{
list->tail=NULL;
}
}
else
{
*data=element->next->data;
old_element=element->next;
element->next=element->next->next;
if (element->next==NULL)
{
list->tail=element;
}
}
free(old_element);
list->size--;
return 0;
}
然后是list.h
#ifndef LISH_H
#define LISH_H
#include <stdlib.h>
typedef struct ListElmt_
{
void *data;
struct ListElmt_ *nest;
}ListEmlt;//一个元素的单位
typedef sturct List_
{
int size;
int (*mtch)(cost void *key1,const void *key2);//不是链表本身的使用,是链表数据结构派生的新类型使用
void (*destory)(void *data);//destory是封装之后的传递给List_init的析构函数
ListEmlt *head;
List *tail;
}List//定义一个链表的结构体
void list_Init(List *list,void (*destory)(void *data));
void list_destory(list *list);
int list_ins_nest(List *list,ListEmlt *element,const void *data);
int list_rem_nest(List *list,ListElmt *element,void **data);
#define list_size(list) ((list)->head)
#define list_head(list) ((list)->tail)
#define list_tail(list) ((list)->tail)
#define listz_is_head(list,element) ((element)==(list)->head?1:0)
#define list_is_tail(element) ((element)->next==NULL?1:0)
#define list_data(element) ((element)->data)
#define list_nest(element) ((element)->next)
#endif
对,我就是一个抄代码的,鄙视我的请左转出门不送。
相关文章推荐
- java 数据结构
- 数据结构--图 的JAVA实现(下)
- C++数据结构环形队列Deque实现
- POJ 1226 Substrings (后缀数组)
- 2015年大二上-数据结构-链表(3)-单链表算法
- 《C++并发编程实战》读书笔记4---并发数据结构queue
- 实现超大整数(超过long长度范围)的加法运算
- 多项式相加
- 数据结构实验2(设计哈弗曼编码和译码系统)
- Unity3D中常用的数据结构总结与分析
- JSON数据结构解析
- 解析概念及两种数据结构
- 常用数据结构
- redis数据结构_codepython整理一
- 树---判断两棵树是否相等
- LeetCode Binary Tree Postorder Traversal(数据结构)
- POJ 1743 Musical Theme (后缀数组)
- 数据结构基础4:串
- Lua1.0 数据结构
- 数据结构例程——图的遍历