数据结构单向链表的理解
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、在上
参考书籍:算法精解 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、在上
相关文章推荐
- C语言数据结构之单向链表(已经调试可以实现相应的功能了,可是还是有几个问题现在还是不大理解,希望大家能够一起探讨)
- linux 下c语言创建单向动态链表的理解
- 数据结构指——单向链表
- 数据结构——单向传统链表(java实现)
- python数据结构链表之单向链表(实例讲解)
- 数据结构Java实现03----单向链表的插入和删除
- 数据结构 单向链表
- 单向链表实现数据结构中的栈
- 数据结构:循环单向链表——约瑟夫环
- 数据结构之链表面试题汇总(四)得到两个单链表相交的第一个交点、用O(1)的时间效率删除单向链表中的指定节点
- 【数据结构练习】单向链表实现、链表逆序实现
- 数据结构:单向链表的C语言实现
- 数据结构之线性表之顺序表和链表(通过数据结构角度深入理解arrayList和linkedList的特性)
- ※数据结构※→☆线性表结构(list)☆============单向循环链表 链式存储结构(list circular single)(四)
- 数据结构-线性表之单向链表--一点一滴
- 【数据结构】单向有序链表---最水的代码
- 数据结构-单向链表两个版本
- 数据结构之单向链表操作1-(插入,删除,交换,反转,排序等操作)
- 数据结构Java实现03----单向链表的插入和删除
- 基本数据结构学习总结:单向链表