线性表(初学)

线性表

初始化:

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点,三个小时终于给我弄出来了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值