6-1 集合合并-(链表)
先分别输入两个链表La,Lb的结点数据(0 结束链表输入),再依次将Lb中出现的且未在La中出现的元素插入到La的后面,然后输入一个删除结点的位置,从La中将该结点删除(如果位置不存在,则输出“Position Error”)
示例:
报错图片:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
//Status 为函数的类型,其值是函数结果状态代码,如OK等
typedef int Status;
// ElemType为数据元素类型,根据实际情况而定,这里假设为int
typedef int ElemType;
struct LNode /* 结点定义 */
{
ElemType data;
struct LNode *next;
};
typedef struct LNode* LinkList; /* LinkList是一指针类型,后面可用来定义结点对应的指针变量 */
/*相关函数定义*/
Status ListLength(LinkList L);
void Union(LinkList *La,LinkList Lb); //将Lb合并到La中,保证La元素唯一
Status GetElem(LinkList L,int i,ElemType *e); //获取结点i的值
Status ListEmpty(LinkList L); //判断链表是否为空
Status LocateElem(LinkList L,ElemType e,Status compare(ElemType a,ElemType b)); /*判断L中是否有元素
与e满足compare关系。若这样的数据元素不存在,则返回值为ERROR,compare是一个函数指针变量形参 */
Status equal(ElemType a,ElemType b); //
Status ListInsert(LinkList *L,Status i,Status e); //
Status ListDelete(LinkList *L,Status i,ElemType *e); //如果删除位置不存在,输出"Position Error\n"
void input(LinkList *L); //按输入数据顺序形成链表 ,数据为0则结束输入,0不作为链表结点数据
void output(LinkList *L);
int main(void)
{
LinkList La = NULL,Lb = NULL;
Status i;
ElemType e;
input(&La);
input(&Lb);
scanf("%d",&i);
Union(&La,Lb);
output(&La);
if(ListDelete(&La,i,&e)==ERROR)
printf("Position Error\n");
else
printf("Delete Point Value: %d\n",e);
output(&La);
return 0;
}
void output(LinkList *L)
{
LinkList cur = *L;
if(cur==NULL)
{
printf("No Chain!");
}
else
while(cur)
{
printf("%d ",cur->data);
cur = cur->next;
}
printf("\n");
}
void Union(LinkList *La,LinkList Lb)
{ // 将所有在表Lb(代表B集合)中但不在La(代表A集合)中的数据元素依次插入到La尾部
ElemType e;
Status i;
Status La_len,Lb_len;
La_len=ListLength(*La); // 求表La的长度
Lb_len=ListLength(Lb);
if ( !ListEmpty(Lb) ) //表Lb不为空才进行合并操作
for(i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e); // 取表Lb中第i个数据元素赋给变量e
if(!LocateElem(*La,e,equal)) // 表La中不存在和e相同的元素,则将e插入La中
ListInsert(La,++La_len,e);
}
}
/* 请在这里填写答案 */
void input(LinkList *L)
{
LinkList p,q;
int t;
scanf("%d",&t);
while(t!=0)
{
p=(struct LNode *)malloc(sizeof(struct LNode));
p->data=t;
p->next=NULL;
if(L==NULL)
{
*L=p;
q=p;
}
else
{
q->next=p;
q=p;
}
scanf("%d",&t);
}
}
Status ListLength(LinkList L)
{
int i=0;
LinkList cur;
cur=L;
while(cur!=NULL)
{
i++;
cur=cur->next;
}
return i;
}
Status GetElem(LinkList L,int i,ElemType *e)
{
int t=1;
LinkList cur=L;
for(t=2;t<=i;t++)
{
cur=cur->next;
}
*e=cur->data;
return *e;
}
Status ListEmpty(LinkList L)
{
if(L==NULL)
return 0;
else
return 1;
}
Status LocateElem(LinkList L,ElemType e,Status compare(ElemType a,ElemType b))
{
LinkList p,q;
p=L;
while(p!=NULL)
{
if(compare(p->data,e)==1)
return 1;
p=p->next;
}
return 0;
}
Status equal(ElemType a,ElemType b)
{
if(a==b)
return 1;
else
return 0;
}
Status ListInsert(LinkList *L,Status i,Status e)
{
LinkList p,q;
p=(struct LNode *)malloc(sizeof(struct LNode));
p->data=e;
p->next=NULL;
q=*L;
while(q!=NULL)
{
q=q->next;
}
q=p;
}
Status ListDelete(LinkList *L,Status i,ElemType *e)
{
int t=2;
LinkList p,q;
p=*L;
for(t=2;t<=i-1&&p!=NULL;t++)
{
p=p->next;
}
if(t==i)
{
q=p->next;
p->next=q->next;
free(q);
return OK;
}
else
return ERROR;
}