顺序表基本操作,创建,插入,删除,销毁

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
/* 顺序表基础操作的学习 */
enum {FALSE,TRUE};
//定义list 
typedef struct list_t{
 int *data;
 int cap;
 int size;
}List; 
//创建链表
int list_init(List **list,int len){
 *list=malloc(sizeof(List));           //开辟一个list 
 if(*list==NULL){
  return FALSE;
 } 
 
 (*list)->data=malloc(sizeof(int)*len);  //给list里的 data开辟空间 
 if((*list)->data==NULL){
  return FALSE;
 }
 
 (*list)->cap=len;
 (*list)->size=0;
 return TRUE;
}
//链表销毁
void list_destroy(List *list) {
 assert(!list==NULL);   //条件为假就报错 
 free(list->data);
 free(list);
}
//往指定位置插入指定元素
int list_insert(List *list,int i, const int *elem){
 //判断合法性
 if(list==NULL||i<0||list->size<i){   //不允许隔空插入 
  return FALSE;
 } 
 int k;
 for(k=list->size;k>i;k--){
  list->data[k]=list->data[k-1];
 }
 list->data[k]=*elem;
 list->size++;
 return TRUE; 
} 
//得出list的大小
int list_size(List *list){
 return list->size;
} 
//得出它容量 
int list_capa(List *list){
 return list->cap;
}  
//显示list的data
void list_display(List *list){
 assert(!list==NULL);
 int i;
 for(i=0;i<list->size;i++){
  printf("%d ",list->data[i]);
 }
 printf("\n"); 
} 
//删除元素
int list_del(List *list,int i,int *ret){
 if(list==NULL||i<0||i>=list->size){
  return FALSE;
 }
 int k;
 *ret=list->data[i];
 for(k=i;k<=list->size-2;k++){
  list->data[k]=list->data[k+1];
 }
 list->size--;
 return TRUE;
} 
int main(int argc, char *argv[]) {
 List *list =NULL;    //要让这个指针指向那个 表
 int n;
 printf("创建的顺序表的元素个数为:"); 
 scanf("%d",&n);
 list_init(&list,n);   //所以这里要传那个指针的地址 
 
int flag=1; 
 while(1){
   if(!flag) break;
   
      if(list_size(list)>=list_capa(list)){
     printf("当前list的size已经不小于capaticy,无法再进行插入操作\n");
     break;
   }
   int elem, i;
   printf("当前list的capaticy为:%d\n",list_capa(list));
   printf("当前list的size为:%d\n",list_size(list));
   printf("请输入您插入的位置以及要插入的数据(以空格隔开):");
   scanf("%d %d",&i,&elem);
   list_insert(list,i,&elem);
   printf("当前list数据为:");list_display(list);
   
   printf("继续插入输入1,结束输入0  ") ; 
   scanf("%d",&flag);
 }
 
 int flag1=1;
    while(1){
     if(!flag1) break;
     
     if(list_size(list)==0){
     printf("当前list已无元素,无法再进行删除操作\n");
     break;
   }
     printf("当前list数据为:");list_display(list);
     printf("您要删掉第几个元素?(从第0个开始)"); 
     int n2,ret; 
  scanf("%d",&n2);
  if(list_del(list,n2,&ret)){
   printf("第%d个元素已从顺序表中删除,它为%d\n",n2,ret);
  }
  
  printf("继续删除输入1,结束输入0  ") ; 
  scanf("%d",&flag1);
 }
 //销毁
  list_destroy(list);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值