顺序表的12种基本操作

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define FALSE -1
#define TURE 1
#define ERROR -1
#define OVERFLOW       -1
#define INFEASIBLE        -1
#define LIST_INIT_SIZE    100  
#define LISTINCREMENT     10  
typedef int Status;
typedef int ElemType;

typedef struct {
ElemType *elem;
int length;
int listsize;
}Sqlist;

//1、初始化
Status InitList(Sqlist&L)
{
 L.elem=((ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)));
 if(!L.elem)
  return ERROR;
 L.length=0;
 L.listsize= LIST_INIT_SIZE;
 return OK;
}
 
 //2、销毁
void  Destorylist(Sqlist&L)
{
 if(L.elem)
  free(L.elem);
 L.elem=NULL;
} 

 //3、清空
void ClearList(Sqlist &L)
{
 L.length=0;
}

 //4、判空
Status EmptyList(Sqlist L)
{
 if(L.length==0)
  return TURE;
 else
  return FALSE;
}

 //5、求表长
Status LengthList(Sqlist L)
{
 return L.length;
}

 //6、取元素
Status GetElem(Sqlist L, int i, ElemType &e)
{
 if(i<1||i>L.length)
  return ERROR;
 else
  return e=L.elem[i-1];
}

// 7、定位操作
Status LocateELem(Sqlist L, ElemType e)
{
 int i=0;
 for (i = 0; i < (L.length - 1); i++)
  {
   if(e==L.elem[i])
   return i+1;
  }
}

 //8、求前驱
Status PriorElem(Sqlist L, ElemType pur_e, ElemType pre_e)
{
  int  i;
  ElemType *p,*q;
  p=&L.elem[0];
  for (i = 1; i < L.length - 1; i++)
   {
    if(pur_e==L.elem[i])
     {
      p=&L.elem[i]; 
      break;
    }
  }
  q=p-1;
  pre_e=*q;
  return pre_e;
}

//9、求后继
Status NextElem(Sqlist L, ElemType pur_e, ElemType next_e)
{
 int i;
 ElemType *p,*q;
 p=&L.elem[0];
 for (i = 0; i < L.length - 2; i++)
 {
   if (pur_e == L.elem[i])
   {
    p=&L.elem[i];
   break;
  }
 }
 q=p+1;
 next_e=*q;
 return next_e;
}

 //10、插入
Status InsertElem(Sqlist L, int i, ElemType e)
{
    ElemType *p,*q;
   if(i<1||i>L.length)
    return ERROR;
   if (L.length == L.listsize)
   {
     L.elem=((ElemType*)realloc(L.elem,(LIST_INIT_SIZE+ LISTINCREMENT)*sizeof(ElemType)));
     L.listsize= LIST_INIT_SIZE + LISTINCREMENT;
   }
   q=&L.elem[i-1];
   for (p = &L.elem[L.length - 1]; p > q; p--)
     *(p+1)=*p;
     *(q+1)=e;
   L.length++;
   return e;
}

 //11、删除
Status DeleteElem(Sqlist &L, int i, ElemType e) 
{
   ElemType *p,*q;
   if(!L.elem)
    return ERROR;
   if(i<1||i>L.length)
    return ERROR;
   q=&L.elem[i-1];
   e=*q;
   for (p = &L.elem[i - 1]; p <&L.elem[L.length - 1]; ++p)
     {
  *  p=*(p+1);
     }
    L.length--;
return e;
}

 //12、遍历
void TraverList(Sqlist L) 
{
  int i;
  for (i = 0; i < L.length; i++)
printf("%5d",L.elem[i]);
}

//14、比较
Status CompareList(Sqlist L, ElemType e1, ElemType e2)
{
 if(e1>e2||e2==e2)
 return TURE;
 else
 return FALSE;
}


int main()
{   
    Sqlist L;
    InitList(L);
    int a,b,c,d=0,f,g,i;
    ElemType e=0;
//初始化测试
   printf("初始顺序表的长度%d\n\n", LengthList(L));
    printf("请输入要添加的元素个数:");
   scanf("%d",&L.length);
//求表长测试
    printf("\n当前顺序表的长度%d\n",LengthList(L));
    printf("\n请输入线性表元素:");
    for (i = 0; i <L.length; i++)
   scanf("%d",&L.elem[i]);
//遍历测试
   printf("\n您输入的元素为:");
  TraverList(L);
  printf("\n");
//定位操作
  printf("请输入你要定位的元素:");
  scanf("%d",&g);
  printf("%d的位置为:%d\n",g,LocateELem(L,g));
//求前驱测试
    printf("请输入你想求前驱的元素:");
   scanf("%d",&a);printf("\n"); 
   printf("%d的前驱为:%d",a, PriorElem(L,a,d));
//求后继测试
printf("\n请输入你想求后继的元素: ");
scanf("%d",&f);printf("\n");
printf("%d的后继为:%d",f,NextElem(L,f,d));
//取元素测试
printf("\n接下来测试取元素\n\n请输入你想取出的元素位序:");
scanf("%d",&i);
printf("\n\n");
printf("你取出的元素为:%d",GetElem(L,i,e));
    printf("\n\n");
//删除测试
printf("现在测试删除\n\n请输入删除位置: ");
scanf("%d",&b);
printf("\n");
printf("你删除的元素为: %d",DeleteElem(L,b,e));
printf("\n\n");
printf("现在线性表中的元素为:");
for(i=0;i<L.length;i++)
printf("%5d",L.elem[i]);
//插入测试
printf("\n现在测试插入\n");
printf("请输入你要插入的位置:");
scanf("%d",&c);
printf("\n");
printf("请输入你要插入的元素:");
scanf("%d",&e);
printf("\n");
printf("你插入的元素为:%d",InsertElem(L,c-1,e));
printf("\n");
printf("现在顺序表为: ");
for (i = 0; i < L.length + 1; i++)
printf("%5d",L.elem[i]);
    return 0;
}

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值