数据结构之线性表

线性表是具有相同特性的数据元素的一个有限序列。该序列中所含元素的个数叫做线性表的长度,用n表示,n≥0。

 当n=0时,表示线性表是一个空表,即表中不包含任何元素。设序列中第i(i表示位序)个元素为ai(1≤i≤n)。
线性表的一般表示为:
(a1,a2,…ai,ai+1,…,an)

#include <stdio.h>
#include <malloc.h>
#define MaxSize 50
typedef char ElemType;
//定义线性表
typedef struct {
ElemType data[MaxSize];
int length;
} SqList;
/*
 *void initList(SqList *L)不行吗 ?
*当然也可以,但是此时你需要把L return出去。即SpList* initList(void),如果你用void initList(SqList *L)这种形
*式L只是接受了实参的一个副本。你对L做了修改外面的实参是不会改变的。
*由于是按值传递,那么只是函数里的局部变量L分配了空间,而全局变量L还是NULL,此时你*如果L->...,程序就崩溃了。
*而加上&,L就是实参,对L修改就是对实参修改。
*
*/
void InitList(SqList *&L) //初始化线性表,指针引用
{
L=(SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间
if(L == NULL)
    exit(0);//分配失败则退出
L->length=0; //置空线性表长度为0
}
void DestroyList(SqList *L) //销毁线性表
{
free(L);
L = NULL;//防止L成为野指针
}
bool 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");
}
bool GetElem(SqList *L,int i,ElemType &e) //求线性表中某个数据元素值
{
if (i<1 || i>L->length)
return false; //参数错误时返回false
e=L->data[i-1]; //取元素值
return true; //成功找到元素时返回true
}
int LocateElem(SqList *L, ElemType e) //按元素值查找
{
int i=0;
while (i<L->length && L->data[i]!=e)
i++; //查找元素e
if (i>=L->length) //未找到时返回0
return 0;
else return i+1; //找到后返回其逻辑序号
}
bool ListInsert(SqList *&L,int i,ElemType e) //插入数据元素
{
int j;
if (i<1 || i>L->length+1)
return false; //参数错误时返回false
i--; //将顺序表逻辑序号转化为物理序号
for (j=L->length;j>i;j--) //将data[i]及后面元素后移一个位置
L->data[j]=L->data[j-1];
L->data[i]=e; //插入元素e
L->length++; //顺序表长度增1
return true; //成功插入返回true
}
bool ListDelete(SqList *&L,int i,ElemType &e) //删除数据元素
{
int j;
if (i<1 || i>L->length) //参数错误时返回false
return false;
i--; //将顺序表逻辑序号转化为物理序号
e=L->data[i];
for (j=i;j<L->length-1;j++) //将data[i]之后的元素前移一个位置
L->data[j]=L->data[j+1];
L->length--; //顺序表长度减1
return true; //成功删除返回true
}
void main()
{
SqList *L;
ElemType e;
printf("顺序表的基本运算如下:\n");
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);
printf(" (4)顺序表L长度=%d\n",ListLength(L));
printf(" (5)顺序表L为%s\n",(ListEmpty(L)?"空":"非空"));
GetElem(L,3,e);
printf(" (6)顺序表L的第3个元素=%c\n",e);
printf(" (7)元素a的位置=%d\n",LocateElem(L,'a'));
printf(" (8)在第4个元素位置上插入f元素\n");
ListInsert(L,4,'f');
printf(" (9)输出顺序表L:");
DispList(L);
printf(" (10)删除L的第3个元素\n");
ListDelete(L,3,e);
printf(" (11)输出顺序表L:");
DispList(L);
printf(" (12)释放顺序表L\n");
DestroyList(L);
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值