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;
}