一、线性表
定义:线性表是n个数据元素的有限序列,每个元素由若干个数据项构成。
ADT List{
数据对象:D={ai|ai€Elemset,i=1,2,...,n} 数 据 对 象 : D = { a i | a i € E l e m s e t , i = 1 , 2 , . . . , n }
数据关系:Rl={<ai−1,ai>|ai,ai€D,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;
}
说明
由于以一维数组方式存储的方式比动态存储方式更简单,就不做描述,下一节讲解线性表的链式存储。