编写程序完成动态链表结点的删除,在上题动态链表创建和输出的基础上完成指定位置结点的删除操作。
要求:
1)写一个函数del() 完成动态链表结点的删除,函数参数为指向链表头的指针和被删除结点在链表中的位置。
2)调用上题中的creat() 函数完成链表的创建后再输入一个整数,调用del() 函数将该整数位置的结点删除后,调用上题中的函数print() 完成新链表的输出。
运行参考示例:
输入1:
1002 75.5
1004 85
1006 92.5
1008 88
0 0
3
输出1:
1002 75.5
1004 85.0
1008 88.0
输入2:
1002 75.5
1004 85
1006 92.5
1008 88
0 0
6
输出2:
Position is wrong,Delete failure!
1002 75.5
1004 85.0
1006 92.5
1008 88.0
运行代码如下:
#include <stdio.h>
#include <stdlib.h>
struct Student
{
int num;
float score;
struct Student *next;
} ;
struct Student *creat(); //创建单链表
struct Student *del(struct Student *p, int pos); //删除单链表结点
void print(struct Student *p);//输出单链表
int main()
{
int pos,address;
struct Student *header;
header = creat();
scanf( "%d", &pos );
header = del(header, pos);
print(header);
return 0;
}
struct Student *creat()
{
struct Student *head,*p1,*p2;
head=NULL;
p1 = p2 = (struct Student*)malloc(sizeof(struct Student));//创建一个头结点
printf( "Please input:\n");
scanf( "%d%f", &p1->num,&p1->score);
while(p1->num != 0 )
{
if(head==NULL)
head=p1;
else
p2->next=p1;
p2=p1;
p1 = (struct Student*)malloc(sizeof(struct Student));//创建一个头结点
scanf( "%d%f", &p1->num,&p1->score);
}
p2->next=NULL;
return head; //返回头指针
}
struct Student *del(struct Student *p, int pos)
{
struct Student *temp,*header, *del; //遍历到被删除结点的上一个结点
temp = header = p;
int i;
for (i=1; i<pos-1; i++)
{
temp = temp->next;
if( temp->next == NULL )
break;
}
if( temp->next==NULL )//删除位置无效
printf("Position is wrong,Delete failure!\n");
else if(pos==1) //删除的为第一个结点
{
del=p; //单独设置一个指针指向被删除结点,以防丢失
header = p->next; //需要修改头结点指针
free(del);//手动释放该结点,防止内存泄漏
}
else
{
del = temp->next;
temp->next = del->next;//删除某个结点的方法就是更改前一个结点的指针域
free(del);//手动释放该结点,防止内存泄漏
}
return header; //返回新链表头结点指针
}
void print(struct Student *p)
{
struct Student *temp = p;//将temp指针重新指向头结点
while (temp!=NULL) //只要temp指针指向的结点的next不是Null,就执行输出语句。
{
printf("%d%6.1f\n", temp->num,temp->score);
temp = temp->next;
}
printf("\n");
}