当前位置:   article > 正文

数据结构:(1)线性表

数据结构:(1)线性表

一、基本概念 

概念:零个或多个数据元素有限序列
    
    元素之间是有顺序了。如果存在多个元素,第一个元素无前驱最后一个没有后继其他的元素只有一个前驱和一个后继
    
    当线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,为空表。在非空的表中每个元素都有一个确定的位置,如果a1是第一个元素,那么an就是第n个元素。

线性表的常规操作  ADT
typedef struct person {
    char name[32];
    char sex;
    int age;
    int score;
}DATATYPE;
//typedef int Datatype;

typedef struct list {
    DATATYPE *head;//数组名
    int tlen;//数组有多大
    int clen;//当前存储了几个元素
}SeqList;


例:

1.SeqList *CreateSeqList(int len);
2.int DestroySeqList(SeqList *list);
3.int ShowSeqList(SeqList *list);
4.int InsertTailSeqList(SeqList *list, DATATYPE data);
5.int IsFullSeqList(SeqList *list);
6.int IsEmptySeqList(SeqList *list);
7.int InsertPosSeqList(SeqList *list, DATATYPE data, int pos);
8.int FindSeqList(SeqList *list, char *name);
9.int ModifySeqList(SeqList *list, char *old, DATATYPE new);
10.int DeleteSeqList(SeqList *list, char *name);
11.int ClearSeqList(SeqList *list);

内存泄露检测工具
sudo apt-get install valgrind
valgrind ./all

1. CreateSeqList 创建表

  1. SeqList *CreateSeqList(int size)
  2. {
  3. if(size<=0)
  4. {
  5. fprintf(stderr,"size is error,range >1");
  6. return NULL;
  7. }
  8. SeqList* sl = ( SeqList*)malloc(sizeof(SeqList));
  9. if(NULL == sl)
  10. {
  11. perror("CreateSeqList malloc");
  12. exit(1);
  13. }
  14. sl->head = (DATATYPE*)malloc(sizeof(DATATYPE)*size);
  15. if(NULL == sl->head)
  16. {
  17. perror("CreateSeqList malloc");
  18. exit(1);
  19. }
  20. sl->tlen = size;
  21. sl->clen = 0;
  22. return sl;
  23. }

2. DestroySeqList 销毁表

  1. int DestroySeqList(SeqList *sl)
  2. {
  3. if(NULL == sl)
  4. {
  5. fprintf(stderr,"SeqList point not NULL");
  6. return 1;
  7. }
  8. if(sl->head)
  9. free(sl->head);
  10. free(sl);
  11. return 0;
  12. }

3. ShowSeqList 遍历表,打印内容

  1. int ShowSeqList(SeqList *list)
  2. {
  3. if(NULL == list)
  4. {
  5. fprintf(stderr,"list error,list is null\n");
  6. return -1;
  7. }
  8. int i = 0 ;
  9. int len = GetSizeSeqList(list);
  10. for(i=0;i<len;i++)
  11. {
  12. printf("name:%s sex:%c age:%d score:%d\n",list->head[i].name,list->head[i].sex,list->head[i].age
  13. ,list->head[i].score);
  14. }
  15. return 0;
  16. }

4. InsertTailSeqList 尾插

  1. int InsertTailSeqList(SeqList *list, DATATYPE *data)
  2. {
  3. if(NULL == list)
  4. {
  5. fprintf(stderr,"InsertTailSeqList error,list is null\n");
  6. return -1;
  7. }
  8. if(IsFullSeqList(list))
  9. {
  10. fprintf(stderr,"InsertTailSeqList error ,seqlist is full\n");
  11. return 1;
  12. }
  13. memcpy(&list->head[list->clen] , data,sizeof(DATATYPE));
  14. list->clen++;
  15. return 0;
  16. }

5. IsFullSeqList 表满判断

  1. int IsFullSeqList(SeqList *list)
  2. {
  3. if(NULL == list)
  4. {
  5. fprintf(stderr,"IsFullSeqList error,list is null\n");
  6. return -1;
  7. }
  8. return list->clen == list->tlen;
  9. }

6. IsEmptySeqList 表空判断

  1. int IsEmptySeqList(SeqList *list)
  2. {
  3. return 0==list->clen;
  4. }

7. InsertPosSeqList 任意位置插入

  1. int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos)
  2. {
  3. if(NULL == list)
  4. {
  5. fprintf(stderr,"list is null\n");
  6. return 1;
  7. }
  8. if(IsFullSeqList(list))
  9. {
  10. fprintf(stderr,"list is full\n");
  11. return 1;
  12. }
  13. if(pos<0 ||pos>GetSizeSeqList(list))
  14. {
  15. fprintf(stderr,"pos is error\n");
  16. return 1;
  17. }
  18. int i = 0 ;
  19. for(i =GetSizeSeqList(list); i>=pos ; i-- )
  20. {
  21. memcpy(&list->head[i],&list->head[i-1],sizeof(DATATYPE));
  22. }
  23. memcpy(&list->head[pos],data,sizeof(DATATYPE));
  24. list->clen++;
  25. return 0;
  26. }

8. FindSeqList 查找表内某个内容,返回其下标

  1. int FindSeqList(SeqList *list, char *name)
  2. {
  3. if(NULL == list)
  4. {
  5. fprintf(stderr,"FindSeqList error,list is null\n");
  6. return 1;
  7. }
  8. if(IsEmptySeqList(list))
  9. {
  10. fprintf(stderr,"FindSeqList error,seqlist is empty\n");
  11. return -1;
  12. }
  13. int len = GetSizeSeqList(list);
  14. int i = 0 ;
  15. for(i=0;i<len;i++)
  16. {
  17. if(0==strcmp(list->head[i].name,name))
  18. {
  19. return i;
  20. }
  21. }
  22. return -1;
  23. }

9. ModifySeqList 修改表内某个内容

  1. int ModifySeqList(SeqList *list, char *old, DATATYPE *newdata)
  2. {
  3. if(NULL == list)
  4. {
  5. fprintf(stderr,"ModifySeqList error,list is null\n");
  6. return 1;
  7. }
  8. int ret = FindSeqList(list,old);
  9. if(-1 == ret)
  10. {
  11. fprintf(stderr,"modify error,can't find\n");
  12. return 1;
  13. }
  14. DATATYPE* tmp = GetSeqListItem(list,ret);
  15. memcpy(tmp,newdata,sizeof(DATATYPE));
  16. return 0;
  17. }

10. DeleteSeqList 删除表的内容

  1. int DeleteSeqList(SeqList *list, char *name)
  2. {
  3. if(NULL == list)
  4. {
  5. fprintf(stderr,"DeleteSeqList error,list is null\n");
  6. return 1;
  7. }
  8. int ret = FindSeqList(list,name);
  9. if(-1 == ret)
  10. {
  11. return 1;
  12. }
  13. else
  14. {
  15. int i = 0 ;
  16. for(i =ret; i <GetSizeSeqList(list)-1 ; i++)
  17. {
  18. memcpy(&list->head[i] ,&list->head[i+1],sizeof(DATATYPE));
  19. }
  20. }
  21. list->clen--;
  22. return 0 ;
  23. }

11. ClearSeqList 把表清空

  1. int CleanSeqList(SeqList *list)
  2. {
  3. if(NULL == list)
  4. {
  5. fprintf(stderr,"CleanSeqList error,list is null\n");
  6. return 1;
  7. }
  8. list->clen = 0 ;
  9. return 0;
  10. }

main.c 

  1. #include <stdio.h>
  2. #include "seqlist.h"
  3. int main()
  4. {
  5. SeqList* sl = CreateSeqList(10);
  6. DATATYPE data[5]={
  7. {"zhangsan",'m',20,70},
  8. {"lisi",'f',21,60},
  9. {"wangmazi",'m',25,80},
  10. {"liubei",'f',30,85},
  11. {"caocao",'f',40,90},
  12. };
  13. InsertTailSeqList(sl,&data[0]);
  14. InsertTailSeqList(sl,&data[1]);
  15. InsertTailSeqList(sl,&data[2]);
  16. printf("----------------show------------------\n");
  17. ShowSeqList(sl);
  18. printf("----------------find------------------\n");
  19. char find_name[50]="lisi";
  20. int ret = FindSeqList(sl,find_name);
  21. if(-1 == ret)
  22. {
  23. printf("can't find person ,%s\n",find_name);
  24. }
  25. else
  26. {
  27. DATATYPE* tmp = GetSeqListItem(sl,ret) ;
  28. printf("name:%s score:%d\n",tmp->name,tmp->score);
  29. }
  30. printf("----------------pos------------------\n");
  31. InsertPosSeqList(sl,&data[3],3);
  32. ShowSeqList(sl);
  33. printf("----------------modify------------------\n");
  34. ModifySeqList(sl,"li1si",&data[4]);
  35. ShowSeqList(sl);
  36. printf("----------------delete------------------\n");
  37. DeleteSeqList(sl,"zhangsan");
  38. ShowSeqList(sl);
  39. DestroySeqList(sl);
  40. printf("Hello World!\n");
  41. return 0;
  42. }

 

 

二、线性表顺序存储的优点、缺点

优点

1.无需为表中的逻辑关系增加额外的存储空间
2.可以快速随机访问元素,时间复杂度-->O(1),效率高 

缺点

1.插入,删除元素需要移动元素,时间复杂度-->O(n),效率较低
2.无法动态存储

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/892015
推荐阅读
相关标签
  

闽ICP备14008679号