数据结构单向链表的理解

数据结构单向链表的理解

参考书籍:算法精解 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、在上

                                             

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值