线性表

                                          线性表

线性表是最常用而且最简单的一种书局结构,简言之,一个线性表是n个数据元素的有限序数。

线性结构的特点:

  1.       存在唯一一个被称作“第一个”的数据元素;

  2.       存在唯一一个被称作“最后一个”的数据元素;

  3.       除第一个之外,集合中的每个数据元素均只有一个前驱;

  4.       除最后一个之外,集合中的每个数据元素均只有一个后继;


                             线性表的顺序表示和实现

线性表的顺序表示

是用一组地址连续的存储单元依次存储线性表的数据元素。

 

比如线性表(1,2,3,4,5),共计5个元素,每个int型的数据元素假设占用4个存储单元,假设第1个元素数字1的存储地址是1000,则第2个元素数字2的存储地址是1004,第3个元 素数字3的存储地址是1008,依此类推,第n个数据元素的存储地址是                                                                             LOC(an) = LOC(a1)+(n-1)k.

k表示每个数据元素占用的存储单元的长度

显而易见,这种存储结构,相邻元素在物理位置上也相邻。通常,我们把采用这种存储结构的线性表称为“顺序表”

 

线性表的顺序实现

由于高级程序设计语言中的数据数组类型也有随机存取的可读性,因此通常都用数组来描述数据结构中的顺序存储结构。在此,由于由于线性表的长度可变,而且所需的最大存储空间随文体不同而不同,则在c语言中可用动态分配的一维数组,如下描述啊;

--------------------------------------线性表的动态分配顺序存储结构--------------------------------------

#define InitSize  100     //线性表的存储空间的初始分配量

typedef  struct  SeqList

{

         int            *array;                     //存储空间基址
                    int            capacity;                 //存储容量
                    int            size;                       //当前长度

}

----------------------------------------------------------------------------------------------------------------------------

在上述的定义之中,数组指针array指示线性表的基地址,size,表示线性表的当前长度,线性表的初始化操作就是为线性表分配一个预定义大小的数组空间,并将当前的线性表的长度置为0.

--------------------------------------线性表的动态分配顺序初始化-------------------------------------

void SeqListDInit(SeqListD *pSLD)
{
    assert(pSLD != NULL);
    pSLD->capacity = CAPACITY;
    pSLD->size = 0;                                                                                             //线性表的长度置为0.
    pSLD->array = (DataType *)malloc(pSLD->capacity * sizeof(DataType));   //分配一个预定义大小的数组空间
    assert(pSLD->array != NULL);
}

----------------------------------------------------------------------------------------------------------------------------

动态线性表代码如下:

#pragma once

#include <stdlib.h>
#include <assert.h>
#include <stdio.h>



typedef int DataType;

typedef struct SeqListDynamic {
	DataType	*array;
	int			capacity;
	int			size;
}SeqListD;


#define	CAPACITY	2

// 动态顺序表的初始化
void SeqListDInit(SeqListD *pSLD)
{
	assert(pSLD != NULL);
	pSLD->capacity = CAPACITY;
	pSLD->size = 0;
	pSLD->array = (DataType *)malloc(pSLD->capacity * sizeof(DataType));
	assert(pSLD->array != NULL);
}
// 销毁
void SeqListDDestory(SeqListD *pSLD)
{
	assert(pSLD != NULL);
	pSLD->size=0;
	free(pSLD->array);
	pSLD->capacity=0;

}
	// 肯定不够
	// 1. 容量变大
	// 2. 开个新容量的空间
	// 3. 把老数据迁移到新空间
	// 4. 把老空间释放
	// 5. 把新的空间挂过来
void ExpandSeqListD(SeqListD *pSLD)
{
	
		if (pSLD->size < pSLD->capacity) {
		return;
	}
	
	//1
	pSLD->capacity=pSLD->capacity*2;
	//2
	DataType *newarray=(DataType*)malloc(sizeof(DataType)*pSLD->capacity);
	assert(newarray != NULL);

	//3

	int i;
	for(i=0;i<pSLD->size;i++)
	{
       newarray[i]=pSLD->array[i];

	}
    //4
	free(pSLD->array);

	//5

	pSLD->array=newarray;

}
void  SeqListDPushBack(SeqListD *pSLD, DataType data)
{
	assert(pSLD !=NULL);
    ExpandSeqListD(pSLD);
	pSLD->array[pSLD->size++]=data;
} 

// 头插
void SeqListDPushFront(SeqListD *pSLD, DataType data)
{
	assert(pSLD != NULL);
	ExpandSeqListD(pSLD);

	// 剩下的和静态的一样
}
// 按下标插入
void SeqListDPushInsert(SeqListD *pSLD, int pos, DataType data)
{
	assert(pSLD != NULL);
	ExpandSeqListD(pSLD);

	// 剩下的和静态的一样
}
void SeqListDPrint(SeqListD *pSLD)

{
  int i;
  for(i=0;i<pSLD->size;i++)
  {
	  printf("%d->",pSLD->array[i]);
  }
  printf("\n");



}
void  TestSeqListD()
{
  SeqListD sl;

  SeqListDInit(&sl);

  SeqListDPushBack(&sl,1);
  SeqListDPushBack(&sl,2);
  SeqListDPushBack(&sl,4);
  SeqListDPushBack(&sl,5);
  SeqListDPushBack(&sl,8);

  SeqListDPrint(&sl);
}
#include "list.h"

int main()
{
TestSeqListD();
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值