数据结构 三、线性表

一、定义

零个或多个数据元素的有限序列

在较复杂的线性表中,一个数据元素可以由诺干个数据项组成

二、线性表的顺序存储结构

定义:是指用一段地址连续的存储单元一次存储线性表的数据元素

结构代码

#define ListSize 100      //线性表的最大长度
typedef int DataType;

typedef struct
{
    DataType data[ListSize];   //用数组存储线性表中的元素
    DataType length;           //顺序表中元素的个数
}SeqList;

DataType是数据元素类型,可以根据需要定义,可以使用SeqList定义数据表类型变量

数组长度与线性表长度区别:

数组长度是存放线性表的存储空间的长度
线性表的长度是线性表中数据元素的个数

顺序表的基本操作:

**(1)**按序号查找(用e返回L中第i个数据元素的值):

#define ok 1
#define error 0
typedef int status;
status getelem(sqlist L,int i,elemtype *e)
{
		if (L->length < 1 || (L->length > LengthList(L)))
    {
        return error;
    }
	
	*e=L.data[i-1];
}

**(2)**插入操作(在L中第i个位置之前插入新的数据元素e,L的长度+1)
在这里插入图片描述

status InsList(PSeqList L, int i, DataType e)
{
    int k;
    
    //判断插入位置是否合法
    if (i < 1 || L->length >(LengthList(L) + 1))
    {
        printf("插入位置不合法!\n");
        return error;
    }
    //判断顺序表是否已满
    else if (L->length >= ListSize)
    {
        printf("顺序表已满,不能插入!\n");
        return error;
    }
    else
    {
        for (k = i; k <= L->length; k--)
        {
            L->data[k + 1] = L->data[k];
        }
        L->data[i - 1] = e;//将新元素插入
        L->length++;   //数据表的长度加1
        return ok;
    }
    return 0;
}

**(2)**删除操作
在这里插入图片描述

status DelList(PSeqList L, DataType i, DataType* e)
{
	int k;

    if (L->length < 1)
    {
        printf("表为空!\n");
        return  error;
    }
    *e = L->data[i - 1];
    for (k = i; k < L->length; k++)
    {
        L->data[k - 1] = L->data[k];
    }
    L->length--;
    return *e;
}

优点:
无需为表中元素之间的逻辑关系增加额外的存储空间,可以快速存取表中任一位置的元素
缺点:
插入和删除操作需要移动大量元素,当线性表长度变化较大时,难以确定存储空间的容量,造成存储空间碎片

三、线性表的链式存储结构

分类:单链表,双向链表,循环链表
定义:对数据元素a来说,除了存储其本身的信息之外,还需要存储一个指示其直接后继的信息(其中存储数据的为数据域,存储直接后继位置称为指针域)
注意:要注意区分头指针和头结点之间的区别
结构代码描述:

typedef struct node
{
	elemtype data;
	struct node *next;
}

链表的基本操作:

**(1)**读取(用e返回l中第i个数据元素的值)

status getelem(linklist l,int i,elemtype *e)
{
	int j;
	linklist p;
	p=l ->next;
	j=1;
	while(p&&j<i)
	{
		p=p->next;
		++j;
	}
	if(!p||j>i)
	return error;
	*e=p>data;
	return ok;
}

**(2)**插入(在l中第i个位置之前插入新的数据元素e,l的长度加1)
在这里插入图片描述

statues listinsert(linklist *l,int i,elemtype e)
{
	int j;
	linklist p,s;
	p=*l;
	j=1;
	while(p&&j<i)
	{
		p=p->next;
		++j;
	}
	if(p||j>i)
	{
		return error;
	}
	//生成新节点
	s=(linklist)malloc(sizeof(node));
	.
	s->data=e;
	s->next=p->next;
	p->next=s;
	return ok;
}

**(3)**删除(删除l的第i个数据元素,并用e返回其值,l的长度-1)

status listdelete(linklist *l,int i,elemtype *e)
{
	int j;
	linklist p,q;
	p=*l;
	j=1;
	while(p->&&j<i)
	{
		p=p->next;
		++j;
	}
	if(!(p->next)||j>i)
	retuen 0;
	q=p->next;
	p->next=q->next
	*e=q->data;
	free(q);
	return ok;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值