ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第二章线性表——顺序存储结构(2)

2022-01-12 23:01:59  阅读:153  来源: 互联网

标签:结点 return 线性表 Elem length array 第二章 顺序存储


一、定义

顺序存储 :把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里用这种方法存储的线性表简称顺序表。

 

顺序存储的线性表的特点:

◆ 线性表的逻辑顺序与物理顺序一致;

◆ 数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。

设有非空的线性表:(a1,a2,…an) 。顺序存储如图2-1所示。

 

用结构类型来定义顺序表类型

#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 ; else { L->length= 0 ; return OK ; } }

 

2 顺序线性表的插入

在线性表 L= (a1,…a i-1,ai, ai+1,…,an) 中的第i(1≦i≦n)个位置上插入一个新结点e,

使其成为线性表: L=(a1,…a i-1,e,ai,ai+1,…,an)

实现步骤

(1) 将线性表L中的第i个至第n个结点后移一个位置。

(2) 将结点e插入到结点ai-1之后。

(3) 线性表长度加1。

算法描述
Status Insert_SqList(Sqlist *L,int i ,ElemType e)
 {   int j ;
if  ( i<0||i>L->length-1)   return  ERROR ;
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 ;  
}

在顺序表上做插入运算,平均要移动表上一半结点。当表长n较大时,算法的效率相当低。因此算法的平均时间复杂度为O(n)。

 

 

3 顺序线性表的删除

在线性表 L=(a1,…a i-1,ai, ai+1,…,an) 中删除结点ai(1≦i≦n),

使其成为线性表: L= (a1,…ai-1,ai+1,…,an)

实现步骤 (1) 将线性表L中的第i+1个至第n个结点依此向前移动一个位置。 (2) 线性表长度减1。

算法描述

 1 ElemType  Delete_SqList(Sqlist *L,int i)
 2 {  int  k ;   ElemType  x ;
 3 if  (L->length==0)
 4 {  printf(“线性表L为空!\n”); return ERROR;  } 
 5 else if ( i<1||i>L->length ) 
 6 {  printf(“要删除的数据元素不存在!\n”) ; 
 7 return ERROR ; }
 8 else  {  x=L->Elem_array[i-1] ;   /*保存结点的值*/
 9 for ( k=i ;  k<L->length ; k++) 
10       L->Elem_array[k-1]=L->Elem_array[k];
11              /*  i位置以后的所有结点前移  */
12 L->length--;  return (x);
13 }
14 } 

 

4 顺序线性表的查找定位删除

在线性表 L= (a1,a2,…,an) 中删除值为x的第一个结点。

实现步骤

(1) 在线性表L查找值为x的第一个数据元素。

(2) 将从找到的位置至最后一个结点依次向前移动一个位置。

(3) 线性表长度减1。

 1 Status  Locate_Delete_SqList(Sqlist *L,ElemType x)
 2      /*  删除线性表L中值为x的第一个结点  */
 3 {  int  i=0 , k ; 
 4 while  (i<L->length)      /*查找值为x的第一个结点*/
 5 {   if  (L->Elem_array[i]!=x )  i++ ; 
 6 else  
 7    {  for ( k=i+1; k< L->length; k++)
 8            L->Elem_array[k-1]=L->Elem_array[k]; 
 9        L->length--;  break ; 
10    }
11 }
12 if  (i>L->length)
13 {    printf(“要删除的数据元素不存在!\n”) ; 
14 return ERROR ;
15   }
16 return  OK;    
17 } 

 

标签:结点,return,线性表,Elem,length,array,第二章,顺序存储
来源: https://www.cnblogs.com/kx-bk/p/15795731.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有