顺序表的各项操作

sqlist.h

#ifndef SQLIST_H
#define SQLIST_H
#define SUCCESS    10000
#define FAILURE    10001
#define TRUE       10002
#define FALSE      10003

#define SIZE       10

typedef int ElemType;
struct squencelist
{
    int length;
    ElemType *data;
};


typedef struct squencelist sqlist;

int SqlistInit(sqlist *l);//初始化

int SqlistInsrt(sqlist *l,int p,ElemType e);//插入

int SqlistLength(sqlist l);//求长度

int GetElem(sqlist l,int p,ElemType *e);//需要查看元素的值,所以要取值

int LocalElem(sqlist l,ElemType e,int (*p)(ElemType,ElemType));//判断元素位置,元素值确定,所以不取值

int SqlistTraverse(sqlist l,void (*p)(ElemType));//没有改变值,不需要取地址

int SqlistEmpty(sqlist l);  //只需要看表的长度

int SqlistDelete(sqlist *l,int p,ElemType *e);//删除某个元素

int SqlistClear(sqlist *l);  //清空表

int SqlistDestroy(sqlist *l);//销毁表

#endif

sqlist.c

#include "sqlist.h"
#include <stdlib.h>


int SqlistInit(sqlist *l)
{
    if(NULL == l)
    {
        return FAILURE;
    }
    l->length = 0;
    l->data = (ElemType *)malloc(sizeof(ElemType)*SIZE);//分配空间

    if(NULL == l->data)
    {
        return FAILURE;
    }
    return SUCCESS;

}

int SqlistInsrt(sqlist *l,int p,ElemType e)
{
    if(NULL == l)  //入参判断
    {
        return FAILURE;
    }
    if(p > l->length+1 || p < 1 || l->length > SIZE)//插入位置超出范围
    {
        return FAILURE;
    }
    int i;
    for(i = 0;i < l->length-p+1;i++)
    {
        //l->data[l->length - i] = l->data[l->length - i - 1];
        l->data[p+i] = l->data[p+i-1];//p位置开始往后移
    }
    l->data[p-1] = e;
    l->length++;
    return SUCCESS;
}

int SqlistLength(sqlist l)
{
    return l.length;
}

int GetElem(sqlist l,int p,ElemType *e)   //*e是用来接p位置值 这里的l不是指针 只是调用
{
    if(p < 1 || p > l.length)
    {
        return FAILURE;
    }
    *e = l.data[p-1];
    return SUCCESS;
}


int LocalElem(sqlist l,ElemType e,int (*p)(ElemType,ElemType))//equal函数
{
    int i;
    for(i = 0;i < l.length; i++)
    {
        if(p(e,l.data[i]) == TRUE)
        {
            return i+1;//已经找到元素相同的位置,将该位置输出
        }

    }
    return FAILURE;
}

int SqlistTraverse(sqlist l,void (*p)(ElemType))
{
    if(NULL == p)
    {
        return FAILURE;
    }
    int i;
    for(i = 0;i < l.length; i++)
    {
        p(l.data[i]);
    }
    return SUCCESS;
}

int SqlistEmpty(sqlist l)
{
    if(0 == l.length)
    {
        return TRUE;
    }
    return FALSE;
}

int SqlistDelete(sqlist *l,int p,ElemType *e)//删除一个元素
{
    if(NULL == l)
    {
        return FAILURE;
    }
    if(p < 1 || p > l->length)
    {
        return FAILURE;
    }

    *e = l->data[p-1];//p位置的元素值
    int i;
    for(i = 0;i < l->length-p+1; i++)
    {
        l->data[p + i - 1] = l->data[p + i];
    }
    l->length--;
    return SUCCESS;
}

int SqlistClear(sqlist *l)
{
    if(NULL == l)
    {
        return FAILURE;
    }

    l->length = 0;
    return SUCCESS;
}

int SqlistDestroy(sqlist *l)
{
    if(NULL == l)
    {
        return FAILURE;
    }
    l->length = 0;
    free(l->data);//结构体指针 在初始化时分配了空间
    l->data = NULL;//将*data置空,否则为野指针
    return SUCCESS;
}

 

主函数 

#include "sqlist.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void print(ElemType e)
{
    printf("%d",e);
}

int equal(ElemType e1,ElemType e2)
{
    if(e1 == e2)
        return TRUE;
    else
        return FALSE;
}
int main()
{
    int ret;
    sqlist list;
    srand(time(NULL));
    ret = SqlistInit(&list);//初始化
    if(ret == SUCCESS)
    {
        printf("Init success!\n");
    }
    else
    {
        printf("Init failure!\n");
    }

    int i;
    for(i = 0; i < 10; i++)// 插入
    {
        ret = SqlistInsrt(&list,i + 1,rand() % 10);//插入随机数
        if(ret == FAILURE )
        {
            printf("Insert failure!\n");
        }
        else
        {
            printf("Insert success!\n");
        }

    }

    ret = SqlistLength(list);
    printf("length is %d\n",ret);
    
    int p = 3;
    ElemType e;
    ret = GetElem(list,p,&e);
    if(ret == SUCCESS)
    {
        printf("GetElem success!\n");
        printf("第%d个位置为%d\n",p,e);
    }
    else
    {
        printf("GetElem failure!\n");
    }

    e= 5;
    ret = LocalElem(list,e,equal);
    if(ret == TRUE)
    {
        printf("%d do not exist!\n",e);
    }
    else
    {
        printf("%d is %dth element\n",e,ret);
    }

    ret = SqlistTraverse(list,print);
    if(ret == FAILURE)
    {
        printf("traverse failure!\n");
    }
    else
    {
        printf("traverse success!\n");
    }
    
    ret = SqlistEmpty(list);
    if(ret == TRUE)
    {
        printf("the list is empty!\n");
    }
    else
    {
        printf("the list is not empty!\n");
    }

    ret = SqlistDelete(&list,p,&e);
    if(ret == FAILURE)
    {
        printf("delete failure!\n");
    }
    else
    {
        printf("delete success!\n");
    }
    ret = SqlistTraverse(list,print);
    if(ret == FAILURE)
    {
        printf("traverse failure!\n");
    }
    else
    {
        printf("traverse success!\n");
    }

    ret = SqlistClear(&list);
    if(ret == FAILURE)
    {
        printf("clear failure!\n");
    }
    else
    {
        printf("clear success!\n");
    }
    ret = SqlistTraverse(list,print);
    if(ret == FAILURE)
    {
        printf("traverse failure!\n");
    }
    else
    {
        printf("traverse success!\n");
    }

    ret = SqlistDestroy(&list);
    if(ret == FAILURE)
    {
        printf("destroy failure!\n");
    }
    else
    {
        printf("destroy success!\n");
    }

    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值