这其实是上机实验的题目,在网上找了找资料发现都是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