对链表头和尾的操作实际上就是一个对链表操作的特殊情况考虑的过程。
1. 对于delete操作来说
考虑是不是空结点;
考虑是不是链表头;
考虑是不是链表尾;
如果是空结点,直接报错;如果是头结点,删除前先将头指针赋值给新结点,移动头指针,将新节点删除,返回头指针;如果是尾结点(尾结点的下一个是NULL),则需从头指针进行遍历,一直找到尾结点的前面一个结点,然后将尾结点重置。
2. 对于insert操作来说:
先要判断原链表是否为空,如果为空的话,则出入空结点相当于创建一个链表;如果原链表不为空链表,而插入结点为空的话,直接报错;如果插入结点是头结点,则将头结点重置即可;如果插入结点是尾结点,则遍历找到尾结点,并将为节点重置即可。
代码实现:
int delete(element *elem)
{
if(!elem)
return 0;
element *curPos=(element*)malloc(sizeof(element));
curPos=head;
if(elem==head)
{
head=head->next;
free(elem);
return 1;
if(!head)
tail=NULL;
}
while(curPos)
{
if(curPos->next==elem)
curPos->next=elem->next;
free(elem);
if(curPos->next==NULL)
{ tail=curPos;
return 1;}
curPos=curPos->next;
}
return 0;
}
这里的elem是一个坐标结点,我们要插入的结点的位置就是在elem之后
int insert(element *elem, int data)
{
element *curPos=head;
element *newElem=(element*)malloc(sizeof(element));
if(!newElem)
return 0;
newElem->data=data;
if(!elem)
{
newElem->head;
head=newElem;
if(!tail)
tail=newElem;
cruPos=NULL;
return 1;
}
while(curPos)
{
if(curPos==elem)
{
newElem->next=curPos-next;
curPos->next=newElem;
if(!(newElem->next))
tail=newElem;
return 1;
}
curPos=curPos->next;
}
free(newElem);
return 0;
}