线性表的顺序表示和实现

一.线性表的顺序表示的概念:用一组地址连续的存储单元依次存储线性表的数据元素。

1.线性表中的第i+1个元素的存储位置LOC(a[i+1]) 与第i个元素的存储位置LOC(a[i])之间的关系为:

LOC(a[i+1]) = LOC(a[i])+n;

n表示每个元素元素占用n个存储单元。

二.线性表的基本操作

1.线性表的动态分配顺序存储结构

#include<stdio.h>
#include<stdlib.h>

#define LIST_SIZE 20    //初始容量20
#define INCREAMENT 10//每次扩容10
#define ERROR 0
#define OK 1
typedef int elemType;
typedef int Status;

  

typedef struct{
	elemType *elems; //存储空间基址 
	int length;		//当前元素个数 
	int listsize;	//总容量 
}SqList;

2.初始化线性表

//构造一个空的顺序表 
Status initList(SqList &L){
	L.elems = (elemType *)malloc(LIST_SIZE*sizeof(elemType));
	if(!L.elems)
		return ERROR;//存储分配失败 
	L.length=0;    //长度为0
	L.listsize=LIST_SIZE;//容量为初始容量
	return OK;
}    

3.插入元素

需将插入位置之后的元素依次后移一个位置。

//在index位置插入元素e 
Status insert(SqList &L,int index,int e){
	if(index<1||index>L.length+1)
		return ERROR;//插入位置不合法 
	if(L.length==L.listsize){
		elemType *newbase = (elemType*)realloc(L.elems,(L.listsize+INCREAMENT)*sizeof(elemType));
		if(!newbase)
			return ERROR;
		L.elems=newbase;
		L.listsize = L.listsize+INCREAMENT;
	}
	elemType* loc = &(L.elems[index-1]);	//要插入的位置 
	
	for(int i=L.length-1;i>=index-1;i--){
		L.elems[i+1]=L.elems[i];
	}
	/*
		与上面效果相同 
	for(int *p=&(L.elems[L.length-1]);p>=loc;p--){
		*(p+1)=*p;		
	}*/
	
	*loc = e;
	L.length++;
	return OK;
}

//在末尾插入元素e 
Status add(SqList &L,elemType e){
	return insert(L,L.length+1,e);
}

4.删除元素

需将删除位置之后的元素依次向前移动一个位置。

//删除index位置的值并返回 
elemType del(SqList &L,int index){
	if(index<1||index>L.length)
		return NULL;	//删除位置不合法
	elemType *p = &(L.elems[index-1]);
	elemType e = *p;
	for(p;p<=&(L.elems[L.length-1]);p++)
		*p=*(p+1);
	L.length--;
	return e;
}

5.查找、打印

//寻找元素e的位置 
int locate(SqList &L,elemType e){
	for(int i=0;i<L.length;i++){
		if(L.elems[i]==e)
			return i+1; //返回索引值+1 
	}
	return 0;//未找到 
}
//打印顺序表 
void print(SqList &L){
	for(int i=0;i<L.length;i++)
		printf("%d ",L.elems[i]);
	printf("\n");
	
}

6.其他

//将两个有序顺序表合并为一个有序的顺序表 
void merge(SqList A,SqList B,SqList &C){
	int a=0,b=0,k=0;
	int len = A.length+B.length;
	if(len>C.listsize){
		elemType *newbase = (elemType *)realloc(C.elems,len*sizeof(elemType));
		C.elems=newbase; 
		C.listsize=len;
	}
	C.length=len;
	while(a<A.length&&b<B.length){
		if(A.elems[a]<=B.elems[b]){
			C.elems[k++]=A.elems[a++];
		}else{
			C.elems[k++]=B.elems[b++];
		}
	}
	while(a<A.length)
		C.elems[k++]=A.elems[a++];
	while(b<B.length)
		C.elems[k++]=B.elems[b++];
}

  

猜你喜欢

转载自www.cnblogs.com/hekuiFlye/p/9167710.html