顺序表

简介:

一 顺序表的定义: 即把线性表的结点按逻辑次序依次存放在一组地址连续的存储单元里的方法。

二 顺序表类型定义:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #define ListSize 100 //定义表空间大小  
  2. typedef int DataType;//假设为int类型  
  3. typedef struct {  
  4.     DataType data[ListSize];  
  5.     int length;//顺序表的大小  
  6. }SeqList  



注意:
① 用向量这种顺序存储的数组类型存储线性表的元素外,顺序表还应该用一个变量来表示线性表的长度属性,因此用结构类型来定义顺序表类型。
② 存放线性表结点的向量空间的大小ListSize应仔细选值,使其既能满足表结点的数目动态增加的需求,又不致于预先定义过大而浪费存储空间。
③ 由于C语言中向量的下标从0开始,所以若L是SeqList类型的顺序表,则线性表的开始结点a1和终端结点an分别存储在L.data[0]和L.Data[L.length-1]中。
④ 若L是SeqList类型的指针变量,则a1和an分别存储在L->data[0]和L->data[L->length-1]中。

三 顺序表的运算
①表的初始化
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <pre name="code" class="cpp">void InitList(SeqList *L)  
  2. {  
  3.     L->length = 0;//顺序表的初始化即就是讲表的长度置为0  
  4. }  


②求表长
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void Listlength(SeqList *L)  
  2. {  
  3.     return L->length ;//只需要返回length即可  
  4. }  
③取表中第i个结点

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. DataType GetNode(SeqList *L,int i)  
  2. {//取表中第i个结点返回L->data[i-1]即可  
  3.     if(i<1||L->length-1)  
  4.         Error("position error");  
  5.     else  
  6.         return L->data[i];  
  7. }  
④查找x是否在表中
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int FindNode(SeqList *L,int x)  
  2. {  
  3.     int i,p;  
  4.       
  5.     for(i=0;i<L->length;i++)  
  6.     {  
  7.         p = L->data[i];//取表中第一个节点  
  8.         if(p!=x)  
  9.         {  
  10.             i++;  
  11.         }  
  12.         else break;  
  13.         if(i==length-1)  
  14.         {  
  15.             printf("Sorry not fonud!");  
  16.             return 0;  
  17.         }     
  18.     }  
  19.     printf("the position is %d",i+1);  
  20.     return 1  
  21. }  

⑤将数据x插入到第i个位置上
[cpp]  view plain  copy
  1. void InsertList(SeqList *L,DataType x,int i)  
  2. {  
  3.     int j;  
  4.     if(i<1||i>L->length+1)  
  5.         Error("position error");  
  6.     if(L->length>=ListSize)  
  7.         Error("overflow")//表空间溢出  
  8.     for(j=L->length-1;j>=i-1;i--)  
  9.     {  
  10.         L->data[j+1] = L->data[j];    //全体后移  
  11.         L->data[i-1] = x;            //插入数据  
  12.         L->length++;            //表长增加  
  13.     }  
  14. }  

四 算法分析
① 问题的规模
表的长度L->length(设值为n)是问题的规模。
② 移动结点的次数由表长n和插入位置i决定
算法的时间主要花费在for循环中的结点后移语句上。该语句的执行次数是n-i+1。
当i=n+1:移动结点次数为0,即算法在最好时间复杂度是0(1)
当i=1:移动结点次数为n,即算法在最坏情况下时间复杂度是0(n)
③ 移动结点的平均次数Eis(n) 


其中:
在表中第i个位置插入一个结点的移动次数为n-i+1
pi表示在表中第i个位置上插入一个结点的概率。不失一般性,假设在表中任何合法位置(1≤i≤n+1)上的插入结点的机会是均等的,则
p1=p2=…=pn+1=1/(n+1)

因此,在等概率插入的情况下,


即在顺序表上进行插入运算,平均要移动一半结点。

转载:http://blog.csdn.net/xsf50717/article/details/39895835
目录
相关文章
|
1月前
|
存储 测试技术 C语言
顺序表详解(SeqList)
顺序表详解(SeqList)
37 0
|
6月前
|
存储
【顺序表】
【顺序表】
30 0
|
1月前
|
存储 缓存
【顺序表和链表的对比】
【顺序表和链表的对比】
|
3月前
|
存储
顺序表讲解
顺序表讲解
22 0
|
4月前
顺序表的实现
顺序表的实现
|
5月前
|
存储 C语言
顺序表(1)
顺序表(1)
31 0
|
5月前
|
测试技术
顺序表(2)
顺序表(2)
526 0
|
5月前
|
存储 NoSQL
03 顺序表
03 顺序表
16 0
|
8月前
|
存储
顺序表详解
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
|
8月前
|
存储 C++
顺序表的实现(详解版)
顺序表的实现(详解版)