C语言建立顺序表,实现插入、删除、减、并、去重等操作

C语言建立顺序表,实现插入、删除、减、并、去重等操作

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define INIT_SIZE 20
#define INC 5
typedef int ElemType;
typedef struct
{
    ElemType *data;//存储数据
    int len;//当前存储数据长度
    int size;//最大存储数据长度,容量
}List;
//建立
int createList(List *L)
{
    L->data = (ElemType *) malloc(INIT_SIZE * sizeof(ElemType));
    if(!L->data) return 0;
    L->len = 0;//初始长度为0
    L->size = INIT_SIZE;//初始容量为INIT_SIZE(20)
    return 1;
}
//按位置插入
int insertListPos(List *L, int pos, ElemType e)
{
    if(pos < 1 || pos > L->len+1) return 0;//插入位置错误
    if(L->len >= L->size)
    {
        L->data = (ElemType *) realloc(L->data, (L->size + INC) * sizeof(ElemType));//申请空间
        if(!L->data) return 0;
        L->size += INC;//改变容量
    }
    int i;
    for(i = L->len-1; i >= pos-1; i --)
    {
        L->data[i+1] = L->data[i];//依次后移
    }
    L->data[pos-1] = e;//将e插入空位
    L->len ++;//长度增加1
    return 1;
}
//按顺序插入,保持有序
int insertListSort(List *L, ElemType e)
{
    if(L->len >= L->size)
    {
        L->data = (ElemType *) realloc(L->data, (L->size + INC) * sizeof(ElemType));//申请空间
        if(!L->data) return 0;
        L->size += INC;//改变容量
    }
    int i;
    for(i = L->len-1; i >= 0; i --)
    {
        if(e < L->data[i])
        {
            L->data[i+1] = L->data[i];//依次后移
        }
        else break;
    }
    L->data[i+1] = e;//将e插入空位
    L->len ++;//长度增加1
    return 1;
}
//按位置删除
int deleteList(List *L, int pos)
{
    if(pos < 1 || pos > L->len+1) return 0;
    int i;
    for(i = pos-1; i <= L->len-1; i ++)
    {
        L->data[i] = L->data[i+1];//依次前移
    }
    L->len --;//长度减1
    return 1;
}
//打印
int printList(List *L)
{
    if(L->len == 0) return 0;//长度为0,顺序表中没有元素,不需要打印
    int i;
    for(i = 0; i < L->len; i ++)
    {
        printf("%d ", L->data[i]);
    }
    return 1;
}
int sub(List *A, List *B)
{
    int i, j;
    for(i = 0; i < A->len; i ++)
    {
        for(j = 0; j < B->len; j ++)
        {
            if(A->data[i] == B->data[j])
            {
                deleteList(A, i+1);//删除A中与B相同的元素
                sub(A, B);//递归调用
            }
        }
    }
    return 1;
}
int unionSet(List *A, List *B)
{
    int i, j, flag;
    for(i = 0; i < B->len; i ++)
    {
        flag = 0;//标志位置0
        for(j = 0; j < A->len; j ++)
        {
            if(A->data[j] == B->data[i])
            {
                flag = 1;//标志位置1
                break;
            }
        }
        if(!flag)  insertListSort(A, B->data[i]);//将B中不同元素添加到A中
    }
    return 1;
}
int single(List *A)
{
    int i, j;
    for(i = 0;i < A->len; i ++)
    {
        for(j = i+1; j < A->len; j ++)
        {
            if(A->data[i] == A->data[j])
            {
                deleteList(A, i+1);//删除重复元素
                single(A);//递归调用
            }
        }
    }
    return 1;
}
int init(List *list1,  List *list2)
{
    list1->len = 0;//摧毁顺序表
    list2->len = 0;
    int i;
    for(i = 0;i < 10;i ++)
    {
        insertListSort(list1, i*3);
        insertListSort(list2, i*6);
    }
    return 1;
}
int main()
{
    List list1, list2;//定义两个顺序表
    ElemType e;
    createList(&list1);
    createList(&list2);
    init(&list1, &list2);
    printf("\nlist1 : ");
    printList(&list1);
    printf("\nlist2 : ");
    printList(&list2);
    printf("\n演示1 : \n将元素插入list1,并保持有序:");
    printf("请输入插入元素:");
    scanf("%d", &e);
    insertListSort(&list1, e);
    printList(&list1);
    init(&list1, &list2);
    printf("\n演示2 :\n list1 - list2(将list1中和list2相同的元素去掉):");
    sub(&list1, &list2);
    printList(&list1);
    init(&list1, &list2);
    printf("\n演示3 :\n list1∪list2:");
    unionSet(&list1, &list2);
    printList(&list1);
    init(&list1, &list2);
    printf("\n演示4 :\n 去除list1中重复的元素:");
    single(&list1);
    printList(&list1);
    return 0;
}

运行效果实例:
在这里插入图片描述

感谢您花时间耐心看完,希望对您有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qian_Qian_IT

感谢您的赏识,我将持续创作~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值