码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-07 18:37:08      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

标签:

原文地址:http://www.cnblogs.com/hebao0514/p/4627530.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!