考研数据结构(线性表-顺序表)

2.2线性表的顺序表示

2.21相关基础知识

线性表的顺序存储是用一组地址连续的存储单元
顺序表需要的三个部分:
(1)存储空间的起始位置
(2)顺序表最大存储容量
(3)顺序表当前的长度
引用与指针的关系:
1,引用存储的是值,而指针是一个变量的拷贝,存储变量的地址。
(1)如int **p1,swap(int ** p),调用swap(p1),实际上是将p1(实参)地址复制给p(形参),
即p1(实参)的拷贝,*p指向指针的指针变量。
(2)如int *p1,swqp(int *&p),调用swap(p1),就是为实参p1(指针变量)起了个别名p(形参),
p(形参)与p1(实参)指向同一个内存地址。
2,引用不需要判空,因为引用本身就代表这个变量或对象已经存在,
而指针需要判断是否为空。
3,引用不占用内存空间,而指针需要分配内存空间。
#include<stdio.h>
#include<malloc.h>

2.22顺序表的静态创建及其相关操作
#define MAXSIZE 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
/*
引用与指针的关系:
1,引用存储的是值,而指针是一个变量的拷贝,存储变量的地址。
(1)如int **p1,swap(int ** p),调用swap(p1),实际上是将p1(实参)地址复制给p(形参),
即p1(实参)的拷贝,*p指向指针的指针变量。
(2)如int *p1,swqp(int *&p),调用swap(p1),就是为实参p1(指针变量)起了个别名p(形参),
p(形参)与p1(实参)指向同一个内存地址。 
2,引用不需要判空,因为引用本身就代表这个变量或对象已经存在,
而指针需要判断是否为空。
3,引用不占用内存空间,而指针需要分配内存空间。 

*/ 
typedef char ElemType;
typedef struct 
{
	ElemType data[MAXSIZE];//线性表的最大容量 
	int length;//线性表的实际长度 
}SqList;

//初始化线性表,长度设置为0 
void InitList(SqList *&L)         
 {
	L=(SqList *)malloc(sizeof(SqList));
	L->length=0;
 }
 
 //获取线性表中位置为i的元素 
int GetElem(SqList *L,int i,ElemType &e)
{
	if(L->length==0 || i<1 || i>L->length)
	  return ERROR;
	  e=L->data[i-1];
	  return OK;
}

 //销毁线性表,即释放线性表所占用的内存空间
void DestroyList(SqList *L)       
 {
	free(L);
 }
 
 //判断线性表是否为空 即看其长度是否为0
 int ListEmpty(SqList *L)           
 {
	return(L->length==0);
 } 
 
 //求线性表的长度
 int ListLength(SqList *L)          
 {
	return(L->length);
 }
 
 //输出线性表 
void DispList(SqList *L)            
 {
	int i;
	if (ListEmpty(L)) return;
	for (i=0;i<L->length;i++)
		printf("%c",L->data[i]);
	printf("\n");
 }
 
 //按元素查找,找到与该元素值相同的元素并返回其序号
 int LocateElem(SqList *L, ElemType e)//这里的L是实参的复制,不能改变实参的内容。 
 {
	int i=0;
	while (i<L->length && L->data[i]!=e) i++;
	if (i>=L->length)
		return 0;
	else
		return i+1;
 }
 
 //*&L相当于传入的实参本身,对形参L的操作就是对实参的操作,可以改变实参的内容。
int ListInsert(SqList *&L,int i,ElemType e) 
{
	int k;
	if(L->length==MAXSIZE)
	return ERROR;
	if(i<1 || i>L->length+1)
	return ERROR;
	if(i<=L->length){
		for(k=L->length-1;k>=i-1;k--)
		{
			L->data[k+1]=L->data[k];
		}
	}
	L->data[i-1]=e;
	L->length++;
	return OK;
 } 
 
 //删除指定位置i的元素 
 int ListDelete(SqList *&L,int i,ElemType &e){
 	int k;
 	if(L->length==0){//判断是否为空表 
 		return ERROR;
	 }
	 if(i<1||i>L->length+1){//判断删除的位置是否有效 
	 	return ERROR;
	 }
	 e=L->data[i-1];
	 if(i<L->length){
	 	for(k=i;k<L->length;k++){
	 		L->data[k-1]=L->data[k];
		 }
	 }
	 L->length--;
	 return OK;
 }
 int main(void){
 	SqList *L;
 	ElemType e;
 	printf("(1)初始化顺序表L\n");
	InitList(L);
 	printf("(2)依次采用尾插法插入a,b,c,d,e元素\n");
	ListInsert(L,1,'a');
	ListInsert(L,2,'b');
	ListInsert(L,3,'c');
	ListInsert(L,4,'d');
	ListInsert(L,5,'e');
	printf("(3)输出顺序表L:");
	DispList(L);
	GetElem(L,3,e);
	printf("(4)顺序表中第3个元素=%c\n",e);
	ListDelete(L,3,e);
	printf("(5)删除表中第三个元素:%c\n",e);
	DispList(L);
	printf("(6)查找元素c在表中的位置:%d\n",LocateElem(L,'d'));
      return 0;
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值