当前位置:   article > 正文

数据结构(1)(顺序表)

数据结构(1)(顺序表)

数据结构

数据结构
    相互之间存在一种或多种特定关系数据元素集合

逻辑结构
        集合,所有数据在同一个集合中,关系平等。(数组中的每一个int)
        线性,数据和数据之间是一对一的关系(队列,链表,数组(线性表的一种体现))
        树, 一对多(高效)
        图,多对多        

物理结构(在内存当中的存储关系)
        顺序存储,数据存放在连续的存储单位中。逻辑关系和物理关系一致
        链式,数据存放的存储单位是随机或任意的,可以连续也可以不连续。

struct Per 数据元素
    {
        char name;//数据项(变量)
        int age;
        char phone;
    }    
            
    struct Per list[100]; //数据对象(数据元素的集合)

数据的类型,ADT    abstract datatype(抽象数据类型) 
        是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。
        原子类型,int,char,float
        结构类型,sturct, union,

        抽象数据类型, 数学模型 + 操作。(相当于c语言.h的内容,=变量+函数)
        
        程序 =  数据 + 算法

算法:
    是解决特定问题求解步骤的描述,计算机中表现为指令的有限序列,每条指令

 算法的特征,
    1,输入,输出特性,输入是可选的,输出是必须的。(输出-->内存上必须要发生变化)
    2,有穷性,执行的步骤会自动结束,不能是死循环,并且每一步是在可以接受的时间内完成。
    3,确定性,同一个输入,会得到唯一的输出。
    4,可行性,每一个步骤都是可以实现的。

算法的设计,
    1,正确性,
        语法正确
        合法的输入能得到合理的结果。
        对非法的输入,给出满足要求的规格说明
        对精心选择,甚至刁难的测试都能正常运行,结果正确
    2,可读性,便于交流,阅读,理解
    3,健壮性,输入非法数据,能进行相应的处理,而不是产生异常
    4,高效,存储低,效率高 

时间复杂度

      一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。也就是执行这个算法所花时间的度量。

(大O阶方法)
        1,用常数1 取代运行时间中的所有加法常数(不论输入数据的大小如何变化,
                                                 执行时间都是一个常数)
        2,在修改后的运行函数中,只保留最高阶项。(An²,Bn³)
        3,如果最高阶存在且不是1,则忽略这个项相乘的常数。(-->n²,n³)

常见的时间复杂度:

O(1) - 常数时间复杂度:算法的执行时间不随输入数据规模变化,如数组访问某个元素。
O(log n) - 对数时间复杂度:二分查找就是一个典型的例子,每一步都将问题规模减半。
O(n) - 线性时间复杂度:遍历数组或列表中的每个元素。
O(n log n) - 线性对数时间复杂度:快速排序、归并排序等高效排序算法。                                  (n体现在拿数的过程需要n次,logn表现在把数放在固定位置上)
O(n^2) - 平方时间复杂度:冒泡排序、选择排序,插入排序等简单排序算法。
O(n^3)、O(2^n)、O(n!) - 随着问题规模的增长,所需时间急剧增加,分别对应立方、指数、阶乘复杂度。

空间复杂度

空间复杂度是衡量算法在运行过程中所需存储空间的度量。

常见空间复杂度:

 O(1):算法使用的额外空间不随输入数据规模改变,如原地排序算法。

 O(n):额外空间正比于输入数据规模,如某些动态规划问题中需要的数组。

 O(n^2):随着输入规模增大,所需空间平方增长,例如某些矩阵运算。数组:整型数组arr的长度为5,因此其空间复杂度为O(5),即O(n

    int arr[5] = {1, 2, 3, 4, 5};

链表:定义了一个包含一个节点的单向链表,其空间复杂度为O(1)。

  1. struct Node {
  2. int data;
  3. struct Node* next;
  4. };

栈:随着MAX_SIZE线性增长,其空间复杂度为O(n)

  1. #define MAX_SIZE 100
  2. struct Stack {
  3. int data[MAX_SIZE];
  4. int top;
  5. };

线性表:

     顺序表是物理地址连续的存储单元依次存储数据的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。
    当线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,为空表。
    在非空的表中每个元素都有一个确定的位置,如果a1是第一个元素,那么an就是第n个元素。

顺序表基本操作:

  1. #ifndef SEQLIST_H
  2. #define SEQLIST_H
  3. typedef struct{
  4. char name[32];
  5. char sex;
  6. int age;
  7. int score;
  8. }DATATYPE;
  9. //typedef int Datatype;
  10. typedef struct list {
  11. DATATYPE *head; //开辟的空间首地址
  12. int tlen; //总长度
  13. int clen; //当前长度
  14. }SeqList;
  15. SeqList* CreateSeqList(int size); //创建
  16. int DestroySeqList(SeqList*sl); /销毁
  17. int InsertTailSeqList(SeqList *list, DATATYPE *data); //尾插
  18. int IsFullSeqList(SeqList *list); //顺序表是否满
  19. int IsEmptySeqList(SeqList *list); //顺序表是否为空
  20. int ShowSeqList(SeqList* list); //打印全部节点数据
  21. int GetSizeSeqList(SeqList* list); //获取当前长度
  22. int FindSeqList(SeqList *list, char *name); //根据名字获取节点下标
  23. DATATYPE* GetSeqListItem(SeqList *list,int ind); //根据下标查询节点
  24. int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos); //指定位置插入
  25. int ModifySeqList(SeqList *list, char *old, DATATYPE *newdata); //修改及诶带你
  26. int DeleteSeqList(SeqList *list, char *name); //删除顺序表
  27. int ClearSeqList(SeqList *list); //删除该表所有元素
  28. #endif // SEQLIST_H

操作实现:

  1. #include "seqlist.h"
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. SeqList *CreateSeqList(int size)
  6. {
  7. if(size<=0)
  8. {
  9. fprintf(stderr,"size is error,range >1");
  10. return NULL;
  11. }
  12. SeqList* sl = ( SeqList*)malloc(sizeof(SeqList));
  13. if(NULL == sl)
  14. {
  15. perror("CreateSeqList malloc");
  16. exit(1);
  17. }
  18. sl->head = (DATATYPE*)malloc(sizeof(DATATYPE)*size);
  19. if(NULL == sl->head)
  20. {
  21. perror("CreateSeqList malloc");
  22. exit(1);
  23. }
  24. sl->tlen = size;
  25. sl->clen = 0;
  26. return sl;
  27. }
  28. int DestroySeqList(SeqList *sl)
  29. {
  30. if(NULL == sl)
  31. {
  32. fprintf(stderr,"SeqList point not NULL");
  33. return 1;
  34. }
  35. if(sl->head)
  36. free(sl->head);
  37. free(sl);
  38. return 0;
  39. }
  40. int InsertTailSeqList(SeqList *list, DATATYPE *data)
  41. {
  42. if(NULL == list)
  43. {
  44. fprintf(stderr,"InsertTailSeqList error,list is null\n");
  45. return -1;
  46. }
  47. if(IsFullSeqList(list))
  48. {
  49. fprintf(stderr,"InsertTailSeqList error ,seqlist is full\n");
  50. return 1;
  51. }
  52. //list->head[list->clen] = *data;
  53. memcpy(&list->head[list->clen] , data,sizeof(DATATYPE));
  54. list->clen++;
  55. return 0;
  56. }
  57. int IsFullSeqList(SeqList *list)
  58. {
  59. if(NULL == list)
  60. {
  61. fprintf(stderr,"IsFullSeqList error,list is null\n");
  62. return -1;
  63. }
  64. return list->clen == list->tlen;
  65. }
  66. int IsEmptySeqList(SeqList *list)
  67. {
  68. return 0==list->clen;
  69. }
  70. int ShowSeqList(SeqList *list)
  71. {
  72. if(NULL == list)
  73. {
  74. fprintf(stderr,"list error,list is null\n");
  75. return -1;
  76. }
  77. int i = 0 ;
  78. int len = GetSizeSeqList(list);
  79. for(i=0;i<len;i++)
  80. {
  81. printf("name:%s sex:%c age:%d score:%d\n",list->head[i].name,list->head[i].sex,list->head[i].age
  82. ,list->head[i].score);
  83. }
  84. return 0;
  85. }
  86. int GetSizeSeqList(SeqList *list)
  87. {
  88. if(NULL == list)
  89. {
  90. fprintf(stderr,"GetSizeSeqList error,list is null\n");
  91. return -1;
  92. }
  93. return list->clen;
  94. }
  95. int FindSeqList(SeqList *list, char *name)
  96. {
  97. if(NULL == list)
  98. {
  99. fprintf(stderr,"FindSeqList error,list is null\n");
  100. return 1;
  101. }
  102. if(IsEmptySeqList(list))
  103. {
  104. fprintf(stderr,"FindSeqList error,seqlist is empty\n");
  105. return -1;
  106. }
  107. int len = GetSizeSeqList(list);
  108. int i = 0 ;
  109. for(i=0;i<len;i++)
  110. {
  111. if(0==strcmp(list->head[i].name,name))
  112. {
  113. return i;
  114. }
  115. }
  116. return -1;
  117. }
  118. DATATYPE *GetSeqListItem(SeqList *list, int ind)
  119. {
  120. if(NULL == list)
  121. {
  122. fprintf(stderr,"seqlist is NULL\n");
  123. return NULL;
  124. }
  125. if(ind<0 || ind>GetSizeSeqList(list))
  126. {
  127. fprintf(stderr,"index is error . range>0 && <size\n");
  128. return NULL;
  129. }
  130. return &list->head[ind];
  131. }
  132. int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos)
  133. {
  134. if(NULL == list)
  135. {
  136. fprintf(stderr,"list is null\n");
  137. return 1;
  138. }
  139. if(IsFullSeqList(list))
  140. {
  141. fprintf(stderr,"list is full\n");
  142. return 1;
  143. }
  144. if(pos<0 ||pos>GetSizeSeqList(list))
  145. {
  146. fprintf(stderr,"pos is error\n");
  147. return 1;
  148. }
  149. int i = 0 ;
  150. for(i =GetSizeSeqList(list); i>=pos ; i-- )
  151. {
  152. memcpy(&list->head[i],&list->head[i-1],sizeof(DATATYPE));
  153. }
  154. memcpy(&list->head[pos],data,sizeof(DATATYPE));
  155. list->clen++;
  156. return 0;
  157. }
  158. int ModifySeqList(SeqList *list, char *old, DATATYPE *newdata)
  159. {
  160. if(NULL == list)
  161. {
  162. fprintf(stderr,"ModifySeqList error,list is null\n");
  163. return 1;
  164. }
  165. int ret = FindSeqList(list,old);
  166. if(-1 == ret)
  167. {
  168. fprintf(stderr,"modify error,can't find\n");
  169. return 1;
  170. }
  171. DATATYPE* tmp = GetSeqListItem(list,ret);
  172. memcpy(tmp,newdata,sizeof(DATATYPE));
  173. return 0;
  174. }
  175. int DeleteSeqList(SeqList *list, char *name)
  176. {
  177. if(NULL == list)
  178. {
  179. fprintf(stderr,"DeleteSeqList error,list is null\n");
  180. return 1;
  181. }
  182. int ret = FindSeqList(list,name);
  183. if(-1 == ret)
  184. {
  185. return 1;
  186. }
  187. else
  188. {
  189. int i = 0 ;
  190. for(i =ret; i <GetSizeSeqList(list)-1 ; i++)
  191. {
  192. memcpy(&list->head[i] ,&list->head[i+1],sizeof(DATATYPE));
  193. }
  194. }
  195. list->clen--;
  196. return 0 ;
  197. }
  198. int CleanSeqList(SeqList *list)
  199. {
  200. if(NULL == list)
  201. {
  202. fprintf(stderr,"CleanSeqList error,list is null\n");
  203. return 1;
  204. }
  205. list->clen = 0 ;
  206. return 0;
  207. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号