原题链接:[编程入门]链表之节点删除
//声明结构体链表
typedef struct student{
int num;
int score;
struct student *next;
}STU,*LINK;//定义
//创建结构体链表函数
LINK createLink(int n){//n为传入的结点数
int i;
int num,score;
LINK head,tail,p;//定义 头 尾 利用尾插法创建列表
head=tail=(LINK)malloc(sizeof(STU));//为head分配空间
tail->next=NULL;
for(i=0;i<n;i++){
p=(LINK)malloc(sizeof(STU));
scanf("%d",&num);
scanf("%d",&score);
p->num=num;
p->score=score;
p->next=NULL;//创建新结点
tail->next=p;
tail=p;
}
return head;
}
//判断删除结点函数
void process(LINK head1,LINK head2,int n){
LINK pr=head1;
int count=0;//记录删除的结点数
LINK p=head1->next;
int flag;//定义标志变量
while(p!=NULL){
flag=0;//标志变量为0时 表示没有相同学号
LINK q=head2->next;//每次q需从头开始遍历链表
while(q!=NULL){
if(p->num==q->num){
pr->next=p->next;//相同时 将前指针pr->next指向p的
free(p);//x消除后释放 不用再变pr即不需要pr=pr->next;
p=pr->next;//向后移动p
flag=1;
count++;//计数
break;
}
q=q->next;//移动q
}
if(flag==0){//当无元素相同时 pr p分别向下移动
pr=pr->next;
p=p->next;
}
}
printf("%d\n",n-count);//计算出剩余的结点
LINK head=head1->next;
while(head!=NULL){//打印输出
printf("%d %d\n",head->num,head->score);
head=head->next;
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
LINK head1,head2;
head1=createLink(n);
head2=createLink(m);
process(head1,head2,n);
return 0;
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复