线性表的合并

写这个代码的过程中,一旦涉及到对原表中的元素进行修改(增加、减少)的操作的时候,在传递变量的时候,一定要传递变量地址。

//线性的合并
#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的++操作,导致我输出的时候,出现了数据丢失

 只有将其传成地址,才能够完美输出:而且在插入和合并的时候,都互不影响

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值