顺序线性表的实现

在C++的编译环境下运行(部分代码使用到 & 引用符, & 可以修改数据)

// 准备
//----------
#include <iostream>
#include <stdio.h>
#include <malloc.h>
using namespace std;
//----------
//status类型(int)返回值为函数结果代码,便与描述
#define Status int
#define error -1
#define overlow -1
#define ok 1
//----------
// Linklist 顺序线性表的一些基本属性
#define list_init_size  2    //存储空间初始分配量
#define list_createment  1   //存储空间分配增量
#define Elemtype int  // 数据类型定位 int 型
typedef struct {
      Elemtype * elem; //存储空间基址,即首地址,后面存储数据
      int length;   //   当前长度
      int listsize; // 分配的存储容量
  }Sqlist;
//----------基本操作


// 顺序表的创建
Status lis_create (Sqlist &L){
      L.elem=(Elemtype *) malloc(list_init_size*sizeof (Elemtype));
      if (!L.elem) return error;
      L.length=0;  //空表长度为0
      L.listsize=list_init_size; //初始存储容量
      return ok;
}
// 顺序表的遍历
Status lis_loading (Sqlist L){ //不用&符,不修改数据
      int i;
      printf("your list:");
      for (i=0;i<L.length;i++)
      printf("%d  ",L.elem[i]);
      printf("\n");
      return ok;
}
// 顺序表的插入 (表,插在第i的位置前插入e;
Status lis_insert(Sqlist &L, int i, Elemtype e) {
      Elemtype *newbase,*q,*p;
      if (i<1||i>L.length+1) return error;//i值不合法
      if (L.length>=L.listsize){
      newbase=(Elemtype *) realloc (L.elem,(L.listsize+list_createment)*sizeof(Elemtype));//存储空间不足时增分配
      if (!newbase ) return (overlow);
      L.elem=newbase;
      L.listsize+=list_createment;// 存储容量增加
      } //插入
      q=&(L.elem[i-1]); //q为插入位置
      for(p=L.elem+L.length-1;p>=q;--p)//插入位置及之后的元素右移
      *(p+1)=*p;
      *q=e;  //插入e
      ++L.length; //表长增加
      return ok;
}
//表的删除 (表,删除的位置,删除元素返回到e
Status lis_delete (Sqlist &L,int i,Elemtype e){
      Elemtype *q,*p;
      if ((i<1)||(i>L.length)) return error;//i值不合法
      p=&(L.elem[i-1]); //被删除元素的位置
      e=*p; //被删除元素返回给e
      q=L.elem+L.length-1; //表尾
      for(p=&(L.elem[i-1]);p<=q;++p) //被删除元素之后左移
       *p=*(p+1);
      --L.length; //表长减一
      return ok;
}
//具体实现
int main()
{
        Sqlist T;
        int n,i;
        Elemtype x;
        printf("__________________________________________\n");
        //表的创建 输出创建的结果
        if (!lis_create(T))  printf("create a list defeat \n");
        printf("create a list succseefully \n");
        printf("(1):insert a elment ,input situation and element \n(2):delete a elment,input  situation\n(3):load the whole list\n(0):exit\n");
        printf("__________________________________________\n");
        while (1)
        {
        scanf("%d",&n);
        switch (n)
        {
        //插入
        case 1:scanf("%d%d",&i,&x);
        if (!lis_insert(T,i,x)) printf("insert error\n");
        else printf("the element %d is successfully insert \n",x);
        break;
        //删除
        case 2: scanf("%d",&i);
        if (!lis_delete(T,i,x)) printf("Delete error\n");
        else printf("the elemeng %d is successfully delete \n",x);
        break;
        //遍历
        case 3:lis_loading(T);
        break;
        case 0: return 1; //return1,return给主函数 主函数结束
        }
        }           
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值