数据结构和算法学习总结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;
}  
时间: 2024-07-30 09:13:47

数据结构和算法学习总结03 线性表---顺序表的相关文章

数据结构与算法学习 第1季01 顺序表 链表

2015年学习计划安排: http://www.cnblogs.com/cyrus-ho/p/4182275.html 顺序表:顺序存储结构的线性表.所谓顺序存储结构,就是指用一组连续地址的内存单元来存储整张线性表的存储结构.(因此按序遍历数据很方便,直接做指针偏移就可以了.) 常用操作 A)向顺序表中第i个位置插入元素item 1. 判断插入位置是否合法 2. 将i-1以后的元素后移一个元素的位置(注意静态顺序表和动态顺序表的差异)--- 从原来最后一个元素开始操作到原来的第i个元素,依次后移

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

队列 队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表. 与栈的比较: 1.队列先进先出,栈先进后出. 2.从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同. 但它们是完全不同的数据类型.除了它们各自的基本操作集不同外,主要区别是对插入和删除操作的"限定": 栈是限定只能在表的一端进行插入和删除操作的线性表:队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表. 队列同样分为顺序队列和链式队列,我们一般用链式队

数据结构和算法学习总结04 线性表---栈

栈 栈(Stack)是特殊的线性表,是只允许在一端进行插入和删除的线性表. 允许插入和删除的叫栈顶,反之则是栈底. 栈的插入称为进栈,删除称为出栈. 特性是:后进先出,所以栈也叫后进先出表,简称LIFO表(Last In First Out). 因为栈是线性表,所以也有顺序表和链表两种形式,一般我们常用顺序表. 从代码中可以看出:与顺序表相比实际上就是插入和删除操作发生了改变. #include <iostream> using namespace std; const int Stack_S

C++数据结构与算法_2_线性表 --顺序表的应用示例

h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { font-family: "微软雅黑"; font-size: 16pt; }h2.ctl { font-family: "AR PL UMing CN"; font-size: 16pt; }h1 { margin-bottom: 0.21cm; }h1.western { fon

C++数据结构与算法_1_线性表 --顺序表的实现与分析

顺序表的实现与分析 引 --线性表的抽象基类: template <typename T> class LinearList { public: LinearList(); ~LinearList(); virtual int Size() const = 0; //返回线性表所能够存储的最大长度 virtual int Length() const = 0; //当前线性表的长度 virtual int Search(T &x) const = 0; virtual int Loca

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺

数据结构与算法学习之路:背包问题的贪心算法和动态规划算法

一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算法:贪心算法基于的思想是每一次选择都作当前最好的选择,这样最后的结果虽然不一定是最优解,但是也不会比最优解差很多. 举个例子说明可能好懂一些:一帮基友去聚餐,菜是一份一份上的,我每一次夹菜都只夹牛肉/海鲜吃,可能到最后我吃的牛肉/海鲜很多,但不一定代表我吃掉的东西的总价值最高,但是相对来说价值也很高

线性表——顺序表与单链表学习小结

线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表.链表.栈.队列.字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线.但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储. 顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储.在数组上完成数据的增删查改. 链表 链表是一种物理存储结构上非连续.非顺序的存储结构,数据

设顺序表中的数据元素递增有序,试着写一算法,将x插入到顺序表上的适当位置上,以保持该表的有序性。

转自: https://blog.csdn.net/cckevincyh/article/details/45605261 设顺序表va中的数据元素递增有序.试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性 先建立一个待插入的结点,然后依次与与链表中的各结点的数据域比较大小,找到插入该结点的位置,最后插入该结点. 算法如下: #include<stdio.h> #include<stdlib.h> #define MAXSIZE 20 #define OK 1 #def