题目:有两个链表a和b,结点中包含学生的学号、姓名。从a链表中删去与b链表中有相同学号的结点。
#include<stdio.h>
typedef struct student{
int num;
double grade;
struct student *next;
}student;
student *del(student *a,student *b){
student *pre,*cur,*head=a;
while(b){
pre = head; //重置,将pre重新指向a的头部
cur = head->next;
if(pre->num == b->num){ //如果头结点需要删除,则要更新头结点
pre->next = NULL;
pre = cur;
cur = cur->next;
head = pre;
}else{
while(pre->next){
if(cur->num == b->num){
pre->next = cur->next;
break;
}else{
pre = pre->next;
cur = cur->next;
}
}
}
b= b->next;
}
return head;
}
void printList(student *root){
printf("----------------\n");
while(root){
printf("%d -> %lf\n",root->num,root->grade);
root = root->next;
}
}
int main(){
student a[3] = {{1,79},{4,36},{5,79}};
for(int i=0;i<2;i++)
a[i].next = &a[i+1];
a[2].next = NULL;
printList(a);
student b[2] = {{4,38},{1,78}};
for(int i=0;i<1;i++)
b[i].next = &b[i+1];
b[1].next = NULL;
printList(b);
student *new_a = del(a,b);
printf("删除后");
printList(new_a);
return 0;
}
结果: