线性表
初始化:
int InitList(Zzj_list *L) //创建一个空的线性表
{
L->num =(elemtype*)malloc(MAXNUM * sizeof(elemtype)); //给线性表分配一个最大内存
if (!L->num){
return -1; //判断是否失败
}
L->length = 0; //线性表长度初始化
}
判断线性表是否为空:
bool ListEmpty(Zzj_list L) //判断线性表是否为空
{
if (L.length==0){
return true;
}else{
return false;
}
}
//-----
插入:
Status ListInsert(Zzj_list *L,int i ,elemtype *e) //插入线性表---e 储存插入的值
{
if (L->length == MAXNUM){
return ERROR;
}
if (i<1 || i<=L->length){ //L->length+1表示你插入后的长度
return ERROR;
}
if (i<=L->length){
//线性表是从 1 开始的---数组则是从 0 开始的---所以 i 的最大值为 线性表长度 但 i==长度 时线性表不用往前移
for (int j=L->length-1;j>=i-1;j--){
L->num[j+1]=L->num[j]; //将前一个元素的 值 赋值给后一个元素
}
}
L->num[i-1] = *e; //将相插入的位置赋值
L->length++;
return OK;
}
查找指定元素的值:
Status CetElem(Zzj_list L,int i,elemtype *e) //查找指定的元素
{
if (i<1 || i >L.length){ //元素不能超过下标
return ERROR;
}
if (i>0 && i<=L.length){
*e=L.num[i-1];
}
return OK;
}
删除指定元素:
Status ListDelete(Zzj_list *L,int i,elemtype *e) //删除指定的元素
{
if (i<1 || i>L->length){
return ERROR;
}
*e=L->num[i-1];
if (i <L->length){
//当删除的元素不是最后一个----要往前移---i 的最大值为线性表的长度
for (int j=i;j<=L->length-1;j++){
//因为线性表元素是下标从 1 开始---数组则是从 0 开始---
//----当删除线性表第 5 个元素时---反观数组则是删除下标为 4 的---
//--------当 j==i 时相当于是数组中要删除元素的后一个下标
L->num[j-1]=L->num[j];
//将后面的值赋值给前一个下标即可
}
}
L->length--; //删除一个元素长度减一
return OK;
}
输出长度:
int ListLength(Zzj_list L) //输出长度
{
return L.length;
}
打印线性表:
void printfList(Zzj_list l)
{
for (int i = 0;i<l.length;i++){
printf("%d\n",l.num[i]); //打印线性表
}
}
销毁线性表:
void ClearList(Zzj_list *L) //清空线性表
{
for (int i= 0;i<MAXNUM;i++){
L->num[i]=0;
}
L->length=0;
}
全部代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXNUM 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
//--------------------------------------------------------
typedef int elemtype ;
typedef struct
{
elemtype *num; //动态数组
int length; //线性表长度
}Zzj_list;
//-------------------------------------------------------
typedef int Status;
int InitList(Zzj_list *L) //创建一个空的线性表
{
L->num =(elemtype*)malloc(MAXNUM * sizeof(elemtype)); //给线性表分配一个最大内存
if (!L->num){
return -1; //判断是否失败
}
L->length = 0; //线性表长度初始化
}
//-----------------------------------------
bool ListEmpty(Zzj_list L) //判断线性表是否为空
{
if (L.length==0){
return true;
}else{
return false;
}
}
//--------------------------------------
void ClearList(Zzj_list *L) //清空线性表
{
for (int i= 0;i<MAXNUM;i++){
L->num[i]=0;
}
L->length=0;
}
//------------------------------------------
Status ListInsert(Zzj_list *L,int i ,elemtype *e) //插入线性表---e 储存插入的值
{
if (L->length == MAXNUM){
return ERROR;
}
if (i<1 || i<=L->length){ //L->length+1表示你插入后的长度
return ERROR;
}
if (i<=L->length){
//线性表是从 1 开始的---数组则是从 0 开始的---所以 i 的最大值为 线性表长度 但 i==长度 时线性表不用往前移
for (int j=L->length-1;j>=i-1;j--){
L->num[j+1]=L->num[j]; //将前一个元素的 值 赋值给后一个元素
}
}
L->num[i-1] = *e; //将相插入的位置赋值
L->length++;
return OK;
}
//------------------------------------------
Status CetElem(Zzj_list L,int i,elemtype *e) //查找指定的元素
{
if (i<1 || i >L.length){ //元素不能超过下标
return ERROR;
}
if (i>0 && i<=L.length){
*e=L.num[i-1];
}
return OK;
}
//------------------------------------------
int ListLength(Zzj_list L) //输出长度
{
return L.length;
}
//-------------------------------------------
Status ListDelete(Zzj_list *L,int i,elemtype *e) //删除指定的元素
{
if (i<1 || i>L->length){
return ERROR;
}
*e=L->num[i-1];
if (i <L->length){
//当删除的元素不是最后一个----要往前移---i 的最大值为线性表的长度
for (int j=i;j<=L->length-1;j++){
//因为线性表元素是下标从 1 开始---数组则是从 0 开始---
//----当删除线性表第 5 个元素时---反观数组则是删除下标为 4 的---
//--------当 j==i 时相当于是数组中要删除元素的后一个下标
L->num[j-1]=L->num[j];
//将后面的值赋值给前一个下标即可
}
}
L->length--; //删除一个元素长度减一
return OK;
}
//-------------------------------------------
void printfList(Zzj_list l)
{
for (int i = 0;i<l.length;i++){
printf("%d\n",l.num[i]); //打印线性表
}
}
//-------------------------------------
int main()
{
void menu(); //以menu为指引去引导其他函数
menu();
}
//------------------------------------------
void menu()
{
void ClearList(Zzj_list *L); //清空线性表
bool ListEmpty(Zzj_list L); //判断是否为空表
int InitList(Zzj_list* L); //创建线性表
Status ListInsert(Zzj_list *L,int i,elemtype *e); //插入元素
Status CetElem(Zzj_list L,int i,elemtype *e); //查找指定元素的值
int ListLength(Zzj_list L); //计算线性表长度
Status ListDelete(Zzj_list *L,int i,elemtype *e); //删除指定元素
void printfList(Zzj_list l); //打印线性表
Zzj_list l;
InitList(&l); //创建空线性表
//-------------------------------------------------------------
//插入元素
for (int i=1;i<=MAXNUM;i++){
ListInsert(&l,i,&i);
}
printf("插入元素后线性表的元素\n");
printfList(l); //打印线性表
//-----------------------------------------------------------------
//查找指定元素的值
int num = 0;
int n = 0;
printf("请输入你想要查找的元素\n");
scanf("%d",&num);
int b = CetElem(l,num,&n);
if (b ==1){
printf("第%d号元素的值为:%d\n",num,n);
}else{
printf("你输入的数值有问题\n");
}
//---------------------------------------------------------------
//判断是否为空表
bool a;
a = ListEmpty(l);
if (a ==1){
printf("线性表为空表\n");
}else{
printf("线性表不为空\n");
}
int len = 0;
len = ListLength(l);
printf("线性表长度为:%d\n",len);
//判断线性表长度
//------------------------------------------------------------
//删除线性表中指定的元素
int delete_value = 0;
printf("输入你想要删除的元素\n");
scanf("%d",&num);
b = ListDelete(&l,num,&delete_value);
if (b ==1){
printf("删除的值为:%d\n",delete_value);
}else{
printf("你输入的数值有问题\n");
}
printf("now--线性表长度为:%d\n",l.length);
//观察长度是否减一
printf("删除一个元素后线性表的元素\n");
printfList(l); //打印删除后的线性表
//----------------------------------------------------------
ClearList(&l);
//销毁线性表
a = ListEmpty(l);
//判断是否为空表
if (a ==1){
printf("清除成功\n");
printf("now--线性表为空表\n");
}else{
printf("now--线性表不为空\n");
}
len = ListLength(l);
printf("now--线性表长度为:%d\n",len);
}
结果如下:
天下不负有心人呐。
晚上8点—11点,三个小时终于给我弄出来了。