A Great Breakthrough!!!
通过一段时间的自学。终于把能自己做出链表的题了。链表这东西算是我学习c语言的第一个难点吧,好在理解后也不算太难。没有人指导的情况下自己做出突破真的很不容易,就这个题就
做了一个上午。
题目描述
有两个链表a和b,设节点中包含学号、成绩。从a链表中删去b链表中有相同学号的那些节点。
输入
第一行有两个用空格隔开的整数n和m,分别表示a和b两个链表中的节点个数。保证n和m均不超过100。
之后的n行每行有两个用空格隔开的整数,分别表示一个学生的学号和成绩。
最后的m行每行有两个用空格隔开的整数,分别表示一个学生的学号和成绩。
a和b两个链表中的节点并不一定按照学号顺序排列。保证a链表中学号各不相同,b链表中学号各不相同。
输出
首先输出a链表最终剩下的节点个数k。
在接下来的k行,每行输出两个用空格隔开的整数,分别表示一个学生的学号和成绩。
请注意行尾输出换行。
样例输入复制
3 3 106 90 104 80 101 85 104 95 106 88 105 87
样例输出复制
1 101 85
#include<stdio.h>
#include<stdlib.h>
typedef struct student{
int num;
int gra;
struct student *next;
}Node;
Node *creatlist(int n)
{
Node* head,*p1,*p2;
head=p1=p2=(Node*)malloc(sizeof(Node));
while(n--)
{
p2=p1;
p1=(Node*)malloc(sizeof(Node));
scanf("%d%d",&p1->num,&p1->gra);
p2->next=p1;
}
p1->next=NULL;
return head;
}
Node *dele(Node *list1,Node* list2,int num1,int num2)
{
int keep=num1;
Node *p1=list1->next,*p2=list1,*p3=list2->next;
circle: while(p1!=NULL)
{
while(p3->next!=NULL)
if(p1->num==p3->num)
{
p2->next=p1->next;
free(p1);
keep--;
p1=p2->next;
p3=list2;
goto circle;
}
else
p3=p3->next;
p2=p1;
p1=p1->next;
p3=list2;
}
printf("%d\n",keep);
return list1;
}
void printlist(Node *list1)
{
Node *p1=list1->next;
while(p1!=NULL)
{
printf("%d %d\n",p1->num,p1->gra);
p1=p1->next;
}
}
int main()
{
int num1,num2;
Node *list1,*list2;
scanf("%d%d",&num1,&num2);
list1=creatlist(num1);
list2=creatlist(num2);
dele(list1, list2, num1, num2);
printlist(list1);
}