线性表顺序存储API


顺序存储的优点:

无需为线性表中的逻辑关系增加额外的空间

可以快速的获取表中合法位置的元素

顺序存储的缺点:

插入和删除操作需要移动大量元素

当线性表长度变化较大时难以确定存储空间的容量


seqlist.h

#ifndef __MY_SEQLIST_H__
#define __MY_SEQLIST_H__

typedef void SeqList;

typedef void SeqListNode;

typedef unsigned int DataType;

SeqList* SeqList_Create(int capacity);

void SeqList_Destroy(SeqList* list);

void SeqList_Clear(SeqList* list);

int SeqList_Length(SeqList* list);

int SeqList_Capacity(SeqList* list);

int SeqList_Insert(SeqList*list,SeqListNode*node,int pos);

SeqListNode* SeqList_Get(SeqList*list,int pos);

/*这种返回int的删除程序是不恰当的 因为顺序表底层库不关心业务节点内存的分配与释放
全部是有调用者实现的内存分配与释放,所以 我们应该返回指向节点的指针 而不是int型变量*/
//int SeqList_Delete(SeqList*list,int pos);

SeqListNode* SeqList_Delete(SeqList*list,int pos);

#endif

seqlist.c

#include "seqlist.h"
#include <stdio.h>
#include<stdlib.h>
#include <memory.h>

//线性表
//1.线性表顺序存储---顺序表
//2.线性表链式存储---链表

typedef struct _tag_SeqList
{
    int length;//顺序表的长度和容量是两个不同的概念  容量 >=长度
    int capacity;
    DataType* node;
}TSeqList;

SeqList* SeqList_Create(int capacity)
{
    int ret = 0;
    TSeqList *tmp = NULL;
    tmp = (TSeqList*)malloc(sizeof(TSeqList));
    if (tmp==NULL)
    {
        ret = -1;
        printf("func malloc() err:%d\n",ret);
        return NULL;
    }
    memset(tmp,0,sizeof(TSeqList));
    tmp->node = (DataType*)malloc(sizeof(DataType*)*capacity);
    if (tmp==NULL)
    {
        ret = -2;
        printf("func malloc err:%d\n",ret);
        return NULL;
    }
    tmp->capacity = capacity;
    tmp->length = 0;
    return tmp;
}

void SeqList_Destroy(SeqList* list)
{
    TSeqList *tlist = NULL;
    if (list ==NULL)
    {
        return ;
    }
    tlist = (TSeqList*)list;
    if (tlist->node!=NULL)
    {
        free(tlist->node);
        tlist->node = NULL;
    }
    free (tlist);
    tlist = NULL;
}
//清空
void SeqList_Clear(SeqList* list)
{
    TSeqList *tlist = NULL;
    if (list ==NULL)
    {
        return ;
    }
    tlist = (TSeqList*)list;
    tlist->length = 0;
}

int SeqList_Length(SeqList* list)
{
    TSeqList *tlist = NULL;
    if (list ==NULL)
    {
        return -1 ;
    }
    tlist = (TSeqList*)list;
    return tlist->length;
}

int SeqList_Capacity(SeqList* list)
{
    TSeqList *tlist = NULL;
    if (list ==NULL)
    {
        return -1 ;
    }
    tlist = (TSeqList*)list;
    return tlist->capacity;
}

int SeqList_Insert(SeqList*list,SeqListNode*node,int pos)
{
    TSeqList *tlist = NULL;
    int i = 0;
    int ret = 0;
    if (list ==NULL|| node==NULL || pos<0)
    {
        ret = -1;
        printf("list ==NULL|| node==NULL || pos<0 ");
        return ret ;
    }
    tlist = (TSeqList *)list;
    //判断满不满
    if (tlist->length>=tlist->capacity)
    {
        ret = -2;
        printf("tlist->length>=tlist->capacity :%d\n",ret);
        return ret ;
    }
    //容错修正 假设长度目前为6,容量为20,现在用户输入pos = 10 插入;我们应该在位置7插入
    if (pos>=tlist->length)
    {
        pos = tlist->length;
    }

    //元素后移
    for (i = tlist->length; i>pos;i--)
    {
        tlist->node[i] = tlist->node[i-1];
    }
    //在pos位置插入元素
    tlist->node[i] = (DataType)node;//void指针赋值给其他类型的指针时都要进行转换
    tlist->length++;

    return ret;
}

SeqListNode* SeqList_Get(SeqList*list,int pos)
{
    TSeqList *tlist = NULL;
    int i = 0;
    int ret = 0;
    tlist = (TSeqList *)list;
    if (list ==NULL||pos<0||pos>=tlist->length)
    {
        ret = -1;
        printf("list ==NULL||pos<0||pos>=tlist->length :%d\n",ret);
        return NULL ;
    }
    return (SeqListNode*)(tlist->node[pos]);
}
//删除pos处的元素 返回成不成功 0成功 

SeqListNode* SeqList_Delete(SeqList*list,int pos)
{
    TSeqList *tlist = NULL;
    int i = 0;
    SeqListNode *ret=NULL;
    
     if (list ==NULL||pos<0)
    {
        printf("list ==NULL||pos<0||pos>=tlist->length");
        return NULL ;
    }
    tlist = (TSeqList *)list;
    ret = (SeqListNode*)tlist->node[pos];//保存要删除的节点元素值
    //元素前移
    for (i = pos ;i <=tlist->length;i++)
    {
        tlist->node[i] = tlist->node[i+1];
    }
    tlist->length--;
    return ret;
}


test.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdio.h>
#include <string.h>
#include "seqlist.h"

typedef struct Teacher
{    
    int age;
    char name[10];
}Teacher;

void display()
{
    int ret = 0;
    int i = 0;
    Teacher t1,t2,t3,t4,t5,t6;

    SeqList* list = NULL;

    t1.age = 30;
    t2.age = 31;
    t3.age = 32;
    t4.age = 33;
    t5.age = 34;
    t6.age = 35;

    list =(SeqList* )SeqList_Create(10);

    if (list ==NULL)
    {
        ret = -1;
        printf("func SeqList_Create() error :%d\n",ret);
        return ret ;
    }

    ret = SeqList_Insert(list,&t1,0);//任何指针都可以赋值给void指针 不需要转换
    ret = SeqList_Insert(list,&t2,0);
    ret = SeqList_Insert(list,&t3,0);
    ret = SeqList_Insert(list,&t4,0);
    ret = SeqList_Insert(list,&t5,0);
    ret = SeqList_Insert(list,&t6,0);

    for (i = 0;i<SeqList_Length(list);i++)
    {
        Teacher * tmp = (Teacher *)SeqList_Get(list,i);
        if (tmp==NULL)
        {
            ret = -1;
            printf("func SeqList_Get() error :%d\n",ret);
            return ret ;
        }
        printf("%d\n",tmp->age);
    }
    //删除链表中的节点
    while (SeqList_Length(list)>0)
    {
         ret =  SeqList_Delete(list,0);
         if (ret == NULL)
         {
             printf("func SeqList_Delete() err \n");
         }
    }

    SeqList_Destroy(list);
}

int main()
{
    display();
    system("pause");
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值