C Datastructure 1 ---- linear list

本文介绍了一种基于数组实现的线性表数据结构,并详细展示了其核心功能的实现过程,包括初始化、读取元素、插入与删除操作等。此外,还提供了复制表、表拼接等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在数据结构里面,我们最先学习的就是表。
表包括以下两种

  • 线性表
  • 链表

今天我们实现的就是第一种线性表。
使用数组实现法。

首先定义数据结构。linear list github源码链接

// list.h
#define MAX_SIZE 1024

typedef enum
{
    FALSE = 0,
    TRUE = 1
}Status;

typedef int ElementType;

typedef struct
{
    ElementType data[MAX_SIZE]; 
    int length;// start from 0

}list_t;

然后列出我们想要实现表的那些功能(functions)呢?

最基本的就是插入(InsertElem)、删除(DeletElem)、读取元素(GetElem)、读取下标(GetIndex)。
此外最基本的还需要初始化(InitList)、清除一张表(ClearList)。
当然了,我们在实现上述函数的同时,还可能需要其他功能,比如获取表的长度(GetLength),插入元素前需要先判断表是否满了(IsListFull)删除元素前先判断表是否是空的(IsListEmpty)
另外博主也加入了一下几个功能,压入元素(PushElem),类似入栈(stack)弹出,弹出元素(PopElem),类似出栈,其实线性表也可以算是广义的栈(stack)。复制一个表(CopyList),在一个表后面追加一个表(AppendList),与此类似还有一个两表拼接(AddList),可以理解为类似字符串拼接。

函数原型如下

// list.h
void InitList(list_t *list);
Status IsListEmpty(list_t *list);
Status IsListFull(list_t* list);
void ClearList(list_t* list);
Status GetElem(list_t* list, int index, ElementType * elem);
Status GetIndex(list_t* list, ElementType elem, int* index);
void GetLength(list_t* list, int* len);
Status InsertElem(list_t* list, int index, ElementType elem);
Status PushElem(list_t* list, ElementType elem);
Status DeletElem(list_t* list, int index);
Status PopElem(list_t* list);
Status CopyList(list_t* from, list_t* to);
Status AppendList(list_t* la, list_t* list);
Status AddList(list_t* la, list_t* lb, list_t* list);

void PrintList(list_t* list);//for debug

下面是具体实现

/*
 ************************************************************************
 *File Name: list.c
 *Author   : 
 *Date     : 2017年04月07日 星期五 11时22分48秒
 *Brief    : static linear list using array to store data
 ************************************************************************
 */
#include "list.h"
#include <stdio.h>
/*
* implementation
*/

void InitList(list_t *list)
{
    list->length = -1;
}

Status IsListEmpty(list_t *list)
{
    if (list->length == -1)
        return TRUE;
    else
        return FALSE;
}

Status IsListFull(list_t* list)
{
    if(list->length == MAX_SIZE-1)
        return TRUE;
    else
        return FALSE;
}

void ClearList(list_t* list)
{
    list->length = -1;
}


Status GetElem(list_t* list, int index, ElementType * elem)
{
    if(IsListEmpty(list) || index <0 || index>list->length)
        return FALSE;

    *elem = list->data[index];

    return TRUE;
}

Status GetIndex(list_t* list, ElementType elem, int* index)
{
    int i = 0;

    while(i <= list->length)
    {
        if(list->data[i] == elem)
        {
            *index = i;

            return TRUE;
        }

        i++;
    }

    return FALSE;
}

void GetLength(list_t* list, int* len)
{
    *len = list->length+1;
}


// put the elme at the index
Status InsertElem(list_t* list, int index, ElementType elem)
{
    int i=0;

    if(IsListFull(list) || index<0 || index>list->length+1)// list is full or index is elligal
        return FALSE;

    // insert not at length+1, move firstly
    if(index <= list->length) 
    {
        for(i=list->length+1; i>index; i--)
            list->data[i] = list->data[i-1];
    }

    // insert 
    list->data[index] = elem;
    list->length++;

    return TRUE;
}

Status PushElem(list_t* list, ElementType elem)
{
    return InsertElem(list, list->length+1, elem);
}

Status DeletElem(list_t* list, int index)
{
    int i=0;

    if(IsListEmpty(list) || index<0 || index>list->length)
        return FALSE;

    //delet not at length, move firstly
    if(index < list->length)
    {        
        for(i=index; i<list->length; i++)
            list->data[index] = list->data[index+1];
    }

    list->length--;

    return TRUE;
}

Status PopElem(list_t* list)
{
    return DeletElem(list,list->length);
}


Status CopyList(list_t* from, list_t* to)
{
    int i,len;

    InitList(to);
    GetLength(from, &len);

    for(i=0; i<len; i++)
        PushElem(to, from->data[i]);

    return TRUE;
}


Status AppendList(list_t* la, list_t* list)
{   
    int i,la_len,len;

    GetLength(la, &la_len);    
    GetLength(list, &len);

    if(la_len+len > MAX_SIZE)
        return FALSE;

    for(i=0; i<len; i++)
        PushElem(list, la->data[i]);

    return TRUE;
}

// la+lb: put lb behind la
Status AddList(list_t* la, list_t* lb, list_t* list)
{
    int i,la_len,lb_len;

    GetLength(la, &la_len);
    GetLength(lb, &lb_len);

    if(la_len+lb_len > MAX_SIZE)
        return FALSE;

    CopyList(la, list);

    for(i=0; i<lb_len; i++)
        PushElem(list, lb->data[i]);

    return TRUE;
}


void PrintList(list_t* list)
{
    int i, len;

    GetLength(list, &len);

    for(i=0; i<len; i++)
        printf("%d\n", list->data[i]);
}

最后是验证

/*
 ************************************************************************
 *File Name: main.c
 *Author   : 
 *Date     : 2017年04月07日 星期五 16时38分56秒
 *Brief    : 
 ************************************************************************
 */
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
int main(int argc, char const *argv[])
{
    int i=0;
    int len;
    int index;

    list_t list;
    list_t cp_list;
    list_t add_list;

    InitList(&list);
    InitList(&cp_list);
    InitList(&add_list);

    for (i = 0; i < 10; i++)
    {
        PushElem(&list, i+10);
    }

    CopyList(&list, &cp_list);
    AppendList(&list, &cp_list);
    PrintList(&cp_list);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值