简单顺序表的插入,删除,指定位置,指定元素的插入删除操作

头文件 SeqList.h

#ifndef __SEQLIST_H__

#define __SEQLIST_H__
#include<stdio.h>
#include<string.h>
#include<assert.h>

#define MAX_SIZE 10
typedef int DataType;
typedef unsigned int size_t;

typedef struct SeqList
{
    DataType array[MAX_SIZE];
    size_t size;
}SeqList, *PSeqList;




// 初始化顺序表
void InitSeqList(PSeqList seqList);

// 顺序表尾插
// 设计函数原型
// 参数检测
// 边界条件考虑
// 逻辑操作

// 尾插
void PushBack(PSeqList pSeqList, DataType data);
// 尾删
void PopBack(PSeqList pSeqList);

// 打印顺序表
void PrintSeqList(PSeqList pSeqList);

// 头插
void PushFront(PSeqList pSeqList, DataType data);

// 头删
void PopFront(PSeqList pSeqList);

// 任意位置插入
void Insert(PSeqList pSeqList, size_t pos, DataType data);

// 在顺序表中查找元素data
int Find(PSeqList pSeqList, DataType data);

// 删除顺序表中pos位置上的元素
void Erase(PSeqList pSeqList, size_t pos);

//移除顺序表中的元素data
void Remove(PSeqList pSeqList, DataType data);

// 移除顺序表中所有元素data
void RemoveAll(PSeqList pSeqList, DataType data);



#endif

实现函数 SeqList.c

#include "SeqList.h"


void InitSeqList(PSeqList seqList)// 初始化顺序表
{
    memset(seqList->array, 0, MAX_SIZE*sizeof(DataType));
    seqList->size = 0;
}

// 打印顺序表
void PrintSeqList(PSeqList pSeqList)
{
    size_t i = 0;
    if (pSeqList->size == 0)
    {
        printf("线性表为空,打印结束\n");
        return;
    }
    for (i = 0; i < pSeqList->size; i++)
    {
        printf("%d  ", pSeqList->array[i]);
    }
    printf("\n");
}

void PushBack(PSeqList pSeqList, DataType data)//从尾部插入
{
    assert(pSeqList);//判断指针是否为空
    if ((pSeqList->size) >= MAX_SIZE)
    {
        printf("线性表已满,无法继续插入\n");
        return;
    }
    pSeqList->array[pSeqList->size] = data;
    pSeqList->size++;

}

void PopBack(PSeqList pSeqList)//从尾部删除
{
    assert(pSeqList);
    if (pSeqList->size == 0)
    {
        printf("线性表为空\n");
        return;
    }
    pSeqList->size--;
    printf("删除成功\n");
}

void PushFront(PSeqList pSeqList, DataType data)//从首部插入
{
    size_t i = pSeqList->size;
    assert(pSeqList);//判断指针是否为空
    if ((pSeqList->size) >= MAX_SIZE)
    {
        printf("线性表已满,无法继续插入\n");
        return;
    }
    while (i)
    {
        pSeqList->array[ i ] = pSeqList->array[i-1];
        i--;
    }
    pSeqList->array[0] = data;
    printf("插入完成\n");
    pSeqList->size++;
}

void PopFront(PSeqList pSeqList)//删除最前面一个
{
    size_t i = 0;
    assert(pSeqList);//判断指针是否为空
    if (pSeqList->size == 0)
    {
        printf("线性表为空\n");
        return;
    }
    for (i = 0; i < pSeqList->size-1; i++)
    {
        pSeqList->array[i] = pSeqList->array[i + 1];
    }
    pSeqList->size--;
    printf("删除完成\n");
}


int Find(PSeqList pSeqList, DataType data)//在顺序表内查找某元素
{
    size_t i = 0;
    assert(pSeqList);//判断指针是否为空
    if (pSeqList->size == 0)
    {
        printf("线性表为空\n");
        return -1;
    }
    for (i = 0; i < pSeqList->size - 1; i++)
    {
        if (pSeqList->array[i] == data) 
        {
            return i;
        }
    }
    return -1;
}

void Insert(PSeqList pSeqList, size_t pos, DataType data)//在任意位置插入元素
{
    size_t i = pSeqList->size;
    assert(pSeqList);//判断指针是否为空
    if ((pSeqList->size) >= MAX_SIZE)
    {
        printf("线性表已满,无法继续插入\n");
        return;
    }
    if (pos > pSeqList->size)
    {
        printf("插入位置不被允许\n");
        return;
    }
    for (i = pSeqList->size; i >pos; i--)
    {
        pSeqList->array[i] = pSeqList->array[i - 1];

    }
    pSeqList->array[pos] = data;
    pSeqList->size++;
    printf("添加完成\n");
}

// 删除顺序表中pos位置上的元素
void Erase(PSeqList pSeqList, size_t pos)
{
    size_t i = pos;
    assert(pSeqList);//判断指针是否为空
    if (pSeqList->size == 0)
    {
        printf("线性表为空\n");
        return;
    }
    if (pos > pSeqList->size)
    {
        printf("删除位置有误\n");
        return;
    }

    for (i = pos; i < pSeqList->size-1; i++)
    {
        pSeqList->array[i] = pSeqList->array[i + 1];
    }
    pSeqList->size--;
    printf("删除完成\n");
}

void RemoveAll(PSeqList pSeqList, DataType data)
{
    size_t i = 0;
    assert(pSeqList);//判断指针是否为空
    if (pSeqList->size == 0)
    {
        printf("线性表为空\n");
        return;
    }
    for (i = 0; i < pSeqList->size; i++)
    {
        if (pSeqList->array[i] == data)
        {
            size_t j = i;
            while (j< pSeqList->size-1)
            {
                pSeqList->array[j] = pSeqList->array[j + 1];
                j++;
            }
            pSeqList->size--;
            printf("已删除一个元素\n");
            i--;
        }
    }
    printf("删除完成\n");
}




void Remove(PSeqList pSeqList, DataType data)
{
    int i = 0;
    assert(pSeqList);//判断指针是否为空
    i = Find(pSeqList, data);
    if (i >= 0)
    {
        while (i <(int)pSeqList->size - 1)
        {
            pSeqList->array[i] = pSeqList->array[i + 1];
            i++;
        }
        pSeqList->size--;
        printf("删除完成\n");
        return;
    }
    else
    {
        printf("没有找到该元素");
        return;
    }
}

测试程序 test.c (可分三次测试)

#include "SeqList.h"


static void test1(PSeqList seqList)
{

    InitSeqList(seqList);
    PushBack(seqList, 1);
    PushBack(seqList, 2);
    PushBack(seqList, 3);
    PushBack(seqList, 4);
    PrintSeqList(seqList);
    PopBack(seqList);
    PrintSeqList(seqList);
}

static void test2(PSeqList seqList)
//测试PushFront ,PrintSeqList,PopFront等函数
{
    int ret = 0;
    InitSeqList(seqList);
    PushFront(seqList, 1);
    PushFront(seqList, 2);
    PushFront(seqList, 3);
    PushFront(seqList, 4);
    PrintSeqList(seqList);
    PopFront(seqList); 
    PopFront(seqList);
    PopFront(seqList);
    PopFront(seqList); 
    PopFront(seqList);
    PrintSeqList(seqList);
}

static void test3(PSeqList seqList)//测试Insert,Erase,Remove,RemoveALL函数
{
    int ret = 0;
    InitSeqList(seqList);
    PushFront(seqList, 1);//在首部加入 1
    PushFront(seqList, 2);
    PushFront(seqList, 3);
    PushFront(seqList, 4);
    Insert(seqList, 3, 5);//在下标3的位置插入 5
    PrintSeqList(seqList);
    Erase(seqList, 3);//删除下标3位置上的元素
    PrintSeqList(seqList);
    Insert(seqList, 3, 2);
    Insert(seqList, 3, 2);
    PrintSeqList(seqList);
    Remove(seqList, 2);//删除第一个 2
    PrintSeqList(seqList);
    RemoveAll(seqList, 2);//删除所有的 2
    PrintSeqList(seqList);
}
static void test4(PSeqList seqList)//测试Find函数
{
    int ret = 0;
    InitSeqList(seqList);
    PushFront(seqList, 1);
    PushFront(seqList, 2);
    PushFront(seqList, 3);
    PushFront(seqList, 4);
    ret = Find(seqList, 2);
    printf("%d", ret);
}

int main()
{
    SeqList seqList;
    /*test1(&seqList);*/
    /*test2(&seqList);*/
    test3(&seqList);
    /*test4(&seqList);*/

    system("pause");
    return 0;
}
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是实现顺序表指定位置插入删除元素的完整C语言程序: ```c #include <stdio.h> #define MAXSIZE 100 // 定义顺序表的最大长度 typedef struct { int data[MAXSIZE]; // 存储元素组 int length; // 当前长度 } SqList; // 初始化顺序表 void InitList(SqList *L) { L->length = 0; // 初始长度为0 } // 在指定位置插入元素 int ListInsert(SqList *L, int i, int e) { int j; if (i < 1 || i > L->length + 1) { // 判断i的范围是否合法 return 0; } if (L->length >= MAXSIZE) { // 判断顺序表是否已满 return 0; } for (j = L->length; j >= i; j--) { // 将第i个位置及以后的元素后移 L->data[j] = L->data[j - 1]; } L->data[i - 1] = e; // 插入元素 L->length++; // 长度加1 return 1; } // 在指定位置删除元素 int ListDelete(SqList *L, int i, int *e) { int j; if (i < 1 || i > L->length) { // 判断i的范围是否合法 return 0; } *e = L->data[i - 1]; // 保存被删除元素 for (j = i; j < L->length; j++) { // 将第i+1个位置及以后的元素前移 L->data[j - 1] = L->data[j]; } L->length--; // 长度减1 return 1; } int main() { SqList L; int i, e; InitList(&L); // 初始化顺序表 // 在指定位置插入元素 for (i = 1; i <= 5; i++) { ListInsert(&L, i, i); } // 输出顺序表元素 printf("顺序表元素为:"); for (i = 0; i < L.length; i++) { printf("%d ", L.data[i]); } printf("\n"); // 在指定位置删除元素 ListDelete(&L, 3, &e); // 输出删除后的顺序表元素 printf("删除第三个元素后,顺序表元素为:"); for (i = 0; i < L.length; i++) { printf("%d ", L.data[i]); } printf("\n"); return 0; } ``` 在该程序,我们定义了一个结构体`SqList`来表示顺序表,其包括一个组`data`用于存储元素,以及一个变量`length`表示当前顺序表的长度。程序实现了初始化顺序表、在指定位置插入元素、在指定位置删除元素操作。我们可以通过调用相应的函实现这些操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值