您的位置:首页 > 理论基础 > 数据结构算法

数据结构单向链表的理解

2014-12-25 17:46 253 查看
数据结构单向链表的理解

参考书籍:算法精解 C语言描述

组成分类:1、元素结构 2、链表管理结构

1、数据结构链表元素的定义:

typedef struct ListElmt_

{

void * data; //4、数据注意点:这里数据是直接放在地址上,比如链表L1表头的data要赋值10,应L1->head->data=(xtype *)10;

struct ListElmt_ *next; //供前驱,后继使用

}ListElmt;

2、数据结构链表的定义:

typedef struct List_

{

int size;

ListElmt *head; //链表表头

ListElmt *tail; //链表表尾

int (*match)(const key1,const key2);

void(*destroy)(void ** data); //销毁数据的函数

}List;

链表在已知元素element后插入元素函数构思

{

1、首先考虑有木有内存供插入使用(同时分配内存)

若无空间 返回插入失败;

2、判断已知元素element是否为空

若为空 {

判断已知元素后一个next是否为空

若为空

{

1、插入元素为listtail

}

1、插入后的新元素为listhead

}

若不为空{

判断已知元素后一个next是否为空

若为空

{

1、插入元素为listtail

}

1、插入后元素为element->next;

}

链表的size自加1;

返回插入成功;

}

程序实现:

int list_ins_next(List *list,ListElmt * element,const void *data)

{

ListElmt * new_element;

if((new_element=(ListElmt *)malloc(sizeof(ListElmt)))==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->next;

element->next=new_element;

}

list->size++;

return 0;

}

链表在已知元素element后删除元素函数构思

{

1、判断链表是否为空

若为空 返回失败;

2、判断已知元素element是否为空

若为空

{

1、删除表头;

判断删除后链表是否为空

若为空 表尾为NULL;

}

若不为空

{

1、element->next是否为空

若为空 返回失败

2、删除element->next;

判断删除后element->next是否为空

若为空 表尾为NULL;

}

3、链表的size自减1;

4、释放被删元素结构内存;(这里只释放结构体的内存)

}

程序实现:

int list_rem_elmt(List *list,ListElmt *element ,void**data)

{

ListElmt *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)==1)

list->tail=NULL;

}

else

{

if(element->next==NULL)

return -1;

*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;

}

注意点:

1、使用泛型指针:如一个函数设置“void *的形参”在实际输入前应加类型转换如”xtype *“

2、关于二重指针的传址:如果在swap(xtype * pointer1,xtype * pointer2)函数中直接对pointer1和pointer2进行交换地址,实际运行效果并

没有进行交换。这里要交换地址应使用二重指针swap(xtype ** pointer1,xtype * *pointer2),这里在输入变量如输

入变量b应为(xtype **)&b才会正确不然会报错,按上面正确输入后*pointer对于b变量的地址。

3、检测函数的编写:主要包括判断链表是否为空,有没有地方删除,有没有地方存放等

4、在上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: