顺序表求交集
两个线性表La和Lb均采用顺序存储结构,数据元素均为正整数,两个线性表中各有若干个整数,编写程序求出两个线性表的交集。
结构体定义:
typedef struct
{
ElemType *elem; //存储空间基址,体现动态性
int length; //当前表的长度
int listsize; //当前分配的存储容量
}SqList;
主程序框架:
int main()
{
SqList La,Lb,Lc;
InitList_Sq(La); //初始化3个线性表
InitList_Sq(Lb);
InitList_Sq(Lc);
Listinput(La); //输入La的值
Listinput(Lb);//输入Lb的值
steMUl(Lc,La,Lb);//求出La和Lb的交集,放在Lc中
print_List(Lc);//打印交集
return 0;
}
代码及说明
这道题是让我敲了很长时间的一道题,所以我就写在博客里记录一下自己做题遇到的问题。
首先是创建函数:
int InitList_Sq(SqList &La)
{
La.listsize = 100;
La.length = 0;
La.elem =(ElemType*)malloc(100*sizeof(ElemType));
return 1;
}
这道题一开始,我就被题目给出的主函数误导了。平时写顺序表的时候已经习惯自己定义一个指针类型的结构体变量名,但是主函数直接传进去一个结构体,导致我一开始写的时候每个函数都没有加上&,如下:
int InitList_Sq(SqList La)
这样就导致了一个很严重的问题,就是我对于这个结构体传进去的空间的处理局限在这个函数内,出了函数我对结构体里elem分配的空间和做的处理就不复存在了,就被系统释放了。
接着是输入数组:
void Listinput(SqList &La)
{
// printf("put\r\n");
int i=0;
int a;
scanf("%d",&a);
while(a!=0)
{
La.elem[i]=a;
La.length++;
i++;
scanf("%d",&a);
}
}
求交集:
void steMUl(SqList &Lc,SqList &La,SqList &Lb)
{
// printf("stemul\r\n");
int i,j,k,flag;
flag=0;
Lc.length = 0;
for(i = 0; i < La.length ; i++)
for(j = 0; j < Lb.length ; j++)
{
if(La.elem[i]==Lb.elem[j])
{
for(k=0;k<Lc.length;k++)
{
if(Lc.elem[k]==Lb.elem[j])
{
flag=1;
break;
}
flag=0;
}
if(flag==0)
{
Lc.elem[Lc.length ]=Lb.elem[j];
Lc.length ++;
}
}
}
}
这一段主要是如何去解决这个求交集的算法问题。一开始我的想法是让La中的元素每一个都和Lb中的每一个元素比较,遇到一样的我就存下来,并且把当前位置标记为0,但是有一种情况无法解决:La:2 3 1 3 2 0;Lb:1 2 1 3 2 3 0。如果是重复的元素位置有前有后,就无法将重复相同的元素标记起来。后来,经过同学的讲解,我还是决定在Lc上下功夫。
我又加了一个for循环,还有一个flag=0标记,这个for用来循环整个Lc,如果发现Lc中已经有元素和我们找到的相同的元素相等,就让flag=1,而只有flag=0时我们才往Lc中添加元素。
然后是输出:
void print_List(SqList &Lc)
{
// printf("print\r\n");
int i;
if(Lc.length ==0)
{
printf("empty class");
}
for(i=0;i<Lc.length ;i++)
{
printf("%d ",Lc.elem[i]);
}
}
输出这里我也犯了错误,就是我一开始在empty class语句下一行写了exit(-1),本意是Lc为空时结束整个程序,但是其实没必要。因为在length=0的时候根本无法进入循环。虽然在dev没有报错,但是pta却反复过不去。
总结:&的作用
我敲代码有个很严重的问题,那就是不够注重细节。
可能我看到这个问题我会很快的想出来一个思路,然后理清楚大概的逻辑,写出来一段代码,但是在后期测试的时候却会发现代码存在很多漏洞和大大小小的问题,这也是我基础知识和细节处理不够好的问题。
这段代码我主要是更深刻的理解了&的作用。
&符号用来取地址,其实是很简单的一句话但是我的理解不够深刻。比如在参数传递中,我用了&和不用&是截然不同的效果。用了&,就让我的所有处理在同一个地址同一片空间进行,而没有用的话就让我的处理局限于某个函数中,一但出了函数就会被释放。
通俗的讲,计算机的内存就像小区一样存在一个个单元,也就是一个个字节,每个字节都有唯一的编号,我们通过&符就能知道我们需要变量对应的编号。
我现在犯的这些错误都是低级的小错误,班上厉害的同学就能给我指出来。
只能说敲代码,敲好代码我还有很长的路要走。