创建链表的时候减少了null pointer的检测次数,体现在给链表加入了一个表头,这样就不用每次判断链表是否为空的情况,在尾端插入链表节点的时候,每加入一个节点就把rear指针指向新加入的节点,减少了每次插入前需要遍历链表的烦恼。
lklist create_list_fron()
{
pointer node,hlist;
hlist=(pointer)malloc(sizeof(*hlist));
if(!hlist)
return NULL;
hlist->list=NULL;
for(i=1;i<12;i++)
{
node=(pointer)malloc(sizeof(*node));
if(!node)
return NULL;
node->data=i;
node->next=hlist->next;
hlist->next=node;
}
return hlist;
}
lklist create_list_from_tail()
{
pointer rear,node,hlist;
hlist=(pointer)malloc(sizeof(*hlist));
if(!hlist)
return NULL;
rear=hlist;
for(i=1;i<12;i++)
{
node=(pointer)malloc(sizeof(*node));
if(!node)
return NULL;
node->data=i;
rear->next=node;
rear=node;
}
node->next=NULL;
return hlist;
}
lklist get_list_seq(pointer list,int inode)
{
pointer p;
int j=0;
if(inode <0)
return NULL;
if(inode==j)
return list->next; // inode=0,head list
for(p=list->next;p!=NULL;p=p->next)
{
j++;
if(j==inode)
break;
}
return p;
}
lklist list_insert_x(pointer list,int data,int inode)
{
pointer insert,get_node;
get_node=get_list_seq(list,inode-1);
if(!get_node)
return NULL;
insert=(pointer)malloc(sizeof(*insert));
if(!insert)
return NULL;
insert->next=get_node->next;
insert->data=data;
get_node->next=insert;
return list;
}
lklist list_del_x(pointer list,int inode)
{
pointer del_node,del_node_fron;
del_node_fron=get_list_seq(list,inode-1);
if(!del_node_fron||!del_node_fron->next)
return NULL;
del_node=del_node_fron->next;
del_node_fron->next=del_node->next;
free(del_node);
return list;
}
int list_destroy(pointer list)
{
pointer del_node,p;
if(!list)
return 0;
p=list;
while(!p)
{
del_node=p->next;
p->next=del_node->next;
if(del_node)
free(del_node);
}
return 0;
}
lklist list_reverse(pointer list)
{
pointer savep,rnode;
savep=list->next;
list->next=NULL;
while(savep!=NULL)
{
rnode=savep->next;
savep->next=list->next;
list->next=savep;
savep=rnode;
}
return list;
}