void SLinkInit(SLinkNode** phead)
{
assert(phead);
*phead=NULL;
}
void SLinkPrint(SLinkNode* phead)
{
if( phead==NULL)
{
printf("actual:");
printf("SLink is empty\n");
return;
}
SLinkNode *cur=phead;
printf("actual:");
for( ;cur!=NULL;cur=cur->next)
{
printf("%c-> ",cur->data);
}
printf("NULL\n");
}
SLinkNode* SLinkCreat( DataType value)
{
SLinkNode* newnode=(SLinkNode*)malloc(sizeof(SLinkNode));
assert( newnode);
newnode->data=value;
newnode->next=NULL;
return newnode;
}
void SLinkPushBack(SLinkNode** pphead,DataType value)
{
if( *pphead==NULL)
{
*pphead=SLinkCreat( value);
}
else
{
SLinkNode* cur=*pphead;
while( cur->next!=NULL)
{
cur=cur->next;
}
cur->next=SLinkCreat(value);
}
}
void SLinkPushFront(SLinkNode** pphead,DataType value)
{
if( pphead==NULL)
{
return ;
}
if( *pphead==NULL)
{
SLinkCreat( value);
}
else
{
SLinkNode* newnode=SLinkCreat( value);
newnode->next=*pphead;
*pphead=newnode;
}
}
void SLinkPopFront(SLinkNode** pphead)
{
if( pphead==NULL)
{
return ;
}
if( *pphead==NULL)
{
return;
}
else
{
SLinkNode* cur=( *pphead)->next;
free( *pphead);
( *pphead)=cur;
}
}
void SLinkPopBack( SLinkNode** pphead)
{
if( pphead==NULL)
{
return;
}
if(( *pphead)->next==NULL)
{
free(*pphead);
*pphead==NULL;
}
else
{
SLinkNode* pre=NULL,*cur=*pphead;
while( cur->next!=NULL)
{
pre=cur;
cur=cur->next;
}
free( cur);
pre->next=NULL;
}
}
void SLinkDestory( SLinkNode** pphead)
{
if( pphead==NULL)
{
return;
}
//遍历链表并销毁
SLinkNode* cur=*pphead;
while(cur)
{
//定义一个_next指针用来保存cur->next,便于销毁cur
SLinkNode* next=cur->next;
free(cur);
cur=next;
}
//将头指针置为NULL,避免成为野指针
*pphead=NULL;
}
SLinkNode* SLinkFind(SLinkNode *phead, DataType value)
{
if( phead==NULL)
{
return ;
}
SLinkNode* cur=phead;
while( cur)
{
if( ( cur->data)==value)
{
return cur;
}
cur=cur->next;
}
return NULL;
}
//在指定位置前面插人
void SLinkInsert(SLinkNode** pphead,SLinkNode* pos,DataType value)
{
if(pphead==NULL )
{
return;
}
//链表为空或者位置非法,删除失败
if( *pphead==NULL||pos==NULL)
{
return ;
}
//p如果pos是头结点,则直接调用头插
if( *pphead==pos)
{
SLinkPushFront(pphead,value);
}
//如果pos在链表中间位置
else
{
//找到pos之前的位置
SLinkNode* newnode=SLinkCreat( value);
SLinkNode* pre=*pphead;
while( pre->next!=pos)
{
pre=pre->next;
}
//找到pre指针,让它指向新节点,新节点指向pos
pre->next=newnode;
newnode->next=pos;
}
}
//删除指定位置的值
void SLinkErase(SLinkNode** pphead,SLinkNode* pos)
{
if( pphead==NULL)
{
return;
}
//链表为空或者位置非法,删除失败
if(*pphead==NULL||pos==NULL)
{
return ;
}
//p如果pos是头结点,则直接调用头删
if( *pphead==pos)
{
SLinkPopFront( pphead);
}
//pos是尾节点
else if(pos->next==NULL)
{
SLinkPopBack( pphead);
}
//pos是链表中间位置
else
{
//找到之前pos的之前的位置
SLinkNode* pre=*pphead;
while( pre->next!=pos)
{
pre=pre->next;
}
//保存pos的next,销毁pos
pre->next=pos->next;
free( pos);
}
}