数据结构学习(1)-链表

来源:互联网 发布:sql怎么删除列 编辑:程序博客网 时间:2024/06/10 09:35

最近在学习数据结构,最先看了几天书,啥的没看懂,什么链表,堆栈,树,一塌糊涂。没办法把书丢一边,过了一段时间,又看了一点清华大学的严蔚敏的数据结构,恍然大悟。原来链表就是用指针把他们给串起来。早说啊,搞得我这么暝是苦想这么久。

那我就先贴个代码,(先声明代码不是我原创,是一位叫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

 对,我就是一个抄代码的,鄙视我的请左转出门不送。

0 0
原创粉丝点击