数据结构学习之线性表的顺序存储结构


第一篇博客,以后继续努力!

//线性表的顺序存储结构
#include
#include
#define OK 1
#define ERROR -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#define LIST_INIT_SIZE 100    //线性表存储空间的初始分配值 
#define LISTINCREMENT 20    // 线性表存储空间的分配增量 
typedef struct
{
    ElemType *elem;    //存储空间基址 
    int length;        //当前长度 
    int listsize;    //当前分配的存储容量 
 }SqList;
Status Init_SqList(SqList &L)
{//顺序线性表初始化 
    L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L.elem)    exit(OVERFLOW);    //存储分配失败 
    L.length=0;                    //空表长度为0 
    L.listsize=LIST_INIT_SIZE;    //初始存储容量 
    printf("初始化成功!请继续操作\n"); 
    return OK;    
}
Status Insert_SqList(SqList &L,int i,ElemType e)
{//顺序线性表的插入 在顺序线性表L中第i个位置之前插入新的元素 
    //i的合法值为1<=i<=ListLength.Sq(L)+1 
    int *newbase;
    int *p;
    int *q;
    if(i<1||i>L.length+1)    return ERROR;//i值不合法 
    if(L.length>=L.listsize)
    {
        newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
        if(!newbase)    exit(OVERFLOW);//存储分配失败 
        L.elem=newbase;                   //新基址 
        L.listsize+=LISTINCREMENT;       //增加存储容量 
    } 
    q=&(L.elem[i-1]);                   //q为插入位置 
    for(p=&(L.elem[L.length-1]);p>=q;--q)
        *(p+1)=*p;                        //插入位置及之后的元素右移 
    *q=e;        //插入e 
    L.length++; //表长增1 
    printf("插入成功!请继续操作\n"); 
    return OK;
}
Status Delete_SqList(SqList &L,int i,ElemType &e)
{//在顺序线性表L中删除第i个元素,并用e返回其值 
    int *p,*q;
    if(L.length==0)//线性表为空 
    {
        printf("线性表为空!\n");
        return ERROR;
    }
        else if(i<1||i>L.length)//i值不合法 
        {
            printf("要删除的数据元素不存在!\n");
            return ERROR;
        }
        p=&L.elem[i-1];        //p为被删除元素位置 
        e=*p;                //被删除元素的值赋给e 
        q=L.elem+L.length-1;//表尾元素的位置 
        for(++p;p<=q;++p)    //被删除元素之后的元素左移 
            *(p-1)=*p;         
        L.length--;            //表长减1 
        printf("删除成功!删除数据为:%d,请继续操作\n",e); 
        return OK;
}
Status Locate_Delete_SqList(SqList &L,ElemType x)
{//删除线性表L中值为x的第一个结点 
    int i,k;
    for(i=0;i=L.length)
    {
        printf("要删除的数据元素不存在!\n");
        return ERROR;
    }
    else printf("删除成功!请继续操作\n");
    return OK;
}
void Display_SqList(SqList L)
{//打印线性表L 
    if(L.length==0)printf("线性表为空!您可以向线性表中插入数据,请输入数字2\n");
    else{ 
    printf("线性表如下:\n");
    for(int i=0;iL.length)    return ERROR;
    else return i;    
} 
int main()
{    
    printf("请选择功能:");
    Enter();
    int n;
    SqList L;
    while(~(scanf("%d",&n)))
    {
        switch(n)
        {
            case 1: {    
                Init_SqList(L);
                break;
            }        
            case 2: {
                printf("请输入插入位置和数据:");
                int i,e;
                scanf("%d%d",&i,&e);
                Insert_SqList(L,i,e);
                break;
            }
                    
            case 3: {
                printf("请输入要删除的位置:");
                int j,e;
                scanf("%d",&j); 
                Delete_SqList(L,j,e);
                break;
            }
            case 4:{
                printf("请输入要删除的值:");
                int x;scanf("%d",&x); 
                Locate_Delete_SqList(L,x);
                break;
            }
            case 5:{
                Display_SqList(L);
                break;
            }
            case 6:{
                printf("请输入要查找的值:");
                int e;scanf("%d",&e);
                if(!LocateElem_Sq(L,e)) printf("未找到!"); 
                printf("第1个值与e相同的元素的位序为:%d",LocateElem_Sq(L,e));
                break;
            }
        }
    }
    return 0;
}


你可能感兴趣的:(数据结构,数据结构,线性表)