数据结构笔记01:线性表之顺序存储结构(ArrayList)

一般使用数组(C语言中的数组采用顺序存储方式。即连续地址存储)来描述。

优点:在于随机访问元素。

缺点:插入和和删除的时候,需要移动大量的元素。

c语言实现代码:ArrayList

  1 // Test.cpp : Defines the entry point for the console application.
  2 //
  3
  4 #include "stdafx.h"
  5 #include <stdio.h>
  6 #include "stdlib.h"
  7 //宏定义
  8 #define TRUE   1
  9 #define FALSE   0
 10 #define OK    1
 11 #define ERROR   0
 12 #define INFEASIBLE -1
 13 #define OVERFLOW -2
 14
 15 #define LT(a,b)   ((a)<(b))
 16 #define N = 100
 17
 18 #define LIST_INIT_SIZE 100 //线性表初始空间分配量
 19 #define LISTINCREMENT   10 //线性表空间分配的增量
 20
 21 typedef int Status;
 22 typedef int ElemType;
 23
 24 typedef struct LNode{
 25     ElemType  *elem;        //存储空间的基地址
 26     int      lenght;        //当前的长度
 27     int      listsize;      //当前分配的存储容量
 28 }SqList;
 29
 30 /**
 31  *构造空的线性表
 32  */
 33
 34 Status initList(SqList &L, int lenght){
 35     if (lenght == 0) lenght = LIST_INIT_SIZE;
 36     L.elem = (ElemType *)malloc(lenght * sizeof(ElemType));
 37     if(!L.elem) exit(OVERFLOW);  //分配存储空间失败
 38     L.lenght = 0;                //初始空表长度为0
 39     L.listsize = lenght ;//初始存储容量为100
 40     return OK;
 41 }
 42 /************************************************************************/
 43 /* 在第i位置插入e
 44 */
 45 /************************************************************************/
 46 Status insertList(SqList &L, ElemType e, int i){
 47     ElemType *p,  *q;
 48     if(i<0 ||i > L.lenght) return ERROR;  //i值不合法
 49     if (L.lenght >= L.listsize) {
 50         ElemType *newbase = (ElemType *)realloc(L.elem ,(L.listsize +LISTINCREMENT)*sizeof(ElemType));
 51         if(!newbase) return OVERFLOW;   //存储分配失败
 52         L.elem = newbase;               //新基值
 53         L.listsize += LISTINCREMENT;    //增加存储容量
 54     }
 55     q = &L.elem[i];                     //q为插入的位置
 56     for (p = &L.elem[L.lenght]; p>=q; --p) {
 57         *p = *(p-1);                    //i元素之后的元素往后移动
 58     }
 59     *q = e;                             //插入e
 60     L.lenght +=1;
 61     return OK;
 62
 63 }
 64 /************************************************************************/
 65 /* 快速排序
 66 */
 67 /************************************************************************/
 68 void sortList(SqList &L){
 69
 70
 71 }
 72 /************************************************************************/
 73 /* 删除第i位置元素,并用e返回其值                                                                     */
 74 /************************************************************************/
 75 Status deleteListElem(SqList &L, int i, ElemType &e){
 76     int *p,  *q;
 77     if(i<0 ||i > L.lenght) return ERROR;  //i值不合法
 78     q = &L.elem[i];                       //被删除元素的位置为i,L.elem就是数组名,
 79     e = *q;                               //被删除元素的值赋值给e
 80     for (p = q; p< (L.elem + L.lenght); p++){ //元素左移
 81         *p = *(p+1);
 82     }
 83     --L.lenght;
 84     return OK;
 85 }
 86
 87 /************************************************************************/
 88 /*  快速排序
 89 */
 90 /************************************************************************/
 91
 92 int partition(SqList &L, ElemType low, ElemType high){
 93     ElemType pivotkey = L.elem[low];               //枢轴记录关键字
 94     while (low < high) {                  //从表的两端向中间扫描
 95         while (low < high &&  L.elem[high] >= pivotkey ) --high;//高端位置扫描
 96         L.elem[low] = L.elem[high];     //交换数据,小于pivotkey移到低端
 97         L.elem[high] = pivotkey;
 98
 99         while (low < high && L.elem[low] <= pivotkey ) ++low;     //低端扫描
100         L.elem[high] = L.elem[low];               //交换数据 大于pivotkey移到高端
101         L.elem[low] = pivotkey;
102     }
103     return low;
104 }
105
106 void quickSort(SqList &L, ElemType low, ElemType high){
107     int pivot;
108     if(low < high) {
109         pivot =  partition(L,  low,  high);
110         quickSort(L,  low,  pivot -1);          //低端子表排序
111         quickSort(L,  pivot +1, high);          //高端子表排序
112     }
113
114 }
115
116
117 /************************************************************************/
118 /*
119 合并两个线性表
120 */
121 /************************************************************************/
122
123 void mergeList(SqList La, SqList Lb,  SqList &Lc){
124     ElemType *pa, *pb, *pc;
125     Lc.listsize =  La.lenght + Lb.lenght;
126     initList(Lc, Lc.listsize);          //初始化LC\pc = Lc.elem;
127     Lc.lenght = Lc.listsize;
128     pc = Lc.elem;
129     pa = La.elem;
130     pb = Lb.elem;
131     while (pa <= &La.elem[La.lenght -1] && pb <= &Lb.elem[Lb.lenght -1]){
132         if (*pa <= *pb) *pc++ = *pa++;
133         else *pc++ = *pb++;
134     }
135     while(pa <= &La.elem[La.lenght -1]) *pc++ = *pa++; //插入La的剩余元素
136     while(pb <= &Lb.elem[Lb.lenght -1]) *pc++ = *pb++; //插入Lb的剩余元素
137
138 }
139
140 /************************************************************************/
141 /* 打印list
142 */
143 /************************************************************************/
144 void printList(SqList L){
145     printf("当前值:");
146     for (int i =0; i<L.lenght;i++) {
147         printf("%d ", *(L.elem+i)); // L.elem为首地址
148     }
149     printf("\r\n");
150 }
151
152 void main()
153 {
154     SqList La,Lb,Lc;
155     ElemType e;
156     int init,i;
157     init = initList(La, LIST_INIT_SIZE);
158     int data[6] = {5,3,6,2,7,4};
159     for (i=0; i<6;i++) {
160         insertList(La,  data[i],  i);
161     }
162     printf("LA:\r\n");
163     printList(La);
164     deleteListElem(La, 3, e );
165     printList(La);
166     insertList(La,  e,  3);
167     printList(La);
168
169     //排序
170     quickSort(La,0, La.lenght-1);
171     printList(La);
172
173     printf("LB:\r\n");
174     initList(Lb, LIST_INIT_SIZE);
175     int Bdata[5] = {1,3,2,4,6};
176     for (i=0; i<5;i++) {
177         insertList(Lb,  Bdata[i],  i);
178     }
179     //排序
180     quickSort(Lb,0, Lb.lenght-1);
181     printList(Lb);
182
183     mergeList(La, Lb,  Lc);
184     printList(Lc);
185
186 }  
时间: 2024-08-12 08:00:23

数据结构笔记01:线性表之顺序存储结构(ArrayList)的相关文章

简要比较线性表的顺序存储结构和链式存储结构

我们分别从存储分配方式.时间性能.空间性能三方面来做对比. 存储分配方式 顺序存储结构用一段连续的存储单元依次存储线性表的数据元素. 单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 时间性能 <1>查找 顺序存储结构O(1) 单链表O(n) <2>插入和删除 顺序存储结构需要平均移动表长一半的元素,时间为O(n) 单链表在计算出某位置的指针后,插入和删除时间仅为O(1) 空间性能 顺序存储结构需要预分配存储空间,分大了,容易造成空间浪费,分小了,容易发生溢出. 单链

《大话数据结构》笔记(2)--线性表的顺序存储结构

线性存储结构的Java实现代码: https://github.com/Lyu0709/data-structure/tree/master/src/com/coding/basic/array 第三章 线性表 定义 数学语言 若将线性表记为(a1, ..., ai-1, ai, ai+1, ..., an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素.当i=1,2,..,n-1时,ai有且仅有一个直接后继,当n=2,3,...,n

数据结构之线性表之顺序存储结构(3)

1 前言 经过前两张的理论基础,我相信大家都能简单的明白了数据结构和算法一些常用的概念了,从今天开始我们开始学习数据结构中线性表,一起叩响数据结构的大门. 2 详述 线性表(List):零个或者多个数据元素的有限序列. 如果用数学语言来进行定义: (声明:由于下标不是很好弄出来,所以只能表示下面这种方式了,请见谅!) 若线性表记作(a1,...ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素.当i

数据结构之线性表(顺序存储结构)

小学生放学都是要按顺序排队的,一个接一个,每个小学生的前后位置是固定的,这样便于迅速清点. 其实这就是一个线性表,从这件事里我们就可以找到很多关于线性表的特性,如 1.线性表是一个序列,它是有顺序的(排队) 2.第一个元素无前驱,最后一个无后继,其他每个元素都有一个前驱和后继(一个接一个) 3.元素是有限的(小学生的个数是有限的) 4.数据类型都相同(都是小学生在排队) 说明白线性表示什么,下面我们直接看线性表的实现 线性表的实现分顺序存储结构和链式存储结构 顺序存储结构: #define LI

数据结构-线性表之顺序存储结构

一.线性表的顺序存储需要三个属性 1.存储空间的起始位置 2.线性表的最大存储容量 3.线性表的当前长度 二.线性表的时间复杂度: 线性表的顺序存储结构,在存.读数据时,不管是哪个位置,时间复杂度都是O(1); 插入删除的时间复杂度是O(n),所以线性表适合元素个数不太变化,而更多是存取数据的应用. 三.线性表的结构示意图: 四.代码示例: /*我们的计量方式,除下标从0开始外,其余都从1开始算,所以只有在涉及访问数组的时候,要注意是否要+1 或-1*/ #include <stdio.h>

线性表之顺序存储结构(C语言动态数组实现)

线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链式存储结构:是用一段一段连续的内存空间存储表中每一行的数据,段与段之间通过一个引用(指针)相互连接来,形成一个链式的存储结构 看到顺序存储结构的图示,我们可能会马上联想到C语言的数组.是的,数组就是一种典型的顺序存储数据结构.下面我通过一个实例,来实现对顺序存储结构中的数据增.删.改.查的操作. 首

第6课 - 线性表的顺序存储结构及实现

1. 线性表的顺序存储结构 [顺序存储结构定义] 线性表的顺序存储结构,指的是用一段地址连续的存储单元依此存储线性表中的数据元素. [设计思路] 可以用一维数组来实现顺序存储结构的线性表. 1 template <typename T> 2 class SeqList : public List<T> 3 { 4 protected: 5 T *m_array; //顺序存储空间 6 int m_length; //当前线性表长度 7 }; [顺序存储线性表类的组成] DTLib顺

线性表的顺序存储结构

1.顺序表: 线性表占用的存储空间=n*sizeof(ElemType) n为线性表的长度,ElemType为线性表的元素类型,sizeof(ElemType)为每个元素所占存储空间大小(即字节数) 线性表的顺序存储结构利用数组实现,数组的基本类型是线性表中元素类型,数组大小大于等于线性表的长度. 基本运算实现: (1)建立顺序表 void CreateList(SqList *&L,ElemType a[],int n)    //由a中的n个元素建立顺序表 {  int i;    L=(S

线性表之顺序存储结构实现(上)

一,线性表的概念以及数学定义 1.线性表的概念 零个或多个数据元素的有限序列.首先说明这是一个序列,也就是说数据元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且仅有一个前驱和后继. 2.数学定义 若将线性表记为(a1...ai-1,ai,ai+1....an),则线性表中,ai-1领先于ai,ai领先于ai+1,则称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素,当i=1,2....n-1的时候,ai有且仅有一个直接后继元素,当i=2,3

线性表的顺序存储结构之顺序表类的实现_Java

在上一篇博文--线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构--顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放线性表的数据元素,元素在内存的物理存储次序与它们在线性表中的逻辑次序相同,即元素ai与其直接前驱ai-1及直接后继ai+1的存储位置相邻.顺序存储的线性表也成为顺序表(sequential list). 顺序表类SeqList提供线性表基于顺序存储结构的一种实现,它有两个私有成员变量table和n,