2020.12.28
80行
动态链表结点的删除。
编写程序完成动态链表结点的删除,在上题动态链表创建和输出的基础上完成指定位置结点的删除操作。
要求:
1)写一个函数del() 完成动态链表结点的删除,函数参数为指向链表头的指针和被删除结点在链表中的位置。
2)调用上题中的creat() 函数完成链表的创建后再输入一个整数,调用delete() 函数将该整数位置的结点删除后,调用上题中的函数print() 完成新链表的输出。
#include<stdio.h>
#include<stdlib.h>
#define N sizeof(struct Student)
struct Student
{int num;
float score;
struct Student*next;
};
int n;
struct Student* creat(void)
{
struct Student*head;
struct Student *p1,*p2;
n=0;
p1=p2=(struct Student*)malloc(N);
scanf("%ld %f",&p1->num,&p1->score);
head=NULL;
while(p1->num!=0)
{
n+=1;
if(n==1)
{
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(struct Student*)malloc(N);
scanf("%d %f",&p1->num,&p1->score);
}
}
p2->next=NULL;
return(head);
}
void print(struct Student*creat)
{
struct Student*p1;
p1=creat;
while(p1!=NULL)
{
printf("%d%6.1f\n",p1->num,p1->score);
p1=p1->next;
}
}
struct Student* del(struct Student*creat)
{
struct Student*p1,*p2,*p3,*head;
head=p1=p2=p3=creat;
int n=0;
int k;
scanf("%d",&k);
while(p1->num!=0)
{
n++;
if(n==3) break;
if(n==1)
{
head=p1;
}
p1=p1->next;
p3=p1;
if(k==(n+1))
{
p2->next=p3->next;
break;
}
p2=p1;
}
if(n==3)
printf("Position is wrong,Delete failure\n");
return(head);
}
int main()
{
struct Student* del(struct Student*creat);
void print(struct Student*creat);
print(del(creat()));
return 0;
}
收获:要清楚一个自定义函数的返回值类型,指针类型要对应起来,指针所指的含义。要通过指针指向内容后可进行修改。