数据结构-顺序表的实现

线性表是最常用且最简单的一种数据结构(这句话是抄书的)。因为我的第二专业才是计科,在面对数据结构时也经历了地狱一般的理解阶段,所以希望这篇文章可以足够简单地记下自己的所学,也方便大家去理解。

顺序表,书上的定义时指用一组连续的存储单元依次存储线性表的数据元素。通俗理解也就是一张表格,在里头放数据(难道还需要其它解释吗?),你可以想象表格的格子在计算机里面的位置都是连续的,大家排排坐吃果果,跟幼儿园的小朋友一样。

因为顺序表的特点,学过数列的我们都知道,第一个元素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 }

这个逻辑结构还是比较浅显易懂的,大神那么多我就不必再献丑了,如有意见建议,欢迎指出~

猜你喜欢

转载自www.cnblogs.com/somethingfornothing/p/9062421.html