一.线性表的顺序表示的概念:用一组地址连续的存储单元依次存储线性表的数据元素。
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++];
}

浙公网安备 33010602011771号