线性表的顺序表示及其基本操作

#include<stdio.h>
#include<stdlib.h> 
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OVERFLOW 1
#define OK 1
#define ERROR 0
/*基本操作
Status Initlist_Sq(Sqlist &L);
Status Creat_Sq(Sqlist &L); 
Status Destory_Sq(Sqlist &L);
Status clear_Sq(Sqlist &L); 
Status ListEmpty(Sqlist &L);
Status GetElem(Sqlist &L,int i);
Status GetElem(Sqlist &L,int i);
Status insert_Sq(Sqlist &L,int i,int e);
Status delete_Sq(Sqlist &L,int j);
Status inverse_Sq(Sqlist &L);//就地逆置 
void show_Sq(Sqlist L); */

typedef  int ElemType;
typedef  int Status;
typedef struct list{
    ElemType *elem;//存储空间基址 
    int length;//当前长度 
    int listsize;//当前分配存储量 
}Sqlist;
//构造一个空的线性表L
Status Initlist_Sq(Sqlist &L)
{
    L.elem=(ElemType*)malloc(LIST_INIT_SIZE *sizeof(ElemType));
    if(!L.elem) exit(OVERFLOW);
    L.length=0;
    L.listsize=LIST_INIT_SIZE;
    return OK;
}
//创建线性表
Status Creat_Sq(Sqlist &L)
{
    int i;
    int a;//输入元素个数 
    printf("请输入要创建的元素个数:\t");
    scanf("%d",&a);
    Initlist_Sq(L);
    L.length=a;
    printf("请输入线性表的元素:");
    getchar();
    for(i=0;i<a;i++)
    {
       scanf("%d",&L.elem[i]);
    }
    return OK; 
} 
//销毁线性表
Status Destory_Sq(Sqlist &L)
{
    if(L.elem)
    free(L.elem);
    printf("完成顺序表的销毁\n");
    return OK;
} 
//清空线性表
Status clear_Sq(Sqlist &L)
{
    L.length=0;
    return OK;
} 
//空表验证
Status ListEmpty(Sqlist &L)
{
    if(L.length==0)
    printf("空表");
    else
    printf("不是空表");
    return OK; 
} 
//用e返回表中元素
Status GetElem(Sqlist &L,int i)
{   
    ElemType e; 
    if(i<1||i>L.length)
    printf("i值不合法\n");
    else
    e=*(L.elem+i-1);
    printf("%d",e);
    return OK; 
} 
//插入操作函数 
Status insert_Sq(Sqlist &L,int i,int e)
{
    ElemType *p,*q,*newbase;
    if(i<1||i>L.length+1)
    return ERROR; 
    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];
    for(p=(&L.elem[L.length-1]);p>=q;--p)
    {
        *(p+1)=*p;
    } 
     *q=e;
     ++L.length;
     return OK;
}
//删除操作函数 
Status delete_Sq(Sqlist &L,int j)
{
    ElemType *p,*q;
    if(j<1||j>L.length+1)
    return ERROR;
    for(p=&(L.elem[j-1]);p<&(L.elem[L.length]);++p)
    {
        *p=*(p+1);
    }
    --L.length;
    return OK;
}
Status inverse_Sq(Sqlist &L)//就地逆置
{
    if(L.length==0) return ERROR;
    ElemType temp;
    int i=0,j=L.length-1;
    for(i=0;i<=(L.length/2)-1;i++)
    {
        temp=L.elem[i];
        L.elem[i]=L.elem[j];
        L.elem[j]=temp;
        j--;
    }
    return OK;
 } 
//遍历函数 
void show_Sq(Sqlist L)
{
    for(int i=0;i<L.length;i++)
    {
        printf("%d\t",L.elem[i]);
    }
}
int main()
{
    Sqlist L;
    Creat_Sq(L);
    int a=1;
    while(a) 
    {
    printf("\n请输入要进行的操作:\n 1.遍历\t2.插入\t3.删除\t4.销毁\t5.清空\t6.空表验证\t7.取元素\t8.逆置");
    int i,k;
    scanf("%d",&k);
    switch(k) 
    {
         case 1:show_Sq(L);
                break;
         case 2:int j,e;
                printf("请输入第i个元素之前插入e:\t");
                getchar();
                scanf("%d%d",&i,&e);
                insert_Sq(L,i,e);
                break;
        case 3: printf("请输入要删除第i个元素:\t");
                getchar();
                scanf("%d",&i);
                delete_Sq(L,i);
                break; 
        case 4:Destory_Sq(L);
               break;
        case 5:clear_Sq(L);
               break;
        case 6:ListEmpty(L);
               break;
        case 7:scanf("%d",&i);
               printf("取第%d个元素:",i);
               GetElem(L,i);
               break; 
        case 8:inverse_Sq(L);
               break; 
        default:printf("输入的数字不正确\n");
                break;     
    }//switch
    printf("\n是否还要进行操作?(选择是按 1,选择否按 0):");//判断程序是否继续进行 
    scanf("%d",&i);
    if(i!=1)
    a=0;
    }//while 
    return 0; 
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值