标签:i++ 顺序表的实现 style rem size 阶段 define let 连续
线性表是最常用且最简单的一种数据结构(这句话是抄书的)。因为我的第二专业才是计科,在面对数据结构时也经历了地狱一般的理解阶段,所以希望这篇文章可以足够简单地记下自己的所学,也方便大家去理解。
顺序表,书上的定义时指用一组连续的存储单元依次存储线性表的数据元素。通俗理解也就是一张表格,在里头放数据(难道还需要其它解释吗?),你可以想象表格的格子在计算机里面的位置都是连续的,大家排排坐吃果果,跟幼儿园的小朋友一样。
因为顺序表的特点,学过数列的我们都知道,第一个元素a1 = a1,第二个元素a2 = a1 + d (d是a1的长度,这里的长度是指元素所占的d个存储单元),由此我们得知 ai = a1 + (i-1) * d.即第 i 个元素的存储位置。
好,接下来上代码:
1 typedef struct 2 { 3 int *elem; //线性表元素 4 int length; //线性表现有长度 5 int listsize; //线性表最大容量 6 }SqList;
这串代码构建了一个名为SqList的数据类型,它的内部属性含有一个元素,一个长度和一个容量。
C语言可以通过typedef struct 定义一个新的数据类型,自我感觉这个东西有很多的可能性。之前数据结构的课程上老师丝毫没有提及这个东西,弄得我看着这串代码抓瞎。(估计是数据结构老师觉得C语言老师会讲,而C语言老师觉得这个东西考试不考没必要讲……)。
实现以下五个函数块:
1 SqList InitList_Sq(SqList L) //初始化顺序表 2 SqList ListInsert(SqList L, int i, int e) //插入元素 3 SqList ListDelete(SqList L, int i) //删除顺序表第i个元素 4 SqList unionAandB(SqList LA, SqList LB) //将A表和B表拼一起 5 SqList ListShow(SqList L) //打印顺序表
五个基本操作,不骚,陈独秀同志可以站起来看;跟所有变量一样,这个表在定义出来后需要经历初始化、赋值、运算和打印的过程,这里就不多加赘述了,以下是完整代码:
1 #include <stdio.h> 2 #include <malloc.h> 3 #define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量 4 #define LISTINCREMENT 10 //线性表存储空间的分配增量(这里可以不用那么死板) 5 6 typedef struct 7 { 8 int *elem; //线性表元素 9 int length; //线性表现有长度 10 int listsize; //线性表最大容量 11 }SqList; 12 13 SqList InitList_Sq(SqList L) //初始化顺序表 14 { 15 //构造一个空的线性表 16 //SqList L; 17 L.elem = (int*)malloc(LIST_INIT_SIZE*sizeof(int)); //给L中元素分配足够的空间 18 //if(! L.elem) exit(OVERFLOW); 19 if(!L.elem) exit(0); 20 L.length = 0; 21 L.listsize = LIST_INIT_SIZE; 22 return L; 23 } 24 25 SqList ListInsert(SqList L, int i, int e) //插入元素 26 { 27 int j; 28 if( L.length == L.listsize ) 29 { 30 printf("表满\n"); 31 exit(0); 32 } 33 if( i<1 || i>L.listsize ) 34 { 35 printf("插入位置错误\n"); 36 exit(0); 37 } 38 for(j=L.length-1; j>=i-1; j--) 39 { 40 L.elem[j+1] = L.elem[j]; 41 } 42 L.elem[i-1] = e; 43 L.length++; 44 return L; 45 } 46 47 SqList ListDelete(SqList L, int i) //删除顺序表第i个元素 48 { 49 int j; 50 if( i<1 || i>L.length ) 51 { 52 printf("求你找个好位置再来\n"); 53 exit(0); 54 } 55 for(j=i; j<=L.length-1; j++) 56 { 57 L.elem[j-1] = L.elem[j]; 58 } 59 L.length--; 60 return L; 61 } 62 63 SqList unionAandB(SqList LA, SqList LB) //将A表和B表拼一起 64 { 65 SqList L; 66 L.length = 0; 67 int i=0, j=0, k=-1; 68 while( i<LA.length && j<LB.length ) 69 { 70 if(LA.elem[i]<=LB.elem[j]) 71 { 72 L.elem[++k] = LA.elem[i++]; 73 } 74 else 75 { 76 L.elem[++k] = LB.elem[j++]; 77 } 78 } 79 if(i<LA.length) 80 { 81 while(i<LA.length) 82 { 83 L.elem[++k] = LA.elem[i++]; 84 } 85 } 86 else 87 { 88 while(j<LB.length) 89 { 90 L.elem[++k] = LB.elem[j++]; 91 } 92 } 93 L.length = k+1; 94 return L; 95 } 96 97 SqList ListShow(SqList L) //打印顺序表 98 { 99 int i; 100 if(!L.elem) exit(0); 101 for(i=0; i<L.length; i++) 102 { 103 printf("%d\n", L.elem[i]); 104 } 105 } 106 107 int main(int argc, char const *argv[]) //测试 108 { 109 int i, j; 110 SqList L; 111 L = InitList_Sq(L); 112 L = ListInsert(L,1,1); 113 L = ListInsert(L,2,2); 114 printf("the List is L:\n"); 115 ListShow(L); 116 SqList L2; 117 L2 = InitList_Sq(L2); 118 L2 = ListInsert(L2,1,3); 119 L2 = ListInsert(L2,2,4); 120 L2 = ListInsert(L2,3,5); 121 printf("the next List is L2:\n"); 122 ListShow(L2); 123 SqList L3; 124 L3 = InitList_Sq(L3); 125 L3 = unionAandB(L,L2); 126 printf("the last List is L3:\n"); 127 ListShow(L3); 128 //printf("%d\n", L3.length); 129 return 0; 130 }
这个逻辑结构还是比较浅显易懂的,大神那么多我就不必再献丑了,如有意见建议,欢迎指出~
标签:i++ 顺序表的实现 style rem size 阶段 define let 连续
原文地址:https://www.cnblogs.com/somethingfornothing/p/9062421.html