顺序表结点的存储地址计算公式:
第i个数据元素的存储位置:Loc(ai)=Loc(ai)+(i-1)*l;1≤i≤n(l为每个元素需占l个存储单元)
第(i+1)个数据元素的存储位置Loc(ai+1)和第i个数据元素的存储位置Loc(ai)的关系:Loc(ai+1)=Loc(ai)+l;
数组:
#define OK 1 #define ERROR -1 #define MAX_SIZE 100 typedef int Status ; typedef int ElemType ; typedef struct sqlist { ElemType elem_array[MAX_SIZE] ; int length ; } SqList ;
1. 顺序线性表初始化
Status Init_SqList( SqList *L ) { L->elem_array=( ElemType * )malloc(MAX_SIZE*sizeof( ElemType ) ) ; if ( !L -> elem_array ) return ERROR ; L->length= 0 ; return OK ; }
2. 顺序线性表的插入---实现步骤(Einsert=n/2,平均时间复杂度为O(n))
/*
(1) 将线性表L中的第i个至第n个结点后移一个位置。
(2) 将结点e插入到结点ai-1之后。
(3) 线性表长度加1
*/
Status Insert_SqList(Sqlist *L,int i ,ElemType e) { int j ; if( i<1||i>L->length+1) return ERROR ; //i合法值1到length+1 if(L->length>=MAX_SIZE) { printf(“线性表溢出!\n”); return ERROR ; } for( j=L->length–1; j>=i-1; --j ) L->Elem_array[j+1]=L->Elem_array[j];/* i-1位置以后的所有结点后移 */ L->Elem_array[i-1]=e; /* 在i-1位置插入结点 */ L->length++ ; return OK ; }
3 顺序线性表的删除(Einsert=(n-1)/2,平均时间复杂度为O(n))
/*
(1) 将线性表L中的第i+1个至第n个结点依此向前移动一个位置。
(2) 线性表长度减1。
*/
ElemType Delete_SqList(Sqlist *L,int i) { int k ; ElemType x ; if(L->length==0) { printf(“线性表L为空!\n”); return ERROR; } if(i<1||i>L->length) { printf(“要删除的数据元素不存在!\n”) ; return ERROR ; } x=L->Elem_array[i-1] ; /*保存结点的值*/ for(k=i; k<L->length; k++) L->Elem_array[k-1]=L->Elem_array[k];/* i位置以后的所有结点前移 */ L->length--; return (x); }
4 顺序线性表的查找定位删除---实现步骤(Ecompare=(n+1)/2,Edelete=(n-1)/2,平均时间复杂度:Ecompare+Edelete=n ,即为O(n) )
/*
(1) 在线性表L查找值为x的第一个数据元素。
(2) 将从找到的位置至最后一个结点依次向前移动一个位置。
(3) 线性表长度减1。
*/
Status Locate_Delete_SqList(Sqlist *L,ElemType x)/* 删除线性表L中值为x的第一个结点 */ { int i=0 , k ; while(i<L->length) /*查找值为x的第一个结点*/ { if(L->Elem_array[i]!=x ) i++ ; else { for ( k=i+1; k< L->length; k++) L->Elem_array[k-1]=L->Elem_array[k]; L->length--; break ; } } if (i>L->length) { printf(“要删除的数据元素不存在!\n”) ; return ERROR ; } return OK; }
动态数组:
typedef struct { ElemType *elem; //存储空间基址 int length; //当前长度 int listsize; //当前分配的存储容量(以sizeof(ElemType )为单位) }SqList;
创建顺序表(数组):
status Init(SqList &l){ l.elem=(ElemType *)malloc(初始长度*sizeof(ElemType )); if(!l.elem) exit(0); l.length=0; l.listsize=初始长度; return ok; }
插入:
status insertlist(SqList *L,int i,ElemType e) //第i的位置插入元素 { if(i<1||i>L.length+1) //下表为0的作为哨兵,不放数据。判断i是否合法 return error; if(L.length>=L.listsize) //存储空间已满,增加分配空间 { newbase=(ElemType *)realloc(L.elem,(L.listsize+增量)*sizeof(ElemType ));//L.elem原指针的位置 if(!newbase) //存储分配失败 exit(0); L.elem=newbase; //新基址 L.listsize+=增量; //增加存储容量 } q=&(L.elem[i-1]); //p插入的位置 for(p=&(L.elem[length-1]);p>=q;--p) *(p+1)=*p; //指针移动 *q=e; //插入元素 ++L.length; //表长加一 return ok; }
删除:
status deletlist(SqList *L,int i,ElemType e) { if(i<1||i>L.length) //下判断i是否合法 return error; p=&(L.elem[i-1]); //删除元素的位置 e=*p; //删除元素的值 q=L.elem+L.elem+Llength-1; //表尾的位置 for(++p;p<=q;++p) *(p-1)=*p; //元素左移 --L.length; //表长减一 return ok; }
时间: 2024-11-05 18:57:55