以下代码实现的功能是删除单链表中的偶数节点
但我写下这篇博客的原因不是为了记住这道题怎么解决 , 而是帮助自己更好的理解C语言中指针地址指向的问题
#include<bits/stdc++.h>
using namespace std;
typedef struct stu{
int data;
struct stu* next;
}shanchu;
stu* initlist(stu* head , int n){
head = (stu*)malloc(sizeof(shanchu));
scanf("%d" , &head->data);
head->next = NULL;
stu* p = head;
for(int i=1;i<n;i++){
stu* body = (stu*)malloc(sizeof(shanchu));
scanf("%d" , &body->data);
body->next = NULL;
p->next = body;
p = p->next;
}
return head;
}
stu* deletesort(stu* head){
stu* temp = head;
stu* p;
while(head&&(head->data)%2==0){
temp = head;
head = head->next;
free(temp);
}
temp = head;
while(temp&&temp->next){
while(temp->next&&(temp->next->data)%2==0){
p = temp->next;
temp->next = p->next;
}
temp = temp->next;
}
return head;
}
void display(stu* head){
stu* point = head;
while(point){
if(point->next==NULL){
printf("%d" , point->data);
}
else{
printf("%d " , point->data);
}
point = point->next;
}
}
int main(){
int n;
scanf("%d" , &n);
stu* head = NULL;
head = initlist(head , n);
head = deletesort(head);//这个地方需要注意
/*在主函数中你通过head = initlist(head , n)进行了head的初始化,使head指向链表中的头结点
在经过deletesort()函数操作后你的head已经指向了链表中的第一个奇数所在的结点
但要注意你这里只改变了deletesort()函数中head指向的位置,主函数中的head还是指向链表中的头结点
所以在主函数main中你要进行head = deletesort(head)这个操作,将主函数中的head指向链表中的第一个奇数所在的结点
如果不进行该操作,只是写下deletesort(head),那么主函数中的head指向的结点就没有发生改变
还是指向链表的头结点,而不是指向链表中的第一个奇数所在的结点
在这种情况下如果直接display(head),他会从链表中的头结点开始输出,而不是从链表中的第一个奇数所在的结点开始输出,你就会WA
*/
display(head);
}