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;
}

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

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

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
顺序是一种常见的线性存储结构,可以用于实现顺序插入删除和查找等操作。以下是用C语言实现顺序的示例代码: ```c #include <stdio.h> #define MAX_SIZE 100 typedef struct { int data[MAX_SIZE]; int length; } SeqList; //初始化顺序 void initList(SeqList *list) { list->length = 0; } //插入元素 void insert(SeqList *list, int element, int position) { if (list->length >= MAX_SIZE) { printf("顺序已满,无法插入新元素\n"); return; } if (position < 1 || position > list->length + 1) { printf("插入位置错误\n"); return; } for (int i = list->length; i >= position; i--) { list->data[i] = list->data[i-1]; //后移元素 } list->data[position-1] = element; list->length++; } //删除元素 void removeElement(SeqList *list, int position) { if (position < 1 || position > list->length) { printf("删除位置错误\n"); return; } for (int i = position; i < list->length; i++) { list->data[i-1] = list->data[i]; //前移元素 } list->length--; } //查找元素 int search(SeqList *list, int element) { for (int i = 0; i < list->length; i++) { if (list->data[i] == element) { return i+1; //返回元素位置 } } return -1; //未找到返回-1 } int main() { SeqList list; initList(&list); insert(&list, 1, 1); insert(&list, 2, 2); insert(&list, 3, 3); removeElement(&list, 2); int position = search(&list, 3); printf("元素3在位置%d\n", position); return 0; } ``` 以上代码实现顺序的初始化、插入删除和查找等基本操作。可以根据需要修改代码中的MAX_SIZE来改变顺序的最大长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Qian_Qian_IT

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

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

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

打赏作者

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

抵扣说明:

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

余额充值