数据结构初学1(线性表)

总结一下线性表的知识,今晚只学习了顺序结构的线性表,所以不提连是存储结构的线性表!

理论知识模块

一、线性表的定义

1、线性表(List)是零个或多个数据元素的集合
2、线性表中的数据元素之间是有顺序的
3、线性表中的数据元素个数是有限的

4、线性表中的数据元素的类型必须相同

二、线性表的概念

1、 线性表是具有相同类型的n( ≥0)个数据元素的有限序列

2、线性表是数据元素的有序并且有限的集合
3、线性表中的数据元素必须是类型相同的
4、线性表可用于描述“队列类型”关系的问题

三、线性表的一些常用操作
1、创建线性表
2、销毁线性表
3、清空线性表
4、将元素插入线性表
5、将元素从线性表中删除
6、获取线性表中某个位置的元素
7、获取线性表的长度

四、线性表在程序中表现为一种特殊的数据类型线性表的操作在程序中的表现为一组函数

List
List* List_Create();
void List_Destroy(List* list);
void List_Clear(List* list);
int List_Insert(List* list, ListNode* node, int pos);
ListNode* List_Delete(List* list, int pos);
ListNode* List_Get(List* list, int pos);
int List_Length(List* list);

五、顺序存储结构
1、线性表的顺序存储结构指的是用一段 指的是用一段地址连续的存储单元依次存储线性表的数据元素。

2、在C语言中可以用一维数组来实现顺序存储结构
存储空间的起始位置::数组 数组n od e
线性表的最大容量::数组长度 数组长度MA XSI ZE
线性表的当前长度:length

举例如下:


实践模块

接下来就是通过一些程序来验证理论了

一个一个的充实前面的顺序表操作函数

一、获取元素函数

SeqListNode* SeqList_Get(SeqList* list, int pos) // O(1) 
{
    TSeqList* sList = (TSeqList*)list;
    SeqListNode* ret = NULL;
    
    if( (sList != NULL) && (0 <= pos) && (pos <= sList->length) )
    {
        ret = (SeqListNode*)(sList->node[pos]);
    }
    
    return ret;
}

二、插入元素算法

int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) // O(n) 
{
    TSeqList* sList = (TSeqList*)list;
    int ret = (sList != NULL);
    int i = 0;
    
    ret = ret && (sList->length + 1 <= sList->capacity);
    ret = ret && (0 <= pos);
    
    if( ret )
    {
        if( pos >= sList->length )
        {
            pos = sList->length;
        }
        
        for(i=sList->length; i>pos; i--)
        {
            sList->node[i] = sList->node[i-1];
        }
        
        sList->node[i] = (TSeqListNode)node;
        
        sList->length++;
    }
    
    return ret;
}


三、删除元素算法

SeqListNode* SeqList_Delete(SeqList* list, int pos) // O(n)
{
    TSeqList* sList = (TSeqList*)list;
    SeqListNode* ret = SeqList_Get(list, pos);
    int i = 0;
    
    if( ret != NULL )
    {
        for(i=pos+1; i<sList->length; i++)
        {
            sList->node[i-1] = sList->node[i];
        }
        
        sList->length--;
    }
    
    return ret;
}
四、获取线性表大小

int SeqList_Capacity(SeqList* list) // O(1)
{
    TSeqList* sList = (TSeqList*)list;
    int ret = -1;
    
    if( sList != NULL )
    {
        ret = sList->capacity;
    }
    
    return ret;
}

五、线性表长度

int SeqList_Length(SeqList* list) // O(1)
{
    TSeqList* sList = (TSeqList*)list;
    int ret = -1;
    
    if( sList != NULL )
    {
        ret = sList->length;
    }
    
    return ret;
}
六、清空线性表

void SeqList_Clear(SeqList* list) // O(1)
{
    TSeqList* sList = (TSeqList*)list;
    
    if( sList != NULL )
    {
        sList->length = 0;
    }
}

七、创建线性表

SeqList* SeqList_Create(int capacity) // O(1)
{
    TSeqList* ret = NULL;
    
    if( capacity >= 0 )
    {
        ret = (TSeqList*)malloc( sizeof(TSeqListNode) * capacity);
    }
    
    if( ret != NULL )
    {
        ret->capacity = capacity;
        ret->length = 0;
        ret->node = (TSeqListNode*)(ret + 1);
    }
    
    return ret;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值