一般使用数组(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 }