早教吧 育儿知识 作业答案 考试题库 百科 知识分享

c语言问题,急急急!关于链表的!题目是这样的:链表练习:求集合的差:假设集合A用单链表LA表示,集合B用单链表LB表示,设计算法求两个集合的差,即A-B。提示:由集合运算的规则可

题目详情
c语言问题,急急急!关于链表的!
题目是这样的:
链表练习:
求集合的差:假设集合A用单链表LA表示,集合B用单链表LB表示,设计算法求两个集合的差,即A-B。
提示:由集合运算的规则可知,集合的差A-B中包含所有属于集合A而不属于集合B的元素。具体做法是,对于集合A中的每个元素e,在集合B的链表LB中进行查找,若存在与e相同的元素,则从LA中将其删除
▼优质解答
答案和解析
#include <stdio.h>
#include <stdlib.h>
typedef struct list{
int elem;//存数链表节点的元素值 
struct list *next;//指向下一节点 
}LIST;
LIST *createlist(int n)
{
LIST *head,*p,*p1;
int i;
head=(LIST *)malloc(sizeof(LIST));
p=head;
scanf("%d",&(p->elem));
p->next=NULL;
for(i=1;i<n;i++)
{
p1=(LIST *)malloc(sizeof(LIST));
scanf("%d",&(p1->elem));
p1->next=NULL;
p->next=p1;
p=p1;
}
return head;

LIST *A_B(LIST *A,LIST *B)//计算A-B,计算结果保存在A中
{
LIST *pa,*pa_prev,*pb;
int e,flag;
pa=A;
pa_prev=A;
while(pa!=NULL)//遍历链表A中的每一个元素 
{
flag=0; 
e=pa->elem;
pb=B;//对A中的每一个元素e,都从LB的表头开始查找
while(pb!=NULL)
{
if (pb->elem==e) //若A中的元素B也有,则在A中删除该元素
{
if (pa==A) //pa是表头
{
  A=pa->next;
  pa_prev=pa->next;
  pa=pa->next;
  flag=1;

else if(pa->next==NULL)//pa是表尾 
{
pa=NULL;
pa_prev->next=pa;
flag=1;
}
else//非表头元素和表尾元素 
{
pa_prev->next=pa->next;
pa=pa->next;
flag=1;
}
break;
}
else pb=pb->next;  
}
if (flag==0) {pa_prev=pa;pa=pa->next;}
}
return A;

int main()
{
LIST *LA,*LB;
LIST *p;
int num;
printf("请输入链表A的长度:");
scanf("%d",&num);
printf("请输入链表A的元素,中间用空格隔开:");
LA=createlist(num);
printf("\n请输入链表B的长度:");
scanf("%d",&num);
printf("请输入链表B的元素,中间用空格隔开:");
LB=createlist(num);
LA=A_B(LA,LB);//计算集合差 
p=LA;//输出A-B的结果 
printf("\nLA-LB=");
while(p!=NULL)
{
printf("%4d",p->elem);
p=p->next;
}
return 0;
printf("\n");
}

程序的运行结果:

若满意,望采纳!

看了 c语言问题,急急急!关于链表...的网友还看了以下: