c语言-线性顺序表

线性顺序表(1)

线性表

1.1什么是线性表以及顺序表?

线性表是包含若干元素的一个线性序列

例如:L=(a0、a1、…、ai-1、ai+1、…an)

L表名,ai(0<=i<=n)

n为表长,n>0时,线性表L为非空表,n=0时线性表为空表.

二元组形式为

L=(D,R)

大概来说线性表L包含数据元素集合D和关系R

D={ai| ai&datatype,i=0,1,2,…,n>=0}

R={<ai , ai+1>|ai , a+1&D , 0 <=i<=n-2}

<ai,ai+1>表示有序对表示相邻两个元素之间的一种先后次序,ai是ai+1的直接前驱,ai+1是ai的直接后继。

例如:有一个顺序表L={1,2,3,4,5,6};他们的关系为

1 - 2 - 3 - 4 - 5 -6

使用二元组表述L=(D,R)为

D={1,2,3,4,5,6}(n=6)

R={<12>、<23>、<34>、<45>、<56>}

可发现表表头1无前驱,表尾6无后继,其余每个元素仅有1个前驱和1个后继

1.2顺序存储结构表示

若将线性表L=(a0,a1,…,an-1)存储与计算机一片连续的存储空间内,假设Loc(ai)为ai的地址,Loc(a0)=b 则每个占d个单元的的元素表示为

Loc(ai)= b+i*d

1.3顺序存储的特征

优点

逻辑相邻的元素ai,ai+1存储位置也相邻

对于元素ai的存储为随机存储或按照地址存取(查找方便)

存储密度高,存储密度D=(数据结构中元素所占存储空间)/(整个数据空间)(使用率高)

缺点

对表的插入和删除等运算的时间复杂度较差

1.4顺序存储结构表示(简称顺序表)

在c语言中,可借助一维数组类型来描述线性表的顺序存储结构

例如

#define N 100
typedef int data_t;
typedef struct
{
    data_t data[N];//表的存储空间
    int last;
}sqlist,*sqlink;

顺序表的实现

线性表的基本运算

例:

设线性表L=(a0、a1、…、an-1)

(1)建立一个空表:list_create(L)

(2)置空表:list_clear(L)

(3)判断表是否为空:list_empty(L)。若表为空,返回值为1,否则返回值为0。

(4)求表长:length(L)

(5)却表中某个元素:GetList(L,i),即ai。0<=i<=length(L)-1

(6)定位运算:Locate(L,x)。确定元素在表中位置(序列号)

当 元素x=ai&L,且ai是第一个与x相等的返回i

当元素x不属于L时返回-1

(7)插入

lnsert(L,x,i),将x插入到表L中第i个元素ai之前,且表长+1。

编程格式

编程分层框架

常见的数据结构由3个文件构成

(1)sqlist.h

/*
typedef int data_t;
#define N 128

struct sqlist_t {
	data_t data[N];
	int last;
};

typedef struct sqlist_t sqlist;//sqlist L; struct sqlist_t L;
typedef struct sqlist_t * sqlink;// struct sqlist_t * p; sqlink p;
*/

typedef int data_t;
#define N 128 

typedef struct {
	data_t data[N];
	int last;
}sqlist, *sqlink;

sqlink list_create();
int list_clear(sqlink L);
int list_delete(sqlink L);
int list_empty(sqlink L);
int list_length(sqlink L);
int list_locate(sqlink L, data_t value);
int list_insert(sqlink L, data_t value, int pos);
int list_show(sqlink L);

提供数据结构的定义,运算,接口

#include <stdio.h>
#include <string.h>
#include "sqlist.h"

sqlink list_create() {
	sqlink L;

	return L;
}

int list_clear(sqlink L) {
	return 0;
}

int list_delete(sqlink L){
	return 0;
}

int list_empty(sqlink L) {
	return 0;
}

int list_length(sqlink L) {
	return 0;
}

int list_locate(sqlink L, data_t value) {

	return 0;
}

int list_insert(sqlink L, data_t value, int pos) {

	return 0;
}
int list_show(sqlink L) {
	return 0;
}


提供函数的实现

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


int main(int argc, const char *argv[])
{
	sqlink L;
	L = list_create();

	return 0;
}


函数的调用

优点:

结构清晰、软件复用性好(自身可直接调用、其他人员可用)、外包项目可用

初学者知识总结欢迎各位大佬补充纠正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值