#include/*
1、创建a、b两个链表和计数器count = n
2、嵌套循环
for(i=1;i<=n;i++)
for(j = 1;j<=m;j++)
{
取a的第一个结点的学号和b中所有的学号进行比较,如果有相同,就删除a中的这个结点,计数器减一
如果进行了删除结点操作,a的指针就不后移
否则指针向后移
}
3、输出count和链表a
*/
typedef struct Node
{
int number;
int grades;
struct Node* next;
}* LinkList, Node;
void Creat_L(LinkList head, int n);
int Get_Elem(LinkList head, int i);
void Print_L(LinkList head);
void Delete_ALL(LinkList head);
int main(int argc, char* argv[])
{
LinkList a, b;
LinkList perior, current, q;
int count, n, m, num_a, num_b, f;//f是为了记录是否进行了删除结点操作
scanf("%d%d", &n, &m);
count = n;
/*链表初始化*/
a = (LinkList)malloc(sizeof(Node));
b = (LinkList)malloc(sizeof(Node));
/*创建链表*/
Creat_L(a, n);
Creat_L(b, m);
perior = a;
current = a->next;
for (int i = 1; i <= n; i++)
{
f = 1;//每次f都要初始化
/*取a中当前结点的学号*/
num_a = current->number;
for (int j = 1; j <= m; j++)
{
/*获取相应位置上的学号并赋给num*/
num_b = Get_Elem(b, j);
/*判断这两个学号是否相同,相同则删除a中的结点*/
if (num_a == num_b)
{
perior->next = current->next;
q = current;
current = current->next;
count--;
/*如果删除了a中的某个结点,current就已经是下一个结点了,所以用f记录*/
f = 0;
free(q);
break;
}
}
/*如果当前结点不是最后结点*/
if (f)
{
/*指针后移*/
perior = perior->next;
current = current->next;
}
}
printf("%d\n", count);
Print_L(a);
Delete_ALL(a);
Delete_ALL(b);
return 0;
}
```
创建链表函数
```c
/*创建链表,采用尾插法,带头结点*/
void Creat_L(LinkList head, int n)
{
LinkList p, r;
r = head;
for (int i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(Node));
scanf("%d%d", &p->number, &p->grades);
r->next = p;
r = p;
}
r->next = NULL;
}
```
获取元素函数
```c
/*获取链表中第i个位置上的元素*/
int Get_Elem(LinkList head, int i)
{
LinkList p;
int j = 1;
p = head->next;//等于首结点
/*找到第i个位置*/
while (p && j < i)
{
p = p->next;
j++;
}
if (p != NULL)
{
return p->number;
}
else
{
return 0;
}
}
```
输出链表和删除整个链表
```c
/*输出整个链表*/
void Print_L(LinkList head)
{
LinkList p;
p = head->next;
while (p)
{
printf("%d %d\n", p->number, p->grades);
p = p->next;
}
}
/*删除整个链表*/
void Delete_ALL(LinkList head)
{
LinkList p, q;
p = head->next;
while (p)
{
q = p->next;
free(p);
p = q;
}
head->next = NULL;
}
```