#include
<
stdio.h
>
#include < stdlib.h >
#define N 10
typedef struct student
{
int num;
float score;
struct student * next;
}STU;
STU * create()
{
int i;
STU * p, * head = NULL, * tail = head;
for (i = 0 ;i < N;i ++ )
{
p = (STU * )malloc( sizeof (STU));
scanf( " %d%f " , & p -> num, & p -> score);
p -> next = NULL;
if (p -> num < 0 )
{
free(p);
break ;
}
if (head == NULL)
head = p;
else
tail -> next = p;
tail = p;
}
return head;
}
void output(STU * p)
{
while (p != NULL)
{
printf( " %d\t%.2f\n " ,p -> num,p -> score);
p = p -> next;
}
}
STU * del(STU * a,STU * b)
{
STU * head, * p1, * p2;
p1 = p2 = head = a; // 让p1、p2、head结点指向链表a的头部
while (b != NULL)
{
p1 = p2 = head; // 每次循环前让p1、p2始终指向删除后链表的头部
while (p1 != NULL)
{
if (b -> num == p1 -> num) // 学号相同,删除结点信息
if (p1 == head) // 如果删除的是头结点,则头结点位置要后移
{
head = p1 -> next;
free(p1);
p1 = p2 = head;
}
else // 如果删除的是中间结点
{
p2 -> next = p1 -> next;
free(p1);
p1 = p2 -> next;
}
else // 学号不同,则p1,p2指针依次后移
{
p2 = p1;
p1 = p1 -> next;
}
}
b = b -> next;
}
return head;
}
int main( int argc, char * argv[])
{
STU * a, * b, * c;
printf( " \n请输入链表a的信息,学号小于零时结束输入:格式(学号 成绩)\n " );
a = create();
printf( " \n请输入链表b的信息,学号小于零时结束输入:格式(学号 成绩)\n " );
b = create();
system( " cls " );
printf( " \n链表a的信息为:\n " );
output(a);
printf( " \n链表b的信息为:\n " );
output(b);
c = del(a,b);
printf( " \n删除后的链表信息为:\n " );
output(c);
return 0 ;
}
#include < stdlib.h >
#define N 10
typedef struct student
{
int num;
float score;
struct student * next;
}STU;
STU * create()
{
int i;
STU * p, * head = NULL, * tail = head;
for (i = 0 ;i < N;i ++ )
{
p = (STU * )malloc( sizeof (STU));
scanf( " %d%f " , & p -> num, & p -> score);
p -> next = NULL;
if (p -> num < 0 )
{
free(p);
break ;
}
if (head == NULL)
head = p;
else
tail -> next = p;
tail = p;
}
return head;
}
void output(STU * p)
{
while (p != NULL)
{
printf( " %d\t%.2f\n " ,p -> num,p -> score);
p = p -> next;
}
}
STU * del(STU * a,STU * b)
{
STU * head, * p1, * p2;
p1 = p2 = head = a; // 让p1、p2、head结点指向链表a的头部
while (b != NULL)
{
p1 = p2 = head; // 每次循环前让p1、p2始终指向删除后链表的头部
while (p1 != NULL)
{
if (b -> num == p1 -> num) // 学号相同,删除结点信息
if (p1 == head) // 如果删除的是头结点,则头结点位置要后移
{
head = p1 -> next;
free(p1);
p1 = p2 = head;
}
else // 如果删除的是中间结点
{
p2 -> next = p1 -> next;
free(p1);
p1 = p2 -> next;
}
else // 学号不同,则p1,p2指针依次后移
{
p2 = p1;
p1 = p1 -> next;
}
}
b = b -> next;
}
return head;
}
int main( int argc, char * argv[])
{
STU * a, * b, * c;
printf( " \n请输入链表a的信息,学号小于零时结束输入:格式(学号 成绩)\n " );
a = create();
printf( " \n请输入链表b的信息,学号小于零时结束输入:格式(学号 成绩)\n " );
b = create();
system( " cls " );
printf( " \n链表a的信息为:\n " );
output(a);
printf( " \n链表b的信息为:\n " );
output(b);
c = del(a,b);
printf( " \n删除后的链表信息为:\n " );
output(c);
return 0 ;
}