有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同学号的那些结点。
#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;
}