数据结构-线性表(顺序表c语言实现)
线性表
线性表(list)是一种常用的数据结构。一个线性表是n个数据元素(元素没有具体的含义,可以是符号、数字、一页书也可以是其他的复杂类型)的有限序列,这些元素之间存在着一种特定的逻辑关系:一个元素有唯一前驱和唯一后继(除了第一个元素和最后一个元素)。举例:数组。
线性表的实现有两种实现方式:顺序存储实现和链式存储链式实现
顺序存储的表示与操作实现
一、顺序存储理解:
计算机内存中开辟一串物理地址连续的内存单元,然后把数据元素依次存入到这些内存单元中以此构成一个顺序表
那计算机是怎么计算每个元素的存储位置的?
假设每个数据元素占a个存储单元,计算机在内存中开辟的内存首地址为L0=0,并以它作为第一个数据元素的地址,则第i个元素的地址为满足:Li=L(i-1)+a关系式子,那么知道第一个元素的地址L0、每个元素占几个单元(a个),则第i个元素也可也表示为:Li=L1+(i-1)*a(注:第一个元素的地址对应下标为0,为了方便理解第一个元素的地址就用L1表示,即L1=L0)
二、操作实现
对于顺序表的数据元素主要操作有:访问、插入、删除,其他操作有:初始化、销毁、清空、获取元素个数、判断顺序表是否为空等。
注:为了方便书写使形参指向即将要传入的实参-顺序表,指向同一个地址,采用c++里的引用 & ,即在方法中修改了顺序表L的内容也就修改类外部顺序表的内容,当然也可以使用c来实现即使用指针的指针(二级指针)变量。但凡涉及修改实参内容的一律使用这种引用方式
1、初始化顺序表
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW 0
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int Status;
typedef char ElemType;
typedef struct{ //定义顺序表结构体
ElemType *elem;//字符类型的指针,后面指向字符数组
int length; //顺序表的元素个数
int listsize; //顺序表初始化长度
} SqList;
/*
顺序表初始化
注:为了方便书写使形参指向即将要传入的实参-顺序表(未初始化),指向同一个地址,采用c++里的引用 & ,即在方法中修改了顺序表L的内容也就修改类外部顺序表的内容,当然也可以使用c来实现--->使用指针的指针(二级指针)变量
*/
Status InitList_Sq(SqList &L){
//构造一个空的线性表
L,elem=(ElemType *)malloc(LISTINCREMENT*sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);//内存不足,返回0给操作系统,程序结束
L.length=0;
L.listsize=LISTINCREMENT;
return OK;
}
2、清空线性表
不需要清空每个顺序表中的每个元素,只需要设置元素的个数为0,在取元素的时候判断一下给的下标索引是否小于length即可。
/*清空线性表L*/
void ClearList(SqList &L){
L.length = 0;
}
3、获取顺序表元素的个数(对于不需要改变原顺序表的操作使用指针即可)
int GetLength(SqList *L){
return L->length;
}
4、判断顺序表是否为空(空就返回1,否则返回0)
Status IsEmpty(SqList *L){
if(L->length == 0)return TRUE;
else return FALSE;
}
5、销毁顺序表
void DestroyList(SqList &L){
if(L.elem){
free(L.elem)
L.elem = NULL;
}
}
6、获取指定位置的元素( i 表示第i个元素)
ElemType GetElem(SqList *L,int i){
if(<1||i>L->length) return ERROR;//判断传入的索引i是否合法
return L->elem[i-1];
}
7、查找指定元素相同的元素位置(返回的索引表示第几个元素)
int LocateElem(SqList *L,ElemType e){
int i;
for(i=0;i<L->length;i++)
if(L->elem[i]==e) return i+1;
return -1;
}
8、插入第 i 个元素 (e用作保存被删除的元素)
Status ListInsert_Sq(SqList &L,int i,ElemType &e){
if(i<1||i>L.length+1) return ERROR;
if(L.length>=L.listsize) return ERROR
int j;
for(j=L.length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j];
L.elem[i-1]=e;
L.length++;
return OK;
}
9、删除第 i 个元素
Status ListDelete_Sq(SqList &L,int i){
if(i<1||i>L.length) return ERROR;
int j;
for(j=i;j>=L.length-1;j++)
L.elem[j-1]=L.elem[j];
L.length--;
return OK;
}