用C语言实现单链表的插入和删除,主要用到了“双指针”的方法。
一、有头单链表
1、删除指定节点
void deleteNode_headed(Listnode* head,int deleteData)
{
Listnode* fast = head->next;
Listnode* slow = head;
while(fast != NULL) //遍历链表找到要删除的节点
{
if(fast->data == deleteData)//找到了则删除节点
{
slow->next = fast->next;
free(fast);
fast = NULL;
head->data--;
return;
}
fast = fast->next;
slow = slow->next;
}
printf("The node is not found.\n");//找不到则打印提示信息
return;
}
2、插入指定节点
(1)插入到单链表头部
void insertNode_headed_head(Listnode* head, Listnode* nodeAdded)
{
head->data++;
nodeAdded->next = head->next;
head->next = nodeAdded;
}
(2)插入到单链表尾部
void insertNode_headed_tail(Listnode* head, Listnode* nodeAdded)
{
head->data++;
while(head->next != NULL)
{
head = head->next;
}
head->next = nodeAdded;
nodeAdded->next = NULL;
}
(3)插入到有序单链表,使链表依然有序
void insertNode_headed_ordered(Listnode* head, Listnode* nodeAdded,int(*comp)(const void *, const void *))
{
Listnode* fast = head->next;
Listnode* slow = head;
while(fast != NULL) //寻找比插入节点大的节点
{
if(comp(fast,nodeAdded) > 0) //找到了则插入
{
slow->next = nodeAdded;
nodeAdded->next = fast;
head->data++;
return;
}
fast = fast->next;
slow = slow->next;
}
slow->next = nodeAdded; //没找到则插入到链表的尾部
nodeAdded->next = NULL;
head->data++;
return;
}
二、无头单链表
1、删除指定节点
Listnode* deleteNode_headless(Listnode* head,int deleteData)
{
if(head == NULL) //若为空链表,打印提示信息
{
printf("The node is not found.\n");
return head;
}
Listnode* slow = head;
Listnode* fast = head->next;
if(slow->data == deleteData) //若删除的是第一个节点
{
free(slow);
slow = NULL;
head = fast;
return head;
}
while(fast != NULL) //遍历链表找到要删除的节点
{
if(fast->data == deleteData)//找到了则删除节点
{
slow->next = fast->next;
free(fast);
fast = NULL;
return head;
}
fast = fast->next;
slow = slow->next;
}
printf("The node is not found.\n");//找不到则打印提示信息
return head; //因为可能会将头节点赋值为NULL(只有一个节点,且需要删除的情况),
} //又因为是值传递的头节点,所以要返回头节点
2、插入指定节点
(1)插入到单链表头部
Listnode* insertNode_headless_head(Listnode* head, Listnode* nodeAdded)
{
nodeAdded->next = head;
return nodeAdded;
}
(2)插入到单链表尾部
Listnode* insertNode_headless_tail(Listnode* head, Listnode* nodeAdded)
{
if(head == NULL) //判断是否是空链表
{
nodeAdded->next = NULL;
return nodeAdded;
}
Listnode* temp = head;
while(temp->next != NULL)
{
temp = temp->next;
}
temp->next = nodeAdded;
nodeAdded->next = NULL;
return head;
}
(3)插入到有序单链表,使链表依然有序
Listnode* insertNode_headless_ordered(Listnode* head, Listnode* nodeAdded,int(*comp)(const void *, const void *))
{
if(head == NULL) //判断是否为空链表
{
nodeAdded->next = NULL;
return nodeAdded;
}
Listnode* slow = head;
if(comp(slow,nodeAdded) > 0) //若插入节点比头节点小,则将插入节点作为头节点
{
nodeAdded->next = slow;
return nodeAdded;
}
Listnode* fast = head->next;
while(fast != NULL) //找到比插入节点大的节点
{
if(comp(fast,nodeAdded) > 0) //如果找到则插入
{
slow->next = nodeAdded;
nodeAdded->next = fast;
return head;
}
fast = fast->next;
slow = slow->next;
}
slow->next = nodeAdded; //否则插入到链表尾部
nodeAdded->next = NULL;
return head;
}