线性表_顺序存储

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define  LIST_INIT_SIZE  100
#define  LISTRECREMENT 10
// 创建线性表的结构
// 头指针记录基地址
// 线性表的长度代表着最后一个成员的位置
struct  LinearTable{
    int*  head;
    int   length;
    int   listsize;
};


// 初始化线性表
// 长度为0,以后每增加一个元素,长度自增,“0”号地址不存放数据
int  InitList(LinearTable  &L){
     L.head=(int*)malloc ((LIST_INIT_SIZE)*sizeof(int));
     if(!L.head)
        return -1;
     L.length=0;
     L.listsize=LIST_INIT_SIZE;
         return  0;
}


// 摧毁线性表,线性表元素依然存在,但是内部结构已经被释放
// free掉头指针指向的后面的内存单元
int  DestroyList(LinearTable  &L){
     L.length=0;
     free(L.head);
     return 0;
}


// 清空线性表,线性表的结构依然存在,但是长度为0
void  ClearList(LinearTable  &L){
     if(L.length<=0)
        return;
    // 之前储存的元素依然储存在内存单元里,但是后面的操作会覆盖
     L.length=0;
}


// 判断线性表是否为空
bool  ListEmpty(LinearTable  &L){
      if(L.length==0)
        return true;
      return false;
}


// 求线性表的长度,元素的个数
int  ListLength(LinearTable  &L){
      if(L.length<0)
        return -1;
      return (L.length);
}


//  由位置信息定位元素,返回该元素
void  GetElem(LinearTable  &L,int location,int &e){
    // 判断是否为空 ,或者位置是否大于线性表的长度
    // 若没有元素打印显示error!
      if(ListEmpty(L) || location > L.length){
        printf("ERROR !\n");
        return ;
      }
      // 返回定位所求的元素
      e=*(L.head+location);
      return ;
}


//  相等比较函数
bool  Compare_Equ(int a,int b){
      return a==b;
}


//  大于比较函数
bool  Compare_Gt(int a,int b){
      return a>b;
}


//  小于比较函数
bool  Compare_Lt(int a,int b){
      return a<b;
}


//  根据比较函数定义定位功能
//  返回第一个满足该功能的元素的位置下标
int  LocateElem(LinearTable  &L,int e, bool (*fun)(int ,int )){  //在使用指向函数的指针的时候后面的参数也要标明


      for(int i=1;i<=L.length;i++){
            //  调用比较函数判断满足条件的元素
          if((*fun)(*(L.head+i),e))
            return i;
      }
      // 未找到满足条件的元素返回-1
      return -1;
}


// 由现在的元素定位其前面一个元素
// 没有该元素或者该元素没有前驱返回-1
int PriorElem(LinearTable  &L,int cur_e,int &prior_e){
    for(int i=2;i<=L.length;i++){
        if(cur_e==*(L.head+i))
        {
            prior_e=*(L.head+i-1);
            return 0;
        }
    }
    return -1;
}


// 由现在的元素定位其后面一个元素
// 没有该元素或者该元素没有后驱返回-1
int NextElem(LinearTable  &L,int cur_e,int &next_e){
      for(int i=1;i<L.length;i++){
        if(cur_e==*(L.head+i))
        {
            next_e=*(L.head+i+1);
            return 0;
        }
    }
    return -1;
}


// 增加一个元素 (首先判断线性表是否还有位置可以插入)
int  AddElem(LinearTable  &L,int e){
      if(L.length >= L.listsize){
            // 若线性表已满,需要增加分配内存空间
            // reallo(当前指针,扩展后内存空间大小)
            int* tmp=(int*)realloc(L.head,(L.listsize+LISTRECREMENT)*sizeof(int));
            if(!tmp)
                return -1;
            L.head=tmp;
      }
      // 线性表长度变化
      ++(L.length);
      *(L.head+L.length)=e;
      return 0;
}


// 插入元素,更新线性表
int InsertElem(LinearTable  &L,int location,int e){
     // 判断插入位置是否合法
     if(location < 1 || location > L.length)
        return -1;
     // 若线性表已满,需要增加分配内存空间
     if(L.length==L.listsize){
        int* tmp=(int *)realloc(L.head,(L.listsize+LISTRECREMENT)*sizeof(int));
        if(!tmp)
            return -1;
        L.head=tmp;
     }
     // 从定位下标开始,将该元素向后移动一位
     ++L.length;
     for(int i=location;i<=L.length;i++)
        *(L.head+i+1)=*(L.head+i);
     *(L.head+location)=e;
     return 0;
}


// 删除元素,更新线性表
int DeleteElem(LinearTable  &L,int location){
    // 判断位置是否合法
      if(location < 1 || location > L.length)
        return -1;
      for(int i=location;i<=L.length;i++)
        *(L.head+i)=*(L.head+i+1);
      --(L.length);
      return 0;
}


// 线性表排序
int SortList(LinearTable  &L){
    int tmp=0;
    if(ListEmpty(L))
        return 0;
    for(int i=1;i<L.length;i++){
        int k=i;
        for(int j=i+1;j<=L.length;j++){
             if(*(L.head+j)<*(L.head+k))
                k=j;
       }
       // 若当前位置不是当前的最小值,将当前的最小值放在当前位置
       if(k!=i){
            tmp=*(L.head+k);
            *(L.head+k)=*(L.head+i);
            *(L.head+i)=tmp;
        }
    }
    return 0;
}


// 合并两个顺序线性表
LinearTable MergeList(LinearTable  &La,LinearTable  &Lb){
     LinearTable Lc;
     InitList(Lc);
     int i=1;
     int j=1;
     while(i<=La.length && j<=Lb.length){
         // La中元素小,放入Lc中
         if(*(La.head+i)<*(Lb.head+j)){
            AddElem(Lc,*(La.head+i));
            ++i;
         }
        // La中元素小,放入Lc中
         else if(*(La.head+i)>*(Lb.head+j)){
            AddElem(Lc,*(Lb.head+j));
            ++j;
         }
         // 相等,任意线性表向后移动知道出现较小元素
         else
            ++i;
     }
     while(i<=La.length){
         AddElem(Lc,*(La.head+i));
         ++i;
     }
      while(j<=Lb.length){
         AddElem(Lc,*(Lb.head+j));
         ++j;
     }
     return Lc;
}


// 遍历线性表
int ListTraverse(LinearTable  &L){
     // 判断线性表是否为空
     if(ListEmpty(L))
        return -1;
     for(int i=1;i<L.length;i++)
        printf(" %d ->",*(L.head+i));
     printf(" %d\n",*(L.head+L.length));
        return 0;
}
int main(){
    int pri_e,nex_e;
    LinearTable La;
    InitList(La);
    AddElem(La,3);
    AddElem(La,1);
    ListTraverse(La);
    InsertElem(La,2,5);
    SortList(La);
    ListTraverse(La);
    if(PriorElem(La,5,pri_e) !=-1)
          printf(" 该元素的前驱是 %d\n",pri_e);
    else
          printf("  ERROR ! \n");
    if(NextElem(La,5,nex_e) != -1)
          printf(" 该元素的后驱是 %d\n",pri_e);
    else
          printf(" ERROR ! \n");
    LinearTable Lb;
    InitList(Lb);
    AddElem(Lb,2);
    AddElem(Lb,4);
    AddElem(Lb,5);
    AddElem(Lb,6);
    AddElem(Lb,8);
    int loca=LocateElem(Lb,4,Compare_Equ);
    if( loca!=-1)
        printf(" 相等元素为第 %d 个元素\n",loca);
    else
        printf(" ERROR ! \n");
    loca=LocateElem(Lb,4,Compare_Gt);
    if( loca!=-1)
        printf(" 首个大于当前元素的为第 %d 个元素\n",loca);
    else
        printf(" ERROR ! \n");
    ListTraverse(La);
    ListTraverse(Lb);
    LinearTable Lc=MergeList(La,Lb);
    ListTraverse(Lc);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值