原题链接:[编程入门]链表之节点删除
//声明结构体链表 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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复