都可以。free(q)后,p->next 不会指向NULL,而是指向一个不安全的内存地址,即悬垂指针,需要你自己赋值为NULL
我学的是c++,删除指针用的是delete语句;不过,free()与delete的功能相似;那么,p->next与q指向同一存储区域,在第一种做法中,因为删除了q所指向的存储区域,p->next依旧指向那一区域,但这一区域又通过q这一一途径被删除,所以可能会造成在编译过程中出现警告性错误或错误;第二种做法正确。