题目: 建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
#include<stdio.h>
typedef struct student{
int num;
char name[32];
char sex[10];
int age;
struct student *next;
}student;
void printList(student *root){
printf("----------------\n");
while(root){
printf("num:%d, sex: %s, name: %s, age: %d\n", root->num, root->sex, root->name, root->age);
root = root->next;
}
}
// 方法一
student *del_age(student *a,int age){
student *head=a,*pre=a,*cur=a->next;
while(cur){
if(pre->age == age){//如果头结点需要删除,则更新头结点
pre->next = NULL;
pre = cur;
cur = cur->next;
head = pre;
}else{
if(pre->age == age)
pre->next = cur->next;
pre = cur;
cur = cur->next;
}
}
return head;
}
//方法二
student *del(student *a, int n){
student *s=a,*head=a;
int i;
for (i=1; s; s=s->next)
if (s->age==n){
if (head==s) //要删除的结点在头结点
head=s->next;
else if (s->next==NULL)//要删除的结点在尾结点
(s-i)->next=NULL;
else{ //要删除的结点在中间结点
(s-1)->next=s+1;
i++;
}
}
return head;
}
int main(){
student a[] = {{1,"男","xyz",12},
{4,"男","uuu",35},{5,"女","iii",79},
{7,"男","abc",35},{8,"女","abc",12}};
for(int i=0;i<5;i++)
a[i].next = &a[i+1];
a[4].next = NULL;
printList(a);
printf("请输入age:");
int age;
scanf("%d",&age);
student *new_a = del(a,age);
printf("删除后");
printList(new_a);
printf("请输入age:");
scanf("%d",&age);
student *new_b = del(new_a,age);
printf("再删除一个");
printList(new_b);
return 0;
}
结果: