写这个代码的过程中,一旦涉及到对原表中的元素进行修改(增加、减少)的操作的时候,在传递变量的时候,一定要传递变量地址。
//线性的合并
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
typedef int ElemType;
typedef struct
{
ElemType* elem;
int length;//记录数组元素长度
int real_len;//记录数组元素长度
}SqList;
//initial
int SqL_INIT(SqList* L)
{
L->elem = (int*)malloc(sizeof(int) * SIZE);
if (!L->elem)
{
printf("fail to create this memory>");
return 0;
}
L->real_len = SIZE;
L->length = 0;
return 1;
}
int SqL_len(SqList L)
{
return L.length;
}
int IsEmpty(SqList L)
{
if (L.length == 0)
{
printf("this is empty>");
return 0;
}
return 1;
}
//某个位置的元素
int SqL_search(SqList L,int loc)
{
if (loc<1 || loc>L.length)
{
printf("position is illegal>");
return 0;
}
return L.elem[loc - 1];
}
//遍历元素是否在数组中
int SqL_find(SqList L, int goal)
{
int i = 0;
for (i; i < L.real_len; i++)
{
if (L.elem[i] == goal)
{
return i;//查找成功,返回会下标
}
}
return -1;//为了和下表0区分开。使用-1
}
//插入元素
int SqL_insert(SqList L, int e, int loc)
{
int i = 0;
if (loc<1 || loc>L.length+1)
{
printf("position is illegal");
return 0;
exit(EXIT_FAILURE);
}
/*int* pf = (int*)realloc(L.elem, sizeof(int) * (SIZE + 1));
if (!pf)
{
printf("fail to");
return -1;
exit(EXIT_FAILURE);
}
L.elem = pf;*/
for (i = L.length - 1; i > loc - 1; i--)
{
L.elem[i + 1] = L.elem[i];
}
L.elem[loc - 1] = e;
L.length++;
L.real_len++;
return 1;
}
//创建元素
void SqL_input(SqList *L)
{
int i = 0;
int j = 0;
printf("输入你要插入的元素个数>");
scanf("%d", &i);
L->real_len=L->length = i;
for (j; j < L->length; j++)
{
printf("输入第%d个元素的值", j+1);
scanf("%d",&L->elem[j]);
printf("\n");
}
}
//打印元素
void PRINT(SqList L)
{
int i = 0;
if (L.real_len == 0)
{
printf("this list is empty");
exit(EXIT_FAILURE);
}
for (i = 0; i < L.real_len; i++)
{
printf("%d\n", L.elem[i]);
}
}
//合并线性表
void MergeSqL(SqList *M, SqList *N)
{
int i = 0;
int ret = 0;
int j = 0;
for (i = 1; i <= N->length; i++)
{
ret =SqL_search(*N, i);
if ((j = SqL_find(*M, ret)) == -1)
{
SqL_insert(*M, ret, ++M->length);
++M->real_len;//记录添加依次后的长度,不能放在循环体外面
}
}
}
int main()
{
SqList a, b, c;
SqL_INIT(&a);
SqL_INIT(&b);
SqL_input(&a);
SqL_input(&b);
MergeSqL(&a, &b);
PRINT(a);
return 0;
}
后面我发现这个程序的健壮性不够,在单独对列表元素进行添加的时候,由于在插入函数中使用的是传递形式参数在调用函数结束之后,局部变量就会被销毁
尽管修改成功了第一个元素,因为我的PRINT是基于L->real-len的,但是该插入函数并没有实现对于L->real-len的++操作,导致我输出的时候,出现了数据丢失
只有将其传成地址,才能够完美输出:而且在插入和合并的时候,都互不影响