数据结构--线性表的顺序表示及操作

线性表中数据元素的逻辑关系是:元素在计算机中物理位置相邻(逻辑上相邻的元素在物理位置上也是相邻的)

线性表的顺序存储结构是一种随机存取的储存结构,但是在进行删除和插入的是需要移动大量的元素。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define LIST_INIT_SIZE 100
#define LISTINSERCE 10
using  namespace  std;
typedef int Elemtype ;
struct SqList
{
    int *element;
    int len;
    int listsize;
};
///位置合法性判断
///长度的改变
int  InitList(SqList &L);
void Sscanf(SqList &L);
int  ListInsert(SqList &L,int pos,Elemtype e);
bool ListDelete(SqList &L,int pos);
int LocateElem(SqList L,Elemtype e);
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc);
void Print(SqList La);
int main()
{
    SqList La;
    InitList(La);
    Sscanf(La);
    Print(La);
    ListInsert(La,4,99999);
    Print(La);
    cout<<"*******"<<endl;
    ListDelete(La,5);
    Print(La);
    ///访问出界会报错
    // ListDelete(La,10);
    //  Print(La);
    int pos1= LocateElem(La,99999);
    int pos2= LocateElem(La,8888888);
    if(pos1!=-1) cout<<"Find it ! "<<pos1<<endl;
    else cout<<"Not Find !"<<endl;
    if(pos2!=-1) cout<<"Find it ! "<<pos2<<endl;
    else cout<<"Not Find !"<<endl;

    SqList Lb;
    InitList(Lb);
    Sscanf(Lb);

    SqList Lc;
    MergeList_Sq(La,Lb,Lc);
    Print(Lc);
    return 0;
}
/// 在构造一个线性表的时候首先进行内存分配,如果内存分配失败则返回false;
///内存分配完毕以后,对线性表的一些属性值进行初始化,返回true;
int  InitList(SqList &L)
{
    L.element=(Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype));
    if(!L.element) return 0;//false;
    L.len=0;
    L.listsize=LIST_INIT_SIZE;
    return 1;//true;
}
/// 对线性表里面element进行输入
void Sscanf(SqList &L)
{
    scanf("%d",&L.len);
    int *p=L.element;
    for(int i=0; i<L.len; i++)
    {
        int x;
        scanf("%d",&x);
        *p=x;
        p++;
    }
}
/// 在线性表中插入一个数
///在插入一个数之前要先判断位置的合法性,如果不合法则返回false;
/// 判断当前的长度是不是大于当前线性表的最大长度,如果大于线性表的最大长度,则对线性表进行长度的重新分配
///移动插入位置之前的元素
///在所要插入位置进行赋值
///当前线性表长度++;
int  ListInsert(SqList &L,int pos,Elemtype e)
{
    int temp=pos-1;
    if(!L.element) return false;
    if(temp<0||temp>L.len) return false;
    int *newbase;
    if(L.len>=L.listsize)
    {
        ///注意重新分配时的表示方法
        // newbase=(Elemtype *)realloc(L.element,(L.listsize+LISTINSERCE)*sizeof(Elemtype));
        // if(!newbase) return false;
        //  L.element=newbase;
        L.element=(Elemtype *)realloc(L.element,(L.listsize+LISTINSERCE)*sizeof(Elemtype));
        if(!L.element) return false;
        L.listsize+=LISTINSERCE;
    }
    ///两种方式
    /* for(int i=L.len-1; i>=pos-1; i--)
         L.element[i+1]=L.element[i];
     L.element[pos-1]=e;*/
    Elemtype *p=&(L.element[pos-1]);
    for(Elemtype *q=&(L.element[L.len-1]); q>=p; q--) *(q+1)=*(q);
    *p=e;

    ++L.len;
    return true;
}
///删除一个位置
///首先进行位置合法性判断,如果位置不合法,则返回false;
///将所删除位置之后的元素向前移一位
///线性表长度--;
bool ListDelete(SqList &L,int pos)
{
    int temp=pos-1;
    if(temp<0||temp>=L.len) return false;
    if(!L.element) return false;
    Elemtype *p=&(L.element[pos-1]);
    //  e=*p;
    Elemtype *q=&(L.element[L.len-1]);
    for(p; p<q; p++)
    {
        *p=*(p+1);
    }
    L.len--;
    return true;
}
int LocateElem(SqList L,Elemtype e)
{
    int pos=0;
    int *p=L.element;
    int *p_last=L.element+L.len;
    for(p; p<p_last; p++)
    {
        if(*p==e)
        {
            return pos;
        }
        pos++;
    }
    return -1;
}
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc)
{
    Lc.len=La.len+Lb.len;
    Lc.listsize=LIST_INIT_SIZE;
    while(Lc.listsize<=Lc.len)
    {
        Lc.listsize+=LISTINSERCE;
    }
    int *c=Lc.element=(Elemtype *)malloc(Lc.listsize*sizeof(int));
    ///
    if(!Lc.element) return ;
    ///
    int *a=La.element;
    int *b=Lb.element;
    int *a_last=La.element+La.len-1;
    int *b_last=Lb.element+Lb.len-1;

    while(a<=a_last&&b_last)
    {
        if(*a<*b)
        {
            *c=*a++;
            c++;
        }
        else *c++=*b++;
    }
    while(a<=a_last) *c++=*a++;
    while(b<=b_last) *c++=*b++;
    return ;
}
void Print(SqList La)
{
    int *p=La.element;
    int *p_last=La.element+La.len-1;
    while(p<=p_last)
    {
        cout<<*p++<<" ";
    }
    cout<<endl;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值