顺序表的实现

      所谓数据结构,就是定义一组有关系的数据以及在这些数据上的操作,也就是ADT(抽象数据类型)。

      包含三个方面;

     ADT List{ 数据对象:  数据关系:基本运算:}

     以顺序表为例,它的顺序存储类型:

typedef struct 
{
	ElemType data[MaxSize];  // <span style="font-family: Arial, Helvetica, sans-serif;">ElemType存放数据类型</span>
	int length; 
}SqList;
     数据对象是一个长度为MaxSize类型为ElemType的数组。一个整形length。

MaxSize,ElemType通过宏定义自己设置。

      数据关系就是,数组表示顺序表的元素,length表示数组长度。

     并定义了几个基本运算:

void CreateList(SqList *&L,ElemType a[],int n);   //创建顺序表并赋值 
void DispList(SqList *L);    //输出顺序表 
void InitSqList(SqList *&L);  //初始化顺序表 
void DestroyList(SqList *&L);  //销毁顺序表 
int ListEmpty(SqList *L);   //推断顺序表是否为空
int ListLength(SqList *L);  //求顺序表长度 
int GetElem(SqList *L,int i,ElemType &e);   //获取第i个元素的值,并赋值给e 
int LocateElem(SqList *L,ElemType e);   //返回等于元素e的元素序号 
int ListInsert(SqList *&L,int i,ElemType e);  //插入元素 
int ListDelete(SqList *&L,int i,ElemType &e);  //删除元素 

最后实现代码例如以下:

#include<stdlib.h>
#include<stdio.h>
#include<iostream>
#define MaxSize 1000
#define ElemType int
#define GET_ARRAY_LEN(array) (sizeof(array)/sizeof(array[0]))


using namespace std;

typedef struct 
{
	ElemType data[MaxSize];
	int length; 
}SqList;


 
void CreateList(SqList *&L,ElemType a[],int n);   //创建顺序表并赋值 
void DispList(SqList *L);    //输出顺序表 
void InitSqList(SqList *&L);  //初始化顺序表 
void DestroyList(SqList *&L);  //销毁顺序表 
int ListEmpty(SqList *L);   //推断顺序表是否为空
int ListLength(SqList *L);  //求顺序表长度 
int GetElem(SqList *L,int i,ElemType &e);   //获取第i个元素的值,并赋值给e 
int LocateElem(SqList *L,ElemType e);   //返回等于元素e的元素序号 
int ListInsert(SqList *&L,int i,ElemType e);  //插入元素 
int ListDelete(SqList *&L,int i,ElemType &e);  //删除元素 


void CreateList(SqList *&L,ElemType a[],int n){
	if(L==NULL)L=(SqList *)malloc(sizeof(SqList));
	for(int i=0;i<n;i++)
		L->data[i]=a[i];
		L->length=n;
}

void DispList(SqList *L){
	if(ListEmpty(L))
		return;
	for(int i=0;i<L->length;i++){
		cout<<L->data[i]<<" ";
	} 
	printf("
");	
}

void InitSqList(SqList *&L){
	L=(SqList *)malloc(sizeof(SqList));
	L->length=0; 
}

void DestroyList(SqList *&L){
	free(L); 
}

int ListEmpty(SqList *L){
	return(L->length==0);
}

int ListLength(SqList *L){
	return(L->length);
}

int GetElem(SqList *L,int i,ElemType &e){
	if(i<1||i>L->length)return -1;
	else{
		e=L->data[i-1];
		return 1;
	}
} 


int LocateElem(SqList *L,ElemType e){
	int i=0;
	while(L->data[i]!=e&&i<L->length)i++;
	if(i==L->length)
	    return -1; 
	else
		return i+1;
} 

int ListInsert(SqList *&L,int i,ElemType e){
	if(i<1||i>L->length+1){
		return -1;
	}
	i--;
	for(int j=L->length;j>i;j--){
		L->data[j]=L->data[j-1];
	}
	L->data[i]=e;
	L->length++;
	return 1;
}

int ListDelete(SqList *&L,int i,ElemType &e){
	if(i<1||i>L->length)return -1;
	i--;
	e=L->data[i];
	for(int j=i;j<L->length-1;j++){
		L->data[j]=L->data[j+1]; 
	} 
	L->length--;
	return 1;
}


int main()
{	
	ElemType e;
	ElemType a[8]={12,35,23,89,1,4,43,24};
	SqList * L=NULL;
	InitSqList(L); 
	CreateList(L,a,GET_ARRAY_LEN(a));
	DispList(L);
	GetElem(L,4,e);
	cout<<e<<endl;
	cout<<LocateElem(L,23)<<endl;
	ListInsert(L,5,34);
	DispList(L);
	ListDelete(L,7,e);
	cout<<e<<endl;
	DispList(L);
	DestroyList(L);
}
能够通过改ElemType换成别的类型的顺序表非常方便。

原文地址:https://www.cnblogs.com/liguangsunls/p/6857770.html