C语言实现线性表的插入和删除操作

这其实是上机实验的题目,在网上找了找资料发现都是C++的,参考着《数据结构(C语言版)》(清华大学出版社)里面的伪代码实现的。

实现后加上了备注,代码条理还算清晰就拿出来分享一下。

题目要求:

设计程序建立一个顺序表,要求从键盘输入整数,并完成添加插入和删除元素功能,并将该顺序表的元素从屏幕显示出来。

使用malloc和realloc函数动态分配内存地址。

完整代码:

#include <stdio.h>
#include <stdlib.h>

#define LIST_INIT_SIZE 5 //线性表初始长度
#define LISTINCREMENT 5  //线性表每次扩充长度

#define OK 1
#define ERROR 0

//线性表结构体
typedef struct SqList
{
    int *elem;
    int len;
    int size;
};

//初始化线性表
int InitList_Sq(struct SqList *L)
{
    //使用malloc函数,申请一段连续的存储空间
    L->elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
    if (!L->elem)
        exit(0);
    L->len = 0;
    L->size = LIST_INIT_SIZE;
    return OK;
}

//向线性表中插入数据
int ListInsert_Sq(struct SqList *L, int i, int e)
{
    if (i < 1 || i > L->len + 1)
        return ERROR;
    if (L->len >= L->size)
    {
        //使用realloc函数,在原本的基地址上申请更大的存储空间
        int *newbase = (int *)realloc(L->elem, (LIST_INIT_SIZE + LISTINCREMENT) * sizeof(int));
        //如果申请空间失败则结束程序
        if (!newbase)
            exit(0);
        L->size += LISTINCREMENT;
    }
    int *q = &(L->elem[i - 1]);
    int *p;
    for (p = &L->elem[L->len - 1]; p >= q; --p)
        *(p + 1) = *p;
    *q = e;
    ++L->len;
    return OK;
}

//删除线性表中的数据
int ListDelete_Sq(struct SqList *L, int i, int *e)
{
    if (i < 1 || i > L->len)
        return ERROR;
    int *p = &(L->elem[i - 1]);
    *e = *p;
    int q = L->elem + L->len - 1;
    for (++p; *p <= q; ++p)
        *(p - 1) = *p;
    L->len--;
    return OK;
}

//输出线性表中的数据
int ListShow_Sq(struct SqList *L, char *s)
{
    printf("%s", s);
    int i;
    for (i = 0; i < L->len; i++)
    {
        printf("%d ", L->elem[i]);
    }
    putchar('\n');
}

void main()
{
    int i;
    struct SqList L;

    //初始化线性表
    InitList_Sq(&L);

    //输入数据
    int n;
    printf("预先输入的原始数据个数是:");
    scanf("%d", &n);
    printf("请线性表中%d个原始数据:", n);
    for (i = 0; i < n; i++)
    {
        int t;
        scanf("%d", &t);
        ListInsert_Sq(&L, L.len + 1, t);
    }
    ListShow_Sq(&L, "原始数据:");

    //定义插入/删除操作时位置和数值参数
    int s, v;

    //插入操作
    printf("请输入数据插入的位置s 和数值v :");
    scanf("%d%d", &s, &v);
    printf("%s", ListInsert_Sq(&L, s, v) ? "插入成功.\n" : "插入失败.\n");
    ListShow_Sq(&L, "插入后:");

    //删除操作
    printf("请输入数据删除的位置s :");
    scanf("%d", &s);
    if (ListDelete_Sq(&L, s, &v))
        printf("删除成功.删除的数据是:%d\n", v);
    else
        printf("删除失败.位置有误.");
    ListShow_Sq(&L, "删除后:");

    system("pause");
}

 

截图:

 

————————————————————————————————————————————————

2020年9月17日 更新 关于无法运行

很多同学留言这份代码无法运行,也有同学在私信内联系我,对于无法正常执行的情况我表示非常抱歉,当时在写这篇小文的时候还在读大学,以为自己运行成功的代码就不会有错误(有错也是别人的错←_←),但其实C/C++的编译器还是五花八门的,这是当时读大学的我不了解的(当时大学机房的电脑上安装的是VC6.0,后来有同学给我评论无法运行后,我曾尝试在Visual Studio C++上运行此代码,也没有成功,很多的函数都提示不安全需要更换,而我只是想运行一份用于学习的代码...)。

今天重新更新这篇文章指在帮助无法运行此代码的同学统一环境,希望能帮助大家完成这部分课程。

 

方法1:在命令行中使用gcc编译

安装GCC(MinGW)

网上教程很多,举个栗子:https://blog.csdn.net/wxh0000mm/article/details/100666329

在cmd中执行命令:

gcc .\C语言实现线性表的插入和删除操作.c

编译时会提示两个无伤大雅的警告,

执行后会在目录中生成a.exe

运行后按照流程操作

完美运行

 

方法2:安装简易GCC编译器

推荐一个小巧的 啊哈C,但不推荐下载最新的,最新的版本似乎使用Python重写的界面,编译的核心还是MinGW,但安装包一百多兆。老版本只有在第三方平台才能下载到,只有15MB。(友情提示,小心捆绑)

安装完成,拷贝代码直接运行

输入测试数据,完美运行

 

最后

非常荣幸我的文章能够帮到这么多同学,也希望这次的更新可以解决编译不成功的遗憾。

另外,关于数据结构中基础知识的应用在我的文章 C语言模拟最高优先数优先进程调度算法 有很好的体现,如果有兴趣可以运行一下,也许会有所帮助。链接→https://blog.csdn.net/lgj123xj/article/details/70836200

  • 65
    点赞
  • 348
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猿长大人

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值