#include<stdio.h>
#define maxsize 100
typedef int ElemType;
typedef struct
{
ElemType elem[maxsize];
int last;
}SeqList;
void InitList(SeqList *L,int n)
{
int i;
for(i=0;i<n;i++)
scanf("%d",&L->elem[i]);
L->last=n;
}
ElemType GetData(SeqList L,int i)
{
for(i=0;i<L.last;i++)
return L.elem[i-1];
}
int Length(SeqList L)
{
return L.last;
}
void Display(SeqList L)
{
for(int i=0;i<L.last;i++)
{
printf("%d ",L.elem[i]);
}
printf("\n");
}
int Locate(SeqList L,ElemType e)
{
int i;
while((i<=L.last)&&(L.elem[i]!=e))
i++;
if(i<=L.last)
return (i+1);
else
return(-1);
}
void InsertList(SeqList *l,int pos,ElemType e)
{
int i;
for(i=l->last;i>=pos;i--)
l->elem[i]=l->elem[i+1];
l->elem[pos]=e;
l->last++;
}
void Union(SeqList *La,SeqList Lb)
{
int i;
ElemType e;
int lenA=Length(*La);
int lenB=Length(Lb);
for(i=1;i<=lenB;i++)
{
e=GetData(Lb,i);
if(0==Locate(*La,e))
{
InsertList(La,lenA,e);
lenA++;
}
}
}
void main()
{
SeqList LA,LB;
InitList(&LA,3);
Display(LA);
InitList(&LB,4);
Display(LB);
Union(&LA,LB);
Display(LA);
}
代码中的错误挺多的,需要修改的地方在代码中都注释了,直接从代码中看吧。
修改后运行效果:
代码修改如下:
#include<stdio.h>
#define maxsize 100
typedef int ElemType;
typedef struct
{
ElemType elem[maxsize];
int last;
}SeqList;
void InitList(SeqList* L, int n)
{
int i;
for (i = 0; i < n; i++)
scanf("%d", &L->elem[i]);
L->last = n;
}
ElemType GetData(SeqList L, int i)
{
//for (i = 0; i < L.last; i++)
if (i <= L.last)//这里是if语句
return L.elem[i - 1];
else
return -1;
}
int Length(SeqList L)
{
return L.last;
}
void Display(SeqList L)
{
for (int i = 0; i < L.last; i++)
{
printf("%d ", L.elem[i]);
}
printf("\n");
}
int Locate(SeqList L, ElemType e)
{
int i=0;
while (( i < L.last) && (L.elem[i] != e))
i++;
if (i < L.last) //这是<不是<=
return (i + 1);
else
return(-1);
}
void InsertList(SeqList* l, int pos, ElemType e)
{
int i;
if (pos == l->last)
{
l->elem[pos] = e;
l->last++;
}
else
{
for (i = l->last; i >= pos; i--)
l->elem[i] = l->elem[i - 1]; //这里是i-1不是i+1
l->elem[pos - 1] = e; //这里是pos-1,不是pos
l->last++;
}
}
void Union(SeqList* La, SeqList Lb)
{
int i;
ElemType e;
int lenA = Length(*La);
int lenB = Length(Lb);
for (i = 1; i <= lenB; i++)
{
e = GetData(Lb, i);
if (-1 == Locate(*La, e)) //这里是-1,不是0
{
InsertList(La, lenA, e);
lenA++;
}
}
}
int main()
{
SeqList LA, LB;
InitList(&LA, 3);
Display(LA);
InitList(&LB, 4);
Display(LB);
Union(&LA, LB);
Display(LA);
return 0;
}
列表插入,插入位置数据都得后移,怎么会是l->elem[i]=l->elem[i+1];呢?
for(i=l->last;i>pos;i--)
l->elem[i]=l->elem[i-1];
l->elem[pos]=e;
l->last++;
==========
另外Locate函数也有问题啊
int Locate(SeqList L,ElemType e)
{
int i;
while((i<=L.last)&&(L.elem[i]!=e))
i++;
if(i<=L.last)
return (i+1);
else
return(-1);
}
i都没有初始化,就用来判断i<=last? 并且如果没找到元素,你返回的是-1,不是0,为什么在Union函数中是if(0==Locate(*La,e))呢?