用c语言实现线性表(逻辑结构)对应的顺序表(存储结构)

用c语言实现线性表(逻辑结构)对应的顺序表(存储结构)

CSDN的朋友们,你们好呀,时隔一年之久我又回来啦!

今天刚开始复习数据结构,看到线性表这里,就想着先把学习的顺序表用c语言实现一下,因为前段时间花了一个星期把c语言重新过了一遍,也算是双重检测啦!

代码以及注释很详细,我就不多花时间讲解啦,测试数据是随机想的,没有将输出这些封装在我的函数体里,也算是一个缺陷啦!

这次写出来没有很大的成就感,也不知道为啥,小疑惑!

//用c语言实现(逻辑结构)线性表的(存储结构)顺序表的(数据运算)基本操作

/*头文件*/
#include<stdio.h>   //输入输出头文件
#include<stdlib.h>  //malloc free头文件

/*常量定义*/
#define InitSize 100   //定义顺序表的初始分配量
#define IncreMent 10   //定义顺序表的分配增量
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2

/*存储类型定义*/
typedef int ElemType;  //比如数据元素为int类型(具体可以根据实际需求设定)
typedef struct   //定义(复杂数据类型)顺序存储类型(顺序表的数据类型)
{
    ElemType *data;   //指针指向数组的首地址 数组采用动态分配 ElemType表示存储的数据元素的数据类型(可变)
    int MaxSize,length;  //定义数组的最大存储容量和当前使用容量
}SqList;        //无名结构体取别名SqList

/*基本操作自定义函数说明*/
int InitList(SqList *L);                     //线性表初始化 构造一个空的线性表
int Length(SqList L);                        //求表长
int LocateElem(SqList L,ElemType e);         //按值查找
ElemType GetElem(SqList L,int i);           //按位查找
int ListInsert(SqList *L,int i,ElemType e); //插入操作
int ListDelete(SqList *L,int i,ElemType *e);//删除操作
void PrintList(SqList L);                   //输出线性表
int Empty(SqList L);                        //判断是否为空表
void DestoryList(SqList *L);                //销毁线性表

/*主函数*/
void main()
{
    SqList L;  //定义一个顺序表变量

    int i,l1,l2,empty,length1,length2,element1,element2; //length表示线性表长度 element表示返回的删除的元素

    /*初始化线性表*/
    printf("初始化线性表:\n");

    l1=InitList(&L);  //初始化线性表
    if(l1==TRUE)
        printf("线性表初始化成功!\n");

    printf("\n");

    /*判断线性表是否为空*/
    printf("判断线性表是否为空:\n");

    empty=Empty(L);
    if(empty==TRUE)
        printf("当前线性表为一个空表!\n");

    printf("\n");

    /*向线性表中插入元素*/
    printf("向线性表中插入元素:\n");

    for(i=1;i<=10;i++)
        ListInsert(&L,i,2*i-1);

    printf("\n");

    /*求线性表长度并输出线性表数据元素*/
    printf("求线性表长度并输出线性表数据元素:\n");

    length1=Length(L);
    printf("线性表长度为%d\n",length1);
    PrintList(L);

    printf("\n");

    /*按位查找运算*/
    printf("按位查找运算:\n");

    element1=GetElem(L,3);
    printf("线性表中第3位的元素为%d\n",element1);

    l2=LocateElem(L,7);
    if(l2!=FALSE)
        printf("数据元素7在线性表的第%d位\n",l2);
    else printf("没有在线性表中找到该数据元素\n");

    printf("\n");

    /*向线性表中删除元素*/
    printf("向线性表中删除元素:\n");

    ListDelete(&L,7,&element2);
    printf("删除的元素是%d\n",element2);

    printf("\n");

    /*输出线性表删除后的长度和元素*/
    printf("输出线性表删除后的长度和元素:\n");

    length2=Length(L);
    printf("线性表长度为%d\n",length2);
    PrintList(L);

    printf("\n");

    /*销毁线性表*/
    DestoryList(&L);
}

/*基本操作自定义函数定义*/
int InitList(SqList *L)  //为线性表存储类型的结构体成员变量一一初始化
{
    (*L).data=(ElemType *)malloc(InitSize*sizeof(ElemType));  //指针初始化 结构体成员变量.或者->(指针)
    if((*L).data==NULL)  //判断是否分配成功 分配失败则报错
        exit(OVERFLOW);
    (*L).length=0;      //初始化线性表当前使用容量为0
    (*L).MaxSize=InitSize; //初始化线性表最大容量

    return TRUE;  //初始化成功
}

int Length(SqList L)
{
    return L.length;   //返回线性表当前使用容量
}

int LocateElem(SqList L,ElemType e)  //返回线性表位序
{
    int i;
    for(i=0;i<L.length;i++)
    {
        if(L.data[i]==e)
            return i+1;    //注意区分数组下标(从0开始)和线性表位序(从1开始)
    }

    return FALSE;   //查找失败
}

ElemType GetElem(SqList L,int i)
{
    if(i<1||i>L.length)
        return FALSE;

    return L.data[i-1];     //返回线性表第i个位置对应的数据元素
}

int ListInsert(SqList *L,int i,ElemType e)
{
    int j;  //注意区分传入的参数位序i

    if(i<1||i>(*L).length+1)    //判断位序i是否合法
        return FALSE;

    if((*L).length>=(*L).MaxSize)  //判断是否还有多余存储空间可供插入
    {
        (*L).data=(ElemType *)realloc((*L).data,((*L).MaxSize+IncreMent)*sizeof(ElemType));
        if((*L).data==NULL)
        exit(OVERFLOW);
        (*L).MaxSize+=IncreMent;
    }

    for(j=(*L).length;j>=i;j--)     //从后往前依次向后移动一个
     (*L).data[j]=(*L).data[j-1];

    (*L).data[i-1]=e;    //插入元素

    (*L).length++;       //别忘了插入元素后线性表当前使用长度加一

    return TRUE;   //插入成功
}

int ListDelete(SqList *L,int i,ElemType *e)
{
    int j;  //数组下标

    if(i<1||i>(*L).length) //判断位序i是否合法
        return FALSE;

    (*e)=(*L).data[i-1];  //将位序为i的数据元素赋值给e

    for(j=i;j<=(*L).length-1;j++)  //从前往后依次向前移动一个
        (*L).data[j-1]=(*L).data[j];

    (*L).length--;  //别忘了删除元素后线性表当前使用长度减一

    return TRUE;   //删除成功

}

void PrintList(SqList L)
{
    int i;

    printf("线性表的数据元素依次为:\n");

    for(i=0;i<L.length;i++)
        printf("%d ",L.data[i]);

    printf("\n");
}

int Empty(SqList L)
{
    if(L.length==0)
        return TRUE;  //线性表为空

    return FALSE;   //线性表非空
}

void DestoryList(SqList *L)  //销毁线性表存储类型的结构体成员变量
{
    free((*L).data);
    (*L).data=NULL;
    (*L).length=0;
    (*L).MaxSize=0;
}

运行结果截图:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值