您的位置:首页 > 理论基础 > 数据结构算法

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

2018-01-25 15:36 197 查看
第一篇博客,以后继续努力!

//线性表的顺序存储结构
#include<stdio.h>
#include<stdlib.h>
#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;i++)
    {
        if(L.elem[i]!=x)i++;
        else
        {
            for(k=i;k<L.length;k++)
                L.elem[k-1]=L.elem[k];
            L.length--;
            break;    
        }    
    }
    if(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;i<L.length;i++)
        printf("%d  ",L.elem[i]);
    printf("\n打印结束!请继续操作\n");
    }
}
void Enter()
{//功能
    printf("1.顺序线性表初始化\n");
    printf("2.在顺序线性表L中第i个位置之前插入新的元素\n");
    printf("3.在顺序线性表L中删除第i个元素\n");
    printf("4.删除线性表L中值为x的第一个结点\n");
    printf("5.打印该线性表\n");
    printf("6.在顺序线性表L中查找第1个值与e满足compare()的元素的位序\n");
}
int LocateElem_Sq(SqList L,ElemType e)
{//在顺序线性表L中查找第1个值与e满足compare()的元素的位序
    //若找到则返回其在L中的位序,否则返回0
    int i=1;    //i的初值为第一个元素的位序
    int *p=L.elem;
    while(i<=L.length&&!(*p++==e))++i;
    if(i>L.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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 线性表