c语言,为什么链表的第一个结点删不掉?

来源:百度知道 编辑:UC知道 时间:2024/09/20 09:34:41
有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同学号的那些结点。
1,1
0,0
1,1
0,0
1,1.000000
为什么呢
我在if(p2==head1)里讨论了

#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct student)
struct student
{long num;
float score;
struct student *next;
};

void del(struct student *head1,struct student *head2)
{
struct student *p1,*p2,*p3;
p1=head2;
while(p1!=NULL)
{
p2=head1;
p3=head1;
while(p2!=NULL){
if(p1->num==p2->num){
if(p2==head1){
head1=p2->next;
p2=p2->next;
p3=p3->next;
}
else{
p3->next=p2->next;
p2=p3

head1在函数del里作为形参出现,虽然在函数del里你确实改变了形参head1的值,但是函数返回时,形参值的改变不会保留,主函数中head1的值并没有改变,这就是原因。

从程序设计意图来看,你只需要操作head1开头的链表,head2开头的链表是不变的,所以为了改变head1的值,那么可以用返回值。这样定义del函数,
struct student *del(struct student *head1,struct student *head2)

然后让函数返回head1的值,
return head1;

在主函数中,del(head1,head2); 改为
head1=del(head1,head2);
这样就可以了。