【一】线性表以及线性表的顺序存储结构

1、线性表的定义

  • 线性表( List)是零个或多个数据元素的集合
  • 线性表中的数据元素之间是有顺序的
  • 线性表中的数据元素个数是有限的
  • 线性表中的数据元素的类型必须相同

2、线性表的性质

  • a0为线性表的第一个元素,只有一个后继
  • an为线性表的最后一个元素,只有一个前驱
  • 除a0和an外的其它元素ai,既有前驱,又有后继
  • 线性表能够逐项访问和顺序存取

3、顺序存储结构

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
这里写图片描述

4、插入元素

算法描述:

  • 判断线性表是否合法
  • 判断插入位置是否合法
  • 把最后一个元素到插入位置的元素后移一个位置
  • 将新元素插入
  • 线性表长度加1

操作示意:
这里写图片描述

5、删除元素

算法描述:

  • 判断线性表是否合法
  • 判断删除位置是否合法
  • 将元素取出
  • 将删除位置后的元素分别向前移动一个位置
  • 线性表长度减1

操作示意:
这里写图片描述

6、可复用顺序线性表 代码实例

相关操作的定义

#ifndef _SEQLIST_H_
#define _SEQLIST_H_

#include <stdio.h>

/*
  对外做数据封装,屏蔽线性表的实现
*/
typedef void Seqlist;
typedef void SeqlistNode;

/*
该方法用于创建并且返回一个空的线性表
*/
Seqlist* List_Create(int capacity);

/*
该方法用于销毁一个线性表list
*/
void List_Destroy(Seqlist* list);

/*
该方法用于将一个线性表list中的所有元素清空
使得线性表回到创建时的初始状态
*/
void List_Clear(Seqlist* list);

/*
该方法用于返回一个线性表list中的所有元素个数
*/
int List_Length(Seqlist* list);

/*
该方法用于返回一个线性表list中的最大元素个数
*/
int List_Capacity(Seqlist* list);

/*
该方法用于向一个线性表list的pos位置处插入新元素node
返回值为1表示插入成功,0表示插入失败
*/
int List_Insert(Seqlist* list, SeqlistNode* node, int pos);

/*
该方法用于获取一个线性表list的pos位置处的元素
返回值为pos位置处的元素,NULL表示获取失败
*/
SeqlistNode* List_Get(Seqlist* list, int pos);

/*
该方法用于删除一个线性表list的pos位置处的元素
返回值为被删除的元素,NULL表示删除失败
*/
SeqlistNode* List_Delete(Seqlist* list, int pos);

#endif

相关方法的实现:

#include "seqlist.h"
#include <malloc.h>

/*
  Windows 下和linux下void*的指针长度不一样
*/
#ifdef WIN32
  typedef unsigned int TSeqlistNode;
#else
  typedef unsigned long TSeqlistNode;
#endif

/*
  length          记录线性表的当前元素个数
  capacity        记录线性表的最大元素个数
  TSeqlistNode    该数组用于保存被插入元素的地址值
*/
typedef struct _struct_Seqlist
{
    int length;
    int capacity;
    TSeqlistNode *list;
}TSeqlist;

/*
该方法用于创建并且返回一个空的线性表
*/
Seqlist* List_Create(int capacity)
{
    TSeqlist *tlist = NULL;
    if (capacity > 0)
    {
        tlist = (TSeqlist*)malloc(sizeof(TSeqlist) + sizeof(TSeqlistNode) * capacity);
    }
    if (tlist != NULL)
    {
        tlist->length = 0;
        tlist->capacity = capacity;
        tlist->list = (TSeqlistNode*)(tlist + 1);
    }
    return tlist;
}

/*
该方法用于销毁一个线性表list
*/
void List_Destroy(Seqlist* list)
{
    if (list != NULL)
    {
        free(list);
    }
}

/*
该方法用于将一个线性表list中的所有元素清空
使得线性表回到创建时的初始状态
*/
void List_Clear(Seqlist* list)
{
    TSeqlist *tlist = (TSeqlist*)list;
    if (tlist != NULL)
    {
        tlist->length = 0;
    }
}

/*
该方法用于返回一个线性表list中的所有元素个数
*/
int List_Length(Seqlist* list)
{
    int iret = -1;
    TSeqlist *tlist = (TSeqlist*)list;
    if (tlist != NULL)
    {
        iret = tlist->length;
    }
    return iret;
}

/*
该方法用于返回一个线性表list中的最大元素个数
*/
int List_Capacity(Seqlist* list)
{
    int iret = -1;
    TSeqlist *tlist = (TSeqlist*)list;
    if (tlist != NULL)
    {
        iret = tlist->capacity;
    }
    return iret;
}

/*
该方法用于向一个线性表list的pos位置处插入新元素node
返回值为1表示插入成功,0表示插入失败
*/
int List_Insert(Seqlist* list, SeqlistNode* node, int pos)
{
    int iret = 1;
    TSeqlist *tlist = (TSeqlist*)list;

    iret = (tlist != NULL) && (node != NULL);
    if (iret)
    {
        iret = iret && (pos >= 0 && pos < tlist->capacity);
        iret = iret && (tlist->length < tlist->capacity);
        if (iret)
        {
      //移动元素
            for (int i = tlist->length; i > pos; i--)
            {
                tlist->list[i] = tlist->list[i - 1];
            }
      //插入元素
            tlist->list[pos] = (TSeqlistNode)node;
      //更改元素个数
            tlist->length++;
        }
    }
    return iret;
}

/*
该方法用于获取一个线性表list的pos位置处的元素
返回值为pos位置处的元素,NULL表示获取失败
*/
SeqlistNode* List_Get(Seqlist* list, int pos)
{
    TSeqlistNode *node = NULL;
    TSeqlist *tlist = (TSeqlist*)list;
    if (tlist != NULL)
    {
        if (pos >= 0 && pos < tlist->length)
        {
            node = (TSeqlistNode*)tlist->list[pos];
        }
    }
    return node;
}

/*
该方法用于删除一个线性表list的pos位置处的元素
返回值为被删除的元素,NULL表示删除失败
*/
SeqlistNode* List_Delete(Seqlist* list, int pos)
{
    TSeqlistNode *node = NULL;
    TSeqlist *tlist = (TSeqlist*)list;
    if (tlist != NULL)
    {
        if (pos >= 0 && pos < tlist->length)
        {
      //得到即将被删除的元素
            node = (TSeqlistNode*)tlist->list[pos];
      //移动元素,达到删除元素的目的
            for (int i = pos; i < tlist->length - 1; i++)
            {
                tlist->list[i] = tlist->list[i + 1];
            }
      //更改元素个数
            tlist->length--;
        }
    }
    return node;
}

测试程序:

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

//定义线性表的最大元素个数
#define MAXSIZE 5

/*
  该函数用于输出线性表中的所有元素
*/
void printlist(Seqlist *list)
{
    if (List_Length(list) <= 0)
    {
        printf("list is empty!\n");
        return;
    }
    for (int i = 0; i < List_Length(list); i++)
    {
        printf("%d\t", *((int*)List_Get(list, i)));
    }
    printf("\n");
}


int main()
{
  //创建新线性表
    Seqlist *list = List_Create(MAXSIZE);

    int i = 10, j = 5, m = 2, x = 6, p = 8, z = 100;

  //插入一下新的元素
    List_Insert(list, &i, 0);
    List_Insert(list, &j, 0);
    List_Insert(list, &m, 0);
    List_Insert(list, &x, 0);
    List_Insert(list, &p, 0);
    List_Insert(list, &z, 0); //不会插入此元素
    printlist(list);

    //删除已有元素
    SeqlistNode *temp = List_Delete(list, 3);
  printf("被删除的元素为:%d\n",*((int*)temp));
    printlist(list);

    //插入元素
    List_Insert(list, &j, 3);
    printlist(list);

    //清空线性表
    List_Clear(list);
    printlist(list);

    //销毁线性表
    List_Destroy(list);
    list = NULL;
  printf("线性表已销毁!\n");

    return 0;
}

7、源码下载

文件名:seqlist-1.0.tar.gz
链接: http://pan.baidu.com/s/1c0fQ61U 密码: a8cu

编译步骤:
0.1 解压缩:tar -zxvf seqlist-1.0.tar.gz
0.2 进入目录:./configure
0.3 生成Seqlist:make
0.4 运行程序:./Seqlist

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值