对于指针地址指向及return 的小理解

以下代码实现的功能是删除单链表中的偶数节点

但我写下这篇博客的原因不是为了记住这道题怎么解决 , 而是帮助自己更好的理解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);
}

上一篇:类与对象


下一篇:python 面向对象之组合、魔法、反射