刺破数据结构-数据结构学习总结(第二章)c语言线性表功能实现

InitList操作的实现

此处实现的是c语言的初始化,与顺序表的写入与展示。所需要关注的部分主要是因为c语言没有c++的引用参数,所以我们需要利用指针实现操作可能回有一丝丝的繁琐。

还有一点需要注意:此处易形成野指针,在main中SqList L.切勿写成Sqlist *L。

我们在此处需要用的是Sqlist L,传地址时用的是&L进行地址传递

//调入头文件
#include <stdio.h>
#include <stdlib.h>

#define MAXLENGTH 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Status;
typedef int ElemType; 

typedef struct 
{
    ElemType *data;
    int length;
    //此处不做动态分配。每个线性表长度是固定的。
}SqList;

Status InitList(SqList *L){
    L->data = (ElemType*)malloc(MAXLENGTH*sizeof(ElemType));
    if(!L->data) return OVERFLOW;
    L->length = 0;
    return OK;
}
/*
Status WriteList(SqList *L){
    printf("输入顺序表表长:");
    scanf("%d",&L->length);
    printf("输入%d个元素",L->length);
    for(int i=0;i<L->length;i++)
    {
        scanf("%d",&L->data[i]);
    }
}

Status PrintList(SqList *L)
{
    if (!L->data){
        return ERROR;
    }
    printf("顺序表元素为:");
    for(int  i = 0; i < L->length;i++)
    {
        printf("%d ",L->data[i]);
    }
    printf("\n");
    }
*/
int main(){
    SqList L;
    InitList(&L);
/*
    WriteList(&L);
    PrintList(&L);
*/
    return 0;

}

其实真正的顺序表构建只有亮着的部分,剩下的是展示的操作。

DestroyList操作的实现

Status DestroyList(SqList *L)
{
    L->length = 0;
    free(L->data);
    printf("已经销毁");
    return OK;
}

销毁表的操作函数可以写在main函数前面。

销毁即清除顺序表L的data项空间(我们将数据空间分给的真正目标是data从而间接分给L)。

并且将L->length清除为0;

ClearList 

Status ClearList(SqList *L)
{
    L->length = 0;
    printf("已经清除");
    return OK;
}

GetLength

Status GetLength(SqList L){
    return L.length;
}

Isempty

Status Isempty(SqList L){
    if(L.length == 0) return 1;
    else return 0;
}

GetElem

ElemType GetElem(SqList L,int i,ElemType *e)
{
    if(i<1||i>L.length) return OVERFLOW;
    *e =L.data[i-1];
    return OK;
}

LocateElem

int LocateElem(SqList L,ElemType e){
    for(int i=0;i<L.length;i++){
        if(L.data[i] == e) return i+1;
    }
    return 0;
}

ListInsert

Status ListInsert(SqList *L,int i,ElemType e)
{
    if(i<1||i>L->length+1) return ERROR;
    if(L->length ==MAXLENGTH) return ERROR;
    for(int j=L->length-1;j>=i-1;j--){
        L->data[j+1]=L->data[j];
    }
    L->data[i-1]=e;
    L->length++;
    return OK;
}

插入操作:主要还是for循环里的数值该如何选择设置,我们可以知道物理位置的位置是从length-1到i-1为止,即我们初始的j可以等于length-1,截至条件是到i-1位置的程序也运行过一遍为止(小技巧:记住i--或者i++时,截至条件有等号,循环体便会运行到等号处次数为止。故我们选择length-1与i-1为停止条件。

ListDelete


Status ListDelete(SqList *L,int i){
    if(i<1||(i>=L->length)) return ERROR;
    for (int j=i;j<=L->length-1;j++)
    {
        L->data[j-1]=L->data[j];
    }
     L->length--;
     return OK;
}

我们所做的删除操作其实是逆向的增添。

其最关键的也是从哪开始到哪结束,物理地址上,应该是从删除的元素i-1处开始,在length-1处结束。同理我们写下即可。

整体代码:

//调入头文件
#include <stdio.h>
#include <stdlib.h>

#define MAXLENGTH 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Status;
typedef int ElemType; 

typedef struct 
{
    ElemType *data;
    int length;
    //此处不做动态分配。每个线性表长度是固定的。
}SqList;

Status InitList(SqList *L){
    L->data = (ElemType*)malloc(MAXLENGTH*sizeof(ElemType));
    if(!L->data) exit(OVERFLOW);
    L->length = 0;
    return OK;
}

Status WriteList(SqList *L){
    printf("输入顺序表表长:");
    scanf("%d",&L->length);
    printf("输入%d个元素",L->length);
    for(int i=0;i<L->length;i++)
    {
        scanf("%d",&L->data[i]);
    }
}

Status PrintList(SqList *L)
{
    if (!L->data){
        return ERROR;
    }
    printf("顺序表元素为:");
    for(int  i = 0; i < L->length;i++)
    {
        printf("%d ",L->data[i]);
    }
    printf("\n");
    }

Status DestroyList(SqList *L)
{
    L->length = 0;
    free(L->data);
    printf("已经销毁");
    return OK;
}

Status ClearList(SqList *L)
{
    L->length = 0;
    printf("已经清除");
    return OK;
}

Status GetLength(SqList L){
    return L.length;
}

Status Isempty(SqList L){
    if(L.length == 0) return 1;
    else return 0;
}

ElemType GetElem(SqList L,int i,ElemType *e)
{
    if(i<1||i>L.length) return OVERFLOW;
    *e =L.data[i-1];
    return OK;
}

int LocateElem(SqList L,ElemType e){
    for(int i=0;i<L.length;i++){
        if(L.data[i] == e) return i+1;
    }
    return 0;
}



Status ListInsert(SqList *L,int i,ElemType e)
{
    if(i<1||i>L->length+1) return ERROR;
    if(L->length ==MAXLENGTH) return ERROR;
    for(int j=L->length-1;j>=i-1;j--){
        L->data[j+1]=L->data[j];
    }
    L->data[i-1]=e;
    L->length++;
    return OK;
}


Status ListDelete(SqList *L,int i){
    if(i<1||(i>=L->length)) return ERROR;
    for (int j=i;j<=L->length-1;j++)
    {
        L->data[j-1]=L->data[j];
    }
     L->length--;
     return OK;
}



int main(){
    SqList L;
    ElemType e;
    int i;
    InitList(&L);
    WriteList(&L);
    PrintList(&L);
    printf("长度:%d",GetLength(L));
    printf("空:%d\n",Isempty(L));
    printf("需要增加的位置:");
    scanf("%d",&i);
    printf("需要增加的元素:");
    scanf("%d",&e);
    ListInsert(&L,i,e);
    printf("长度:%d",GetLength(L));
    PrintList(&L);
    printf("需要减少的元素序号:");
    scanf("%d",&e);
    ListDelete(&L,e);
    PrintList(&L);
    printf("长度:%d",GetLength(L));
    /*
    getchar();
    printf("请输入需要查询的元素序号");
    scanf("%d",&i);
    GetElem(L,i,&e);
    printf("所对应的元素为:%d",e);
    printf("请输入需要查询的元素");
    scanf("%d",&e);
    printf("所对应的元素序号为:%d\n",LocateElem(L,e));
    */
    ClearList(&L);
    DestroyList(&L);
    printf("空:%d",Isempty(L));
    return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值