panda_1

1.线性表的存储结构---顺序存储

顺序表

1.顺序结构的特点

  • 表中数据存放在一组连续的空间之中。
  • 数据元素在存储空间中的鼠须贺他们的物理逻辑顺序相同。
  • 根据元素编号可计算出它们的存储地址 公式:ADR(ai) = ADR(a1) + (i - 1) * S。

2.注意

  • 一维数组占据是一串连续的存储空间,可以静态分配,也可以动态分配。
  • 存储的数据元素数据超过了数组的大小就会发生“溢出”,当发生“溢出“的时候可以动态分配一个更大的数组,但频繁的重新分配可能会降低程序的性能。

3.顺序表的结构体类型定义

typedef int DataType;            //线性表的数据结构类型
#define MaxSize 2000             // 2000是预估的线性表的最大长度,表示的是能存放的做多的元素
typedef struct {
       DataType list[MaxSize];   //DateType为线性表中的数据元素类型
       int len;                  //顺序表的长度,现在表中已存的数据元素个数
}SeqList;

4.顺序表的运算

  • 顺序表的初始化:因为是静态的线性表,所以只需要将长度设置为0即可
void initlist(SeqList* L)
{
       L->len = 0;
}
  • 顺序表的建立
void CreateList(SeqList *L)
{
       int i = 0;
       printf("输入线性表的长度:\n");
       cin >> L->len;
       printf("输入线性的元素:\n");
       for (int i = 0; i < L->len; i++)
       {
              int t;
              cin >> t;
              L->list[i] = t;
       }
}
  • 顺序表的清空
void ClearList(SeqList* L)
{
       L->len = 0;//逻辑清空,实际内存还在被占用
}
  • 输出顺序表的所有数据元素
void OutPutList(SeqList* L)
{
       for (int i = 0; i < L->len; i++)cout << L->list[i] << " ";
}
  • 求顺序表的长度
int GetLength(SeqList* L)
{
       return L->len;
}
  • 判断顺序表是否为空
int IsEmty(SeqList* L)
{
       if (L->len != 0)return 1;
       else L-> len;
}
  • 读取顺序表的第i个元素
int GetElem(SeqList* L, int i)
{
       if (i < 0 || i > L->len)
       {
              printf("error!");
              exit(1);
       }
       return L->list[i];
}
  • 在顺序表种查找指定关键字的数据元素
int SearchList(SeqList* L, DataType elem)
{
       int i = 0;
       for (int i = 0; i < L->len; i++)
       {
              if (elem == L->list[i])return i;
       }
       return -1;
}
  • 在顺序表第i个位置插入一个新的数据元素
void InsertList(SeqList* L, DataType elem, int i)
{
       if (L->len == MaxSize)
       {
              printf("overflew!");
              exit(1);
       }
       if (i < 0)i = 0;
       else if (i > L->len)i = L->len;
       for (int k = L->len; k >= i; k--)
       {
              L->list[k + 1] = L->list[k];//调正位置
       }
       L->list[i] = elem;//插入元素
       L->len++;//增加长度
}
  • 线性表的合并
void ComList(SeqList* L, SeqList *L2)
{
       for (int i = 0; i < L2->len; i++)
       {
              L->list[L->len + i] = L2->list[i];
       }
       L->len = L->len + L2->len;
}

posted on 2021-07-01 15:44  panda_1  阅读(432)  评论(0)    收藏  举报

导航