线性表的顺序存储结构(顺序表)

  • 头文件
//list.h
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED

///顺序存储的线性表的实现及对其的操作算法

//定义为顺序表中的元素类型
typedef int ElemType;
//结构类型
typedef struct List ListType;
//用unsigned short int表示bool类型
typedef unsigned short int Bool;
//结构体
struct List
{
    //指向线性表的存储空间
    ElemType * elem;
    //线性表元素的个数
    int elem_num;
};
//顺序表初始化
Bool ListInit(ListType *);
//返回顺序表中所含元素个数
int ListElemNum(const ListType);
//向顺序表中插入一个元素
Bool ListInsert(ListType *, int, ElemType);
//从顺序表中删除某个位置的元素
Bool ListDelete(ListType *, int);
//显示顺序表中的元素
void ShowElem(const ListType);

#endif // LIST_H_INCLUDED
  • c实现文件
//list.c
#include "list.h"
//包含动态分配空间的malloc()函数
#include <stdlib.h>
//标准输入输出文件,内包含printf()函数
#include <stdio.h>

///顺序表初始化
Bool ListInit(ListType *list_ptr)
{//list_ptr为指向顺序表的指针
    //分配一个零字节大小的空间
    list_ptr->elem = (ElemType *)malloc(0);
    //判断是否分配成功
    if(!(list_ptr->elem)) return 0;
    //初始化元素数目为0
    list_ptr->elem_num = 0;
    //初始化成功返回1
    return 1;
}
///返回顺序表中所含元素个数
int ListElemNum(const ListType list_in)
{//list_in表示要显示顺序表的形参
    return list_in.elem_num;
}
//向顺序表中插入一个元素
Bool ListInsert(ListType * list_ptr, int position, ElemType insert_elem)
{//list_ptr为指向顺序表的指针,position表示插入位置(索引位置,从0开始),list_elem表示插入元素
    //判断插入位置是否超出顺序表范围
    if(position < 0 || position > list_ptr->elem_num)
        //若超出顺序表范围,退出函数并返回0
        return 0;
    //重新分配空间,用于存储插入元素后顺序表中的元素
    ElemType * new_elem = (ElemType *)malloc((list_ptr->elem_num + 1) * sizeof(ElemType));
    //判断空间分配是否成功
    if(!new_elem) return 0;
    //定义循环变量i
    int i;
    //将插入位置之前的元素赋给新分配的空间
    for(i = 0; i < position; ++i)
        //将旧空间中插入位置之前的元素转移到新分配的空间去
        new_elem[i] = list_ptr->elem[i];
    //将插入位置之后的元素向后移动一个位置,并赋给新分配的空间
    for(i = position; i < list_ptr->elem_num; ++i)
        //将就空间中插入位置之后的元素转移到因分配的空间去并向后移动一个位置
        new_elem[i + 1] = list_ptr->elem[i];
    //释放旧地址指向的空间
    free(list_ptr->elem);
    //重新指向新分配的空间
    list_ptr->elem = new_elem;
    //将元素插入到相应位置
    list_ptr->elem[position] = insert_elem;
    //元素个数加一
    list_ptr->elem_num++;
    //插入元素成功,返回1
    return 1;
}
///从顺序表中删除某个位置的元素
Bool ListDelete(ListType * list_ptr, int position)
{//list_ptr为指向顺序表的指针,position表示要删除元素所在的位置(索引位置,从0开始)
    //判断要删除元素所在的位置是否超出顺序表的索引范围
    if(position < 0 || position > list_ptr->elem_num - 1)
        //若超出索引范围,退出函数并返回0
        return 0;
    //重新分配空间,用于存储删除元素后顺序表中剩余的元素
    ElemType * new_elem = (ElemType *)malloc((list_ptr->elem_num - 1) * sizeof(ElemType));
    //定义循环变量i
    int i;
    //将旧空间中删除元素所在位置之后的元素向前移动一个位置
    for(i = position; i < list_ptr->elem_num - 1; ++i)
        //逐个将删除元素所在位置之后的元素向前移动一个位置
        list_ptr->elem[i] = list_ptr->elem[i + 1];
    //将旧空间的前elem_num-1个元素转移到新分配的空间中
    for(i = 0; i < list_ptr->elem_num - 1; ++i)
        //逐个将旧空间对应位置的元素赋给新空间对应位置
        new_elem[i] = list_ptr->elem[i];
    //释放旧空间
    free(list_ptr->elem);
    //将指针指向新空间
    list_ptr->elem = new_elem;
    //元素个数减一
    list_ptr->elem_num--;
    //元素删除成功,返回1
    return 1;
}
///显示顺序表中的元素
void ShowElem(const ListType list_in)
{//list_in表示要显示顺序表的形参
    ////定义循环变量
    int i;
    //循环显示顺序表元素
    for(i = 0; i < list_in.elem_num; ++i)
    {
        printf("elem[%d] = %d\n", i, list_in.elem[i]);
    }
}
  • 主程序文件
//main.c
#include <stdio.h>
#include <stdlib.h>
#include "list.h"

int main()
{
    //声明一个线性表
    ListType list1;
    //初始化线性表
    ListInit(&list1);
    printf("线性表中元素个数:%d\n", ListElemNum(list1));
    //插入元素
    ListInsert(&list1, 0, 1);
    printf("线性表中元素个数:%d\n", ListElemNum(list1));
    ListInsert(&list1, 1, 2);
    printf("线性表中元素个数:%d\n", ListElemNum(list1));
    ListInsert(&list1, 2, 3);
    printf("线性表中元素个数:%d\n", ListElemNum(list1));
    ListInsert(&list1, 3, 4);
    printf("线性表中元素个数:%d\n", ListElemNum(list1));
    //显示线性表中元素
    ShowElem(list1);
    //删除元素
    ListDelete(&list1, 0);
    printf("线性表中元素个数:%d\n", ListElemNum(list1));
    ListDelete(&list1, 1);
    printf("线性表中元素个数:%d\n", ListElemNum(list1));
    ListDelete(&list1, 1);
    printf("线性表中元素个数:%d\n", ListElemNum(list1));
    ListDelete(&list1, 0);
    printf("线性表中元素个数:%d\n", ListElemNum(list1));
    //显示线性表中元素
    ShowElem(list1);
    //释放线性表中存储元素的空间
    free(list1.elem);

    return 0;
}
  • 执行结果
    这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_40579095/article/details/82190804