数据结构-顺序表代码实现

#include <stdio.h>
#include <stdlib.h>
struct Arr {
 int * pBase;//存储的是线性表第一个元素的地址
 int len;//线性表所能容纳的最大元素的个数,
 int cnt;//cnt的值就是新放入元素的下标,cnt++表示当前线性表有效元素个数
};

void show_menu();
bool init_arr(struct Arr *pArry, int length);
bool insert_arr(struct Arr *pArr, int pos, int val);
bool is_empty(struct Arr * pArr);
bool is_empty(struct Arr * pArr);
void show_arr(struct Arr *pArr);
bool delete_arr(struct Arr * pArr , int pos );
int getElem(struct Arr * pArr,int pos);
int getPro(struct Arr * pArr,int pos);
int getAfter(struct Arr * pArr,int pos);
bool destory_arr (struct Arr *pArr);

int i;
int main() {
 struct Arr arr;//只定义没有初始化,内部三个变量都是垃圾数字
 int len ;
 int pos ;
 int val ;
 int ds= 0;
 int init = 0;
 show_menu();
 
 do {
  printf("请输入操作代码:\n");
  scanf("%d", &i);
  switch (i) {
  case 1:
   printf("请输入您要初始化的数组长度:\n");
   scanf("%d",&len);
   if(len<1) printf("您输入数值不合法!\n");
   else {
   if(init_arr(&arr, len))
   init = 1;
   }
   break;
  case 2:
   if(init ==1 ){
   if(destory_arr (&arr))
   printf("线性表已经摧毁!\n");
   ds=1;
   init=0;
   }else printf("您还未初始化线性表!\n");
   
   break;
  case 3:
   if(init ==1 ){
   arr.cnt=0;
   printf("线性表已经清空!\n");
   }else printf("您还未初始化线性表!\n");
   
   break;
  case 4:
   if(init ==1 ){
   if(is_empty(&arr))
    printf("线性表为空!\n");
   else
    printf("线性表不为空!\n");
   }else printf("您还未初始化线性表!\n");
   break;
  case 5:
   if(init ==1 ){
   printf("线性表的长度是:%d\n",arr.cnt);
   }else printf("您还未初始化线性表!\n");
   break;
  case 6:
   if(init ==1 ){
   printf("请输入你要输出的元素位置:\n");
   scanf("%d",&pos);
   }else printf("您还未初始化线性表!\n");
   printf("你想获得的元素是:%d\n",getElem(& arr , pos));
   break;
  case 7:
   if(init ==1 ){
   printf("请输入一个位置我帮你求它的前驱:\n");
   scanf("%d",&pos);
   if(pos<=1 || pos >arr.cnt)//求前驱不能等于首位置
    printf("输入数据不合法!\n");
   else
    printf("它的前驱是:%d\n",getPro(&arr, pos));
   } else printf("您还未初始化线性表!\n");
   break;
  case 8:
   if(init ==1 ){
   printf("请输入一个位置我帮你求它的后继:\n");
   scanf("%d",&pos);
   if(pos<1 || pos >= arr.cnt)//求后继不能等于尾位置
    printf("输入数据不合法!\n");
   else
    printf("它的后继是:%d\n",getAfter(&arr, pos));
   }else printf("您还未初始化线性表!\n");
   
   break;
  case 9:
   if(init ==1 ){
   printf("请输入你要插入的位置和数值:\n");
   scanf("%d %d", &pos, &val);
   insert_arr(& arr, pos, val);
   printf("插入之后的线性表是:\n");
   show_arr(& arr);
   } else printf("您还未初始化线性表!\n");
   break;
  case 10:
   if(init ==1 ){
   printf("请输入你要删除的位置:\n");
   scanf("%d",&pos);
   delete_arr(&arr,pos);
   printf("删除之后的线性表是:\n");
   show_arr(& arr);
   } else printf("您还未初始化线性表!\n");
   break;
  case 11:
   if(init ==1 ){
   if(ds = 0 ) {
   printf("线性表不存在!\n");
   ds=0;
   }
   else {
   printf("该线性表是:\n");
   show_arr(& arr);
   }
   }else printf("您还未初始化线性表!\n");
   

   break;
  default :
   printf("您输入的数字不合法!\n");
   break;
  }
 
 }while(i>=0);
 
 return 0;
}
void show_menu() {
 printf("1----初始化一个线性表\n");
  printf("2----销毁线性表\n");
  printf("3----清空线性表\n");
  printf("4----判断线性表是否为空\n");
  printf("5----求线性表的长度\n");
  printf("6----获取线性表指定位置元素\n");
  printf("7----求前驱\n");
  printf("8----求后继\n");
  printf("9----在线性表指定位置插入元素\n");
  printf("10----删除线性表指定位置元素\n");
  printf("11----显示线性表\n");
  printf("退出,输入一个负数!\n");
  
  return ;
}

bool init_arr(struct Arr *pArry, int length)//结构体变量可以相互赋值
{
 int n;
 int val;
 pArry->pBase = (int *)malloc(sizeof(int) * length);
 if (NULL == pArry->pBase) {
  printf("动态内存分配失败!\n");
  exit(-1);//终止整个程序
 }
 pArry->len = length;
 pArry->cnt = 0;
 printf("请输入你要存储数据的数量:\n");
  scanf("%d",&n);
  if(n >length) {
   printf("你输入的值不合法!\n");
   return false ;}
 printf("请输入你要存储的值:\n"); 
 for(int i = 0;i < n;i++) {
  scanf("%d",&val);
  pArry->pBase[i] = val;
  pArry->cnt++;
 } 
 printf("链表已经初始化!\n");
 return true;//表示函数终止
}


bool is_full(struct Arr * pArr) {
 /*if(有效元素个数和线性表的长度相等)
 return true;
 else
 return false;*/
 if (pArr->cnt == pArr->len)
  return true;
 else
  return false;
}


bool is_empty(struct Arr * pArr) {
 if (0 == pArr->cnt)
  return true;
 else
  return false;

}

void show_arr(struct Arr *pArr) {

 if (is_empty(pArr)){
  printf("线性表为空!\n");
 }
 else {
  for (int i = 0; i < pArr->cnt; i++) {
   printf("%-5d", pArr->pBase[i]);//整个线性表的地址在pBase里面存放的
  }
 }
 printf("\n");
}


bool insert_arr(struct Arr *pArr, int pos, int val)  {//pos 的值从1开始
 int i;
 pArr ->pBase = (int *)realloc(pArr->pBase,sizeof(int)*100);
 pArr->len +=100;
 if(NULL == pArr->pBase)
  printf("插入失败!\n");
 if (is_full(pArr))
  return false;
 if (pos<1)//因为pos是从1开始的,例如有三个元素,你可以在第4个位置插,但不能在第5个位置插,因为没有第四个元素
 {
  printf("您输入的数值不合法!\n");
  return false;
 }
 for (i = pArr->cnt - 1; i >= pos - 1; --i) {
  pArr->pBase[i + 1] = pArr->pBase[i]; //i赋值给i+1,先移动元素再进行插入,其实就相当于在元素的后面又赋值一个元素,然后把该元素覆盖掉;往后移动就是把小下标赋值给大下标;当前元素个数(pArr->cnt)减1就是最后一个元素的下标;因为当i的值为pos-1时,还需要移动,所以要写 ">=";
 }
 pArr->pBase[pos - 1] = val;
 pArr->cnt++;
 return true;
}


bool delete_arr(struct Arr * pArr , int pos ) {
 int i;
 if(is_empty(pArr))
  return false;
 if(pos<1 || pos>pArr->cnt)//删除的时候有三个元素删除三个,所以pos不能大于pArr->cnt,而插入是有三个元素可以在第四个前面插入
  return false;
 //* pVal = pArr ->pBase[pos-1];//将等待删除的元素赋值给pVal,先保存起来
 for(i=pos;i<pArr->cnt;++i) {
 pArr->pBase[i-1]=pArr->pBase[i];//后面的要往前面移动,所以大的下标赋值给小的下标
 }
 pArr->cnt--;//其实最后一个元素还存在,只不过是,长度减1了,就没办法再访问了
 return true;
}

int getElem(struct Arr * pArr,int pos) {
 if (pos<1 || pos > pArr->cnt)
  printf("输入信息不合法!\n");
 int val= pArr->pBase[pos-1];
 return val;
}
int getPro(struct Arr * pArr,int pos) {
// if (pos<1 || pos > pArr->cnt+1)
//  printf("输入信息不合法!\n");
 int val = pArr->pBase[pos-2];
 return val;
}
int getAfter(struct Arr * pArr,int pos) {
 //if (pos<1 || pos > pArr->cnt)
 // printf("输入信息不合法!\n");
 int val = pArr->pBase[pos];
 return val;
}

bool destory_arr (struct Arr * pArr) {
 free(pArr->pBase);
 pArr->pBase=NULL;
 return true;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用c++实现顺序表:多文件编程,层次清晰,函数有注释 SeqList();//构造函数,存储的元素个数设为0 bool setLength(size_t length);//设置已经存储的元素个数 bool addElement(ElemType element);//把某个元素添加到顺序表末尾 bool addElement(ElemType element , size_t n);//插入一个元素,使其成为第n个元素,其余元素后移 bool delElement();//删除所有的元素 bool delElement(size_t n);//删除第n个元素 bool delElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,把这个元素删除 bool replaceElement(ElemType element , size_t n);//使用一个元素,替换掉第n个元素 bool swapElement(size_t n1 , size_t n2);//把第n1个元素和第n2个元素交换 ElemType* getElement();//得到数组头的指针 ElemType* getElement(size_t n);//得到第n个元素的指针 size_t getLength();//得到存储的元素个数 size_t getMaxSize();//得到顺序表容量 bool showElementDetail();//输出所有的元素细节 bool showElementDetail(size_t n);//输出第n个元素的细节 bool showElementDetail(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,输出元素所有细节 size_t findElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素位置 static int inputAInt(int min = 0,int max = 9,int defaultValue = -1);//从键盘读取,限制为一个min到max间的整数,非法情况返回defaultValue void startControlLoop();//打开控制界面 ~SeqList();//析构函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

coderkou97

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

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

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

打赏作者

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

抵扣说明:

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

余额充值