数据结构笔记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 }  

 

你可能感兴趣的:(ArrayList)