线性表(上)

一、线性表

定义:线性表是n个数据元素的有限序列,每个元素由若干个数据项构成。

ADT List{

D={ai|aiElemset,i=1,2,...,n} 数 据 对 象 : D = { a i | a i € E l e m s e t , i = 1 , 2 , . . . , n }

Rl={<ai1,ai>|ai,aiD,i=1,2,...,n} 数 据 关 系 : R l = { < a i − 1 , a i > | a i , a i € D , i = 1 , 2 , . . . , n }

访 基 本 操 作 : 初 始 化 、 插 入 、 删 除 、 查 找 、 定 位 、 修 改 、 访 问
}

1、线性表——顺序表

1.1 类型定义及说明


# include "stdafx.h"


# include "malloc.h"


# include "stdlib.h"


# define OK 1


# define ERROR -1


# define OVERFLOW -2


# define LIST_SIZE 100


# define LISTINCREMENT 10

typedef int Status;
typedef int ElemType;

1.2存储方式

在计算机内存中用一组连续的内存地址存储数据元素。可以用数组,也可以动态分配存储空间。

1.2.1顺序表的定义
typedef struct {
  ElemType *elem;
  int length;
  int listsize;
}Sqlist;//定义一个数据元素
1.2.2顺序表的初始化
status List_init(Sqlist &L){
  L.elem=(ElemType*)malloc(LIST_SIZE * sizeof(ElemType));
  if(!L.elem)exit(OVERFLOW);
  L.length=0;
  l.listsize=LIST_SIZE;
  return OK;
}//顺序表的初始化

1.3基本操作

1.3.1顺序表的插入
> Status List_Insert(Sqlist &L,int i, ElemType e){
>     ElemType *p, *q;
>     if(i<0||i>L.length+1)return ERROR;
>     if(L.length>L.listzize){
>         L.elem=(ElemType*)realloc(L.elem,(LISTINCREMENT+L.listsize) * sizeof(ElemType));
>         if(!L.elem)return ERROR;
>         L.listzize+=LISTINCREMENT;
>     }
>     p=&(L,elem[L.length-1]);
>     q=&(L.elem[i-1]);
>     for(p;p>q;p--) *(p+1)= *p;
>     *q=e;
>     L.length++;
>     return OK;
>}

1.3.2顺序表元素的删除
status List_Delete(Sqlist &L,int i,ElemType &e){
  ElemType *p, *q;
  if (i<0||i>L.length+1)return ERROR;
  p=&(L.elem[L.length-1]);
  q=&(L.elem[i-1]);
  e=*q;
  for(q++;q<=p;q++)*(q-1)= *q;
  --L.length;
  return OK;
}
1.3.3顺序表元素的定位
int  LocateElem_Sq(SqList L, ElemType e){
  int i;
  ElemType *p;
  i = 1;        // i的初值为第1个元素的位序
  p = L.elem;   // p的初值为第1个元素的存储位置
  while (i <= L.length && (*p++!=e))
      ++i;
  if (i <= L.length) return i;
  else return -1;

}
1.3.4顺序表的合并
void MergeList_Sq(SqList La, SqList Lb, SqList &Lc) 
{
  ElemType *pa, *pb, *pc, *pa_last, *pb_last;
  pa = La.elem;  pb = Lb.elem;
  Lc.listsize = Lc.length = La.length + Lb.length;
  pc = Lc.elem = (ElemType *)malloc(Lc.listsize * sizeof(ElemType));
  if (!Lc.elem)
      exit(OVERFLOW);   // 存储分配失败
  pa_last = La.elem + La.length - 1;
  pb_last = Lb.elem + Lb.length - 1;
  while (pa <= pa_last && pb <= pb_last) {  // 归并
      if (*pa <= *pb) *pc++ = *pa++;
      else *pc++ = *pb++;
  }
  while (pa <= pa_last) *pc++ = *pa++;      // 插入La的剩余元素
  while (pb <= pb_last) *pc++ = *pb++;      // 插入Lb的剩余元素
} 
1.3.5顺序表的遍历
void Travel_Sq(SqList a)
{
  int k = 0;
  while (k < a.length) {
      printf("%d\r\n", a.elem[k]);
      k++;
  }
}

1.4附:主函数

int main()
{
  SqList L;
  char c;
  int s=InitList_Sq(L);
  if (s == OK)
  {
      printf("%s", "OK");
  }
  else {
      printf("%s", "ERR");
  }
  int a = 10;
  ListInsert_Sq(L, 1, 10);
  ListInsert_Sq(L, 1, 20);
  ListInsert_Sq(L, 1, 30);
  ListInsert_Sq(L, 1, 40);
  Travel_Sq(L);
  int m = LocateElem_Sq(L, 40);
  printf("定位在%d", m);
  int d = LocateElem_Del_Sq(L, 30);
  printf("%s", "\r\n");
  printf("%d", d);
  SqList B;
  InitList_Sq(B);
  ListInsert_Sq(B, 1, 50);
  ListInsert_Sq(B, 1, 45);
  SqList C;
  printf("%s", "\r\n");
  MergeList_Sq(L, B, C);
  Travel_Sq(C);
  c = getchar();
   return 0;
}

说明

由于以一维数组方式存储的方式比动态存储方式更简单,就不做描述,下一节讲解线性表的链式存储。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值