数据结构和算法学习总结03 线性表---顺序表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构和算法学习总结03 线性表---顺序表相关的知识,希望对你有一定的参考价值。

线性表是最简单、也是最基本的一种线性数据结构。

它有两种存储表示法:顺序表和链表,最基本的操作是插入、删除和查找等。

顺序表的基本操作如下:

#include <stdio.h>  
#include <stdlib.h>  
  
#define EXIST 1              //存在数据元素,不为空
#define EMPTY 0              //为空
#define OK 1                 //成功
#define ERROR 0              //出现错误
#define OVERFLOW -1          //元素溢出
  
const int LIST_SIZE = 5;          //顺序表长度
  
typedef int Status;          //把整型定义成Status(状态)           用于定义各种操作方法
typedef int ElemType;        //把整型定义成ElemType(元素类型)     用于定义变量
  
typedef struct               
{  
        ElemType *elem;      //顺序表
        int length;          //顺序表的当前长度
        int listsize;        //顺序表的长度
} List;  
  
/*
  函数名:InitList() 
  功能:构造一个空线性表 
  返回值:存储分配失败:ERROR
          存储分配成功:OK
*/  
Status InitList(List &L)  
{  
       if((L.elem = new ElemType[LIST_SIZE])== NULL)
           //(ElemType*)malloc(sizeof(ElemType)* LIST_SIZE)) == NULL)   
           //malloc动态分配内存空间,成功返回指针,失败返回NULL
       return ERROR;  
       else  
       {  
           L.length = 0;  
           L.listsize = LIST_SIZE;  
           return OK;   
       }   
}  
 
/*
  函数名:DestroyList() 
  初始条件:线性表L已存在 
  功能:销毁线性表 
  返回值:ERROR
          OK
*/  
Status DestroyList(List &L)  
{  
     if(L.elem == NULL)  
     return ERROR;  
     else  
     {  
          free(L.elem);           //系统自带的函数free()
          return OK;   
     }   
}  
 
/*
  函数名:ClearList() 
  初始条件:线性表L已存在  
  功能:清空线性表 
  返回值:ERROR
          OK
*/  
Status ClearList(List &L)  
{  
       if (L.elem == NULL) return ERROR;  
       else  
       {  
           L.length = 0;  
           return OK;  
       }   
}   
   
/*
  函数名:IsEmpty()  
  初始条件:线性表存在 
  功能:判断线性表是否为空 
  返回:EMPTY
        EXIST
*/  
Status IsEmpty(List &L)  
{   
       if (L.length == 0) return EMPTY;  
       else return EXIST;  
}  
   
/*
  函数名:Length() 
  初始条件:线性表已存在 
  功能:返回线性表长度 
  返回值:线性表长度(L.length)
*/  
Status Length(List &L)  
{  
    return L.length;   
}   

/*
  函数名:GetElem() 
  参数: List &L, int i)  
  初始条件:线性表已存在 
  功能:用e返回线性表第i个元素的值 
  返回值: (i < 1)||(i > ListLength(L)) : OVERFLOW 
           1<= i <=ListLength(l) :OK
*/  
Status GetElem(List &L, int i)  
{  
       if ((i < 1)||(i > Length(L)))   
       return OVERFLOW;  
       int j;  ElemType e;
       ElemType *p;  
       p = L.elem;   
       for (j = 0; j < i - 1; j++)  
           L.elem++;   
       e = *L.elem;   
       L.elem = p; 
       return e;
}   

/*
函数名:GetLocateElem() 
  参数:List &L, ElemType value
  初始条件:线性表L已存在 
  功能:返回顺序表中第一个与element相等的元素的位序 
  返回值:若L中存在与element相等的元素,则返回 第一个符合条件的元素位序 
          若不存在,则返回0
*/  
Status GetLocateElem(List &L, ElemType value)  
{  
       int i;  
       ElemType *p;  
       p = L.elem;   
       for (i = 1;i <= L.length; i++)  
       {  
           if (*L.elem == value)  
           {  
                 L.elem = p;  
                 return i; 
           }   
           L.elem++;   
       }   
       L.elem = p;  
       return 0;   
}  
 
/*
  函数名:GetPreElem()
  参数:List &L, ElemType e, ElemType *pre_e 
  初始条件:线性表已存在,i>1&&i<=L.length,GetLocateElem()存在  
  功能:用pre_e返回线性表中e的前驱 
  返回值: OVERFLOW 
           OK        
*/  
Status GetPreElem(List &L, ElemType e, ElemType *pre_e)  
{  
       ElemType *p = L.elem;  
       int i;  
       i = GetLocateElem(L, e);           //这里不用&L   因为这是按引用调用   
       if (i == 0) return OVERFLOW;  
       int j;  
       for (j = 0;j < i - 2; j++)  
       {  
           L.elem++;  
       }   
       *pre_e = *L.elem; 
       L.elem = p;  
       return OK;   
} 
                    
/*
  函数名:InsertList(); 
  参数:List &L, int i, ElemType e 
  初始条件:线性表L已存在,1 <= i <=L.length + 1; 
  功能:在线性表第i个元素前插入e 
  返回值:失败:OVERFLOW
          成功:OK 
*/  

Status InsertList(List &L, int i, ElemType e)  
{    
       ElemType *newList, *p; 
       int j;
       if (i < 1||i > (L.length)+1)  
       return OVERFLOW;  
       if (L.length >= L.listsize)  
       {  
             newList = new ElemType[L.listsize + 1];
                 //(ElemType*)realloc(L.elem,L.listsize + sizeof(ElemType)) ; 
              
             for(j=0;j<L.length;j++)
             {
                 newList[j]=L.elem[j];
             }
             free(L.elem);
             L.elem = newList;  
             L.listsize++;                  
       }
       int *q = &(L.elem[i - 1]); 
       for (p = &(L.elem[L.length - 1]);p >= q; p--)  
           *(p + 1) = *p;  
       *q = e;  
       L.length++;  
       return OK;      
}   

/*函数名:ListDelete() 
  参数:List &L, int i, ElemType *e;  
  初始条件:线性表L已存在。1<= i <= L.length 
  功能:删除线性表中第i个元素,并用e返回被删数的值  
  返回值:失败:OVERFLOW 
          成功:OK*/  
Status ListDelete(List &L, int i, ElemType &e)  
{  
         
       if ((i < 1)||(i > L.length))   
       return OVERFLOW;   
       e = (L.elem[i - 1]);   
       ElemType  *q;        
       for (q = &(L.elem[i - 1]); q < &(L.elem[L.length - 1]); q++ )  
       {  
           *q = *(q + 1);   
       }   
       L.length--;  
       return OK;   
}  

//将顺序表中的元素输出
Status PrintfList(List &L)  
{  
       if ((L.elem == NULL)||(L.length==0))  
       return ERROR;  
       else  
       {  
           int  i;  
           for (i = 0; i < L.length; i++)  
           {  
               printf("%d ",L.elem[i]);  
           }  
           printf("\n");  
       }  
       return OK;  
}  
//输入元素到表中
Status ListScan(List &L)  
{  
       int i, a;  
       printf("enter numbers:");  
       for (i = 0;i < LIST_SIZE ; i++)  
       {  
        scanf("%d",&a);  
        InsertList(L, i+1, a);  
       }    
       return 1;
}  
  
int main()  
{  
    List La, Lb;   
    int i, e;   
    InitList(La);                 
    InitList(Lb);      
    ListScan(La);      
    ListScan(Lb);    
    for (i = 0; i < Lb.length; i++)  
    {  
        e = GetElem(Lb,i+1);
        printf("\n%d",e);             //将顺序表Lb的数据元素通过位置查询一个个输出
        if (!GetLocateElem(La, e))    
        InsertList(La, 6, e);         //判断Lb中的一个数据La中是否也有,如果没有,插入到La后
       // Lb.elem++;   
    }   
    printf("\nLa = ");  
    PrintfList(La);   
    return 0;  
}  

以上是关于数据结构和算法学习总结03 线性表---顺序表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构和算法学习总结03 线性表---队列

数据结构第七章学习总结

数据结构与算法学习笔记:线性表Ⅰ

杨玲 徐思 《面向对象程序设计(java)》第十一周学习总结

数据结构与算法之线性表(超详细顺序表链表)

数据结构学习总结线性表之顺序表