【数据结构】顺序表实验

一、顺序线性表

1、掌握顺序表中元素的前驱、后续的概念。
2、掌握顺序表的建立、插入元素、删除表中某元素的操作。
3、对顺序表相应算法的时间复杂度进行分析
4、理解链表数据结构的特点(优缺点)。

线性表:零个或多个数据元素的有限序列。

1、掌握顺序表中元素的前驱、后续的概念。

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
顺序表的前驱与后继指的是当前元素前一个元素与后一个元素分别是什么。如图所示,a[i-1]与a[i+1]分别是a[i]的前驱与后继。
在这里插入图片描述

2、掌握顺序表的建立、插入元素、删除表中某元素的操作。


//测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 100 	 // 线性表存储空间的初始分配量 
#define LISTINCREMENT  10 	 // 线性表存储空间的分配增量
typedef char ElemType;	
typedef int Status; 

// SqList结构定义如下:
typedef char ElemType;	
typedef int Status; 
typedef struct 
{
   ElemType  *elem;  // 存储空间基址 
   int   length;	 // 当前长度
   int   listsize;	 // 当前分配的存储容量(以sizeof(ElemType)为单位)
} SqList;

// 初始化:创建一个空的线性表L; 
Status InitList_Sq(SqList &L)
{
	L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(!L.elem)exit(OVERFLOW);
	L.length = 0;
	L.listsize=LIST_INIT_SIZE;
	return OK;
}
// 插入:线性表L中第i个位置之前插入新的元素e
Status ListInsert_Sq(SqList &L, int i, ElemType e)
{
	ElemType *newbase,*p,*q;
	if(i<1||i>L.length+1)return ERROR;
	if(L.length>=L.listsize)
	{
		newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
		if(!newbase)
		return OVERFLOW;
		L.listsize +=LISTINCREMENT;
	}
	q = &(L.elem[i-1]);
	for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;
	
	*q=e;
	++L.length;
	return OK;
}
// 删除:在顺序表L中删除第i个元素,并用e返回其值
Status ListDelete_Sq(SqList &L,int i, ElemType &e)
{
	ElemType *p,*q;
	if((i<1)||(i>L.length))return ERROR;
	p = &(L.elem[i-1]);
	e = *p;
	q = L.elem+L.length-1;
	for(++p;p<=q;++p)*(p-1)=*p;
	--L.length;
	return OK;
}
// 销毁顺序表操作:销毁成功,返回OK。
Status DestroyList(SqList &L){
	free(L.elem);
	L.elem=NULL;
	L.length=0;
	L.listsize=0;
}
// 判断顺序表是否是空表:如果顺序表为空,返回1,否则,返回0。
Status ListEmpty(SqList L){
		if(L.length=0)
		return OK;
		else
		return ERROR;
}


int	main()
{
	char A[5] = {'a','b','c','d','e'},temp='f';
	//temp用来存放插入的字符以及保存删除字符的值 
	int	i;
	
	SqList	List;	
	InitList_Sq(List);
	
	for(i=1; i<=5; i++)
		ListInsert_Sq(List,i,A[i-1]);
		
	if(!ListEmpty(List)) 
		cout<<"顺序表非空\n";
		
	cout<<"开始时元素序列为:\n";
	for(i=1; i<= List.length; i++)
		cout<< List.elem[i-1];	
			
	i=4;   //插入位置 
	ListInsert_Sq(List,i,temp);
	cout<<"\n插入后的元素序列为:\n";
	for(i=1; i<= List.length; i++)
		cout<<List.elem[i-1];	

    i=3;
	ListDelete_Sq(List,i,temp) ;
	cout<<"\n删除后的元素序列为:\n";
	for(i=1; i<= List.length; i++)
		cout<< List.elem[i-1];
	
	if(DestroyList(List)) 
	cout<<"\n成功释放顺序表L"; }

在这里插入图片描述

3、对顺序表相应算法的时间复杂度进行分析*

****线性表的顺序存储结构中存、读数据时,不管是在哪个位置,时间复杂度都是O(1);
插入或删除时,时间复杂度都是O(n)

4、理解链表数据结构的特点(优缺点)。

优点:
(1)无须为表示表中元素之间的逻辑关系而增加额外的空间;
(2)可以快速地读取表中任一位置的元素。

缺点:
(1)插入和删除操作需要移动大量的元素;
(2)当线性表长度变化较大时,难以确定存储空间的容量 ;
(3)造成存储空间的“碎片”

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值