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