求教链表指针问题???
程序是:如果输入的年龄和链表结点的相同,则删除相同年龄的结点。程序现在没有错了。只是中间有个错误误打误撞找到了,但是就是不理解。想大神们指教。。。。。。。。。。。。。。。。。疑问是删除函数struct student *del(struct student *dhead,int iage)里的一个while()语句。我用》》》
箭头标出来了。求指教。。。。。。
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#define LEN sizeof(struct student)
#define NULL 0
int n,find;
struct student
{
int num;
char name[20];
char sex;
int age;
struct student *next;
}stu;
struct student *create(void)//创建一个动态链表
{
struct student *p1,*p2,*chead;
p1 = p2 = (struct student *)malloc(LEN);
printf("请输入链表数据(各项数据为 0 时输入结束):\n");
scanf("%d %s %c %d",&p1->num,p1->name,&p1->sex,&p1->age);
while(p1->num != 0)
{
n = n + 1;
if(n == 1)chead = p1;
else p2->next = p1;
p2 = p1;
p1 = (struct student *)malloc(LEN);
scanf("%d %s %c %d",&p1->num,p1->name,&p1->sex,&p1->age);
}
p2->next = NULL;
return(chead);
}
struct student *del(struct student *dhead,int iage)//删除数据函数
{
struct student *p1,*p2;
p1 = p2 = dhead;
while(p1 != NULL)
{
》》》》》 while(p1->age != iage)//不相等时 //原来这句是 while(p1->age != iage && p1 != NULL) 为什么加了个 p1 != NULL .程序就错。
{
p2 = p1;
p1 = p1->next;//p1向后移一个结点
}
if(p1->age == iage)
{
if( dhead == p1)//相等且是头指针的情况
{
p1 = p1->next;
dhead = p2 = p1;
}
else//相等但不是头指针。
{
p2->next = p1->next;
p1 = p2->next;
}
}
}
return(dhead);
}
void print(struct student *fhead)//输出函数
{
struct student *p;
p = fhead;
if(fhead == NULL)printf("空链表!\n");
else
do
{
printf("%d %s %c %d\n",p->num,p->name,p->sex,p->age);
p = p->next;
}while(p != NULL);
}
int main(void)
{
int age;
char y=1;
struct student *head,*delf;
head = create();
printf("请输入要删除的年龄age :");
scanf("%d",&age);
printf("要删除的年龄age = %d\n",age);
delf = del(head,age);
printf("删除后的链表数据:\n");
print(delf);
free(delf);
getch();
return 0;
}
/*
程序运行结果:
--------------------------------------------------------
请输入链表数据(各项数据为 0 时输入结束):
10101 yanga m 18
10102 yangb f 19
10103 yangc m 20
10104 yangd f 18
10105 yange m 19
10106 yangf f 18
0 0 0 0
请输入要删除的年龄age :18
要删除的年龄age = 18
删除后的链表数据:
10102 yangb f 19
10103 yangc m 20
10105 yange m 19
--------------------------------------------------------
*/