线性表

本文详细介绍了线性表的抽象数据类型(ADT),包括顺序存储结构和链式存储结构。顺序存储使用数组实现,适用于小线性表,但插入删除操作效率低。链式存储通过指针连接元素,解决了插入删除效率问题,但检索效率较低。文中还讨论了链表的基本概念,头指针、头结点和首元结点的区别,并提供了线性表链式实现的简介。
摘要由CSDN通过智能技术生成

线性表ADT定义如下:

ADT 线性表 (List) Data Operation
void initList(L); //创建并初始化一个空线性表,如果成功返回true,修改表传指针
bool listEmpty(L); //判断一个线性表是否为空,不修改表传值
void clearList(
L); //清空一个线性表,成功返回true
bool getElem(L,i,e); //从某个位置取出元素并赋值给e(i的范围是[1,L.length]),修改e的值所以传递一个指针,成功返回true
int locateElem(L,e); //查找线性表中是否有e,如果有返回它的位置(从1开始),否则返回0表示失败
bool listInsert(
L,i,e); //插入一个元素e在第i个元素之前(i的取值范围是[1,L.length+1]) ,成功返回true
bool listDelete(L,i,e); //删除在第i个位置上的元素(i的取值范围是[1,L.length]),删除的元素赋给e,成功返回true
int listLength(L); //返回线性表的元素个数
endADT

线性表有多种如下图: Alt text

顺序存储结构

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

根据线性表的特性,我们会想到用数组来实现它,直接上代码吧,这个多说无意,最好自己去实现一遍。

注意:你会发现函数中的参数虽然都是链表,但有的传得是指针,有的传的是链表本身,会发生这种情况取决于,c语言是按值传递。

  • 当参数是L时,传到函数里面的并不是链表本身,而是他的一个复制品,所以这样会导致你无法修改链表
  • 当参数是*L时,则传到函数里面的是链表的地址,此时就可以通过地址来修改链表。
#include<stdio.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20  /* 存储空间初始配量 */
typedef int ElemType ; //可以自定义,这里假设为int
typedef int Status ; //Status是函数的类型,其值是函数结果状态码

typedef struct 
{
    
    ElemType data[MAXSIZE] ;
    int length ;
}SqList;

/* Operation */
/* 当需要修改表的时候传入的参数是*L,查看的时候函数参数为L,因为c是按值传递,不传指针则无法修改原本的链表 */
void InitList(SqList *L) ;
bool ListEmpty(SqList L) ;
void ClearList(SqList *L) ;
bool GetElem(SqList L,int i,ElemType *e) ;
int LocateElem(SqList L,ElemType e) ;
bool ListInsert(SqList *L,int i,ElemType e) ;
bool ListDelete(SqList *L,int i,ElemType *e) ;
void ListPrint(SqList L) ;

main()
{
    
    SqList L ;
    InitList(&L) ;
    if(ListEmpty(L))
        printf("empty") ;
    ListInsert(&L,1,1) ;

    int i ;
    GetElem(L,1,&i) ;
    printf("%d",i) ;
    printf("%d",LocateElem(L,1)) ;

    ListPrint(L) ;
    ListDelete(&L,1,&i) ;
    ListPrint(L) ;
}

/* 初始化顺序线性表 */
void InitList(SqList *L)
{
    
    L->length = 0 ;
}

bool ListEmpty(SqList L)
{
    
    return L.length==0 ;
}

void ClearList(SqList *
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值