69,373
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include <stdlib.h>
//#include<malloc.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LinkNode; //定义单链表
void CreateListF(LinkNode *&L,ElemType a[],int n) //建立单链表
{
LinkNode *s;
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
for(int i=0;i<n;i++)
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=a[i];
s->next=L->next;
L->next=s;
}
}
void InitList(LinkNode *&L) //初始化
{
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
}
void DestroyList(LinkNode *&L) //销毁
{
LinkNode *pre=L,*p=L->next;
while(p)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
void DispList(LinkNode *L) //输出
{
LinkNode *p=L->next;
while(p)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
int LocateElem(LinkNode *L, ElemType e) //按元素查找
{
int i = 1;
LinkNode *p = L->next;
while(p && p->data != e)
{
p = p->next;
i++;
}
if(!p)
return(0);
else
return(i);
}
bool ListInsert(LinkNode *&L,int i, ElemType e) //插入数据元素
{
int j=0;
LinkNode *p = L, *s;
if(i <= 0)
return false;
while(j < i - 1 && p) {
j++; /* 改成j++*/
p = p->next;
}
if(!p)
return false;
else
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
}
void sort(LinkNode *&L) //排序
{
LinkNode *p,*pre,*q;
p=L->next->next;
L->next->next=NULL;
while(p!=NULL)
{
q=p->next;
pre=L;
while(pre->next!=NULL && pre->next->data<p->data)
pre=pre->next;
p->next=pre->next;
pre->next=p;
p = q;
}
}
void Bing(LinkNode *a,LinkNode *b,LinkNode *&c) //并
{
InitList(c);
LinkNode *p=a->next;
LinkNode *q=b->next;
int i=0;
while(p && q)
{
if(p->data < q->data)
{
ListInsert(c,i+1,p->data);
p=p->next;
i++;
}
else if(p->data==q->data)
{
ListInsert(c,i+1,p->data);
p=p->next;
q=q->next;
i++;
}
else
{
ListInsert(c,i+1,q->data);
q=q->next;
i++;
}
}
while (q) {
ListInsert(c, i+1, q->data);
q=q->next;
i++;
}
while (p) {
ListInsert(c, i+1, q->data);
p = p->next;
i++;
}
}
void Jiao(LinkNode *a,LinkNode *b,LinkNode *&c) //交
{
DestroyList(c);
InitList(c);
LinkNode *p=a->next;
int i=0;
while(p)
{
if(LocateElem(b,p->data))
ListInsert(c,++i,p->data);
p = p->next;
}
}
void Cha(LinkNode *a,LinkNode *b,LinkNode *&c) //差 c前少个&
{
DestroyList(c);
InitList(c);
LinkNode *p = a->next;
int i = 0;
while(p)
{
if(LocateElem(b, p->data) == 0) {
ListInsert(c, ++i, p->data);
//printf("%d\n", p->data);
}
p = p->next;
}
}
int main(void)
{
LinkNode *ha,*hb,*hc;
ElemType a[4] = {2,4,1,3};
ElemType b[4] = {3,1,5,6};
CreateListF(ha,a,4);
CreateListF(hb,b,4);
printf("原ha表: ");
DispList(ha);
printf("原hb表: ");
DispList(hb);
sort(ha);
sort(hb);
printf("排序后ha表: ");
DispList(ha);
printf("排序后hb表: ");
DispList(hb);
printf("并: ");
Bing(ha,hb,hc);
DispList(hc);
printf("交: ");
Jiao(ha,hb,hc);
DispList(hc);
printf("差: ");
Cha(ha,hb,hc);
DispList(hc);
}
两个地方改一下就好了;
第一处:插入一个节点的地方,将i++改成j++;
第二处:求差集时,需要将形参c前加上&.
以上两处都有注释;
另外,对你的代码做了部分风格修改,建议对比你的代码看一下