typedef int SListDataType;
//链表中的一个节点
typedef struct Node{
SListDataType value; //值
struct Node *next; //下一个节点的地址
}Node;
//单链表
typedef struct SList{
Node *first;// *head 第一个节点的地址
} SList;
方法一:
把上面的链表中不是v的拆下来,形成一个新的链表
SList* SListRemoveAll2(Node *slist, int v){
//遍历整个链表中的节点,如果发现节点中的值不是v
//就把这个节点尾插到一个结果链表上
Node* result = NULL;//结果链表的第一个节点
Node* last = NULL;//结果链表的最后一个节点
Node*c = slist;
while (c != NULL){//先遍历
if (c->value != v){//在判断,是否为v
//如果不是v,要插入,就有两种情况1.result为空2.result不为空
if (result == NULL){
result=last = c;
}
else{
last->next = c;
last = c;
}
}
c = c->next;
}
if (last != NULL){
last->next = NULL;
}
return result;
}
方法2:
在一条链表上操作
SList* SListRemoveAll(SList *slist, int v){
Node * c = slist;
//链表中一个节点都没有
if (c == NULL){
return;
}
//当v在第一个节点处
if (c->value == v){
//头删
Node * second = c->next;
free(c);
c = second;
}
while (c->next != NULL){
if (c->next->value == v){
Node * next = c->next;
free(next);
c->next = next->next;
}
else{
c = c->next;//如果不是v,则继续往后走
}
}
}