当前位置:   article > 正文

顺序表的相关操作--静态动态分配实现初始化、插入、删除、查找、判空、求表长_顺序表静态分配了还要动态初始化吗

顺序表静态分配了还要动态初始化吗

一、顺序表的实现:

静态分配顺序表的定义:

  1. #define MaxSize 10 //定义最大长度
  2. typedef struct{
  3. ElemType data[MaxSize]; //用静态的数组存放元素
  4. int length; //顺序表的当前长度
  5. }Sqlist; //顺序表的类型定义

静态分配实现顺序表:

  1. #include <stdio.h>
  2. #define MaxSize 10
  3. Typedef struct {
  4. ElemType data[MaxSize];
  5. int length;
  6. }SqList;
  7. void InitList(Sqlist &L){
  8. int i;
  9. for(i=0;i<MaxSize;i++)
  10. L.data[i]=0; //防止脏数据
  11. L.length=0;
  12. }
  13. int main(){
  14. Sqlist L;
  15. InitSqlist(L);
  16. return 0;
  17. }

动态分配顺序表的定义:

  1. #define InitSize 10 //初始大小
  2. tyepdef struct{
  3. ElemType *data; //data指针指向malloc分配函数占一个ElemType的地址空间
  4. int MaxSize;
  5. int length;
  6. }Sqlist;

动态分配实现顺序表:

  1. #include <stdio.h> //用到malloc和free函数
  2. #define InitSize 10
  3. typedef struct{
  4. int *data;//定义数据元素的类型为int型
  5. int Maxsize;
  6. int length;
  7. }Seqlist
  8. void InitList(Seqlist &L){
  9. L.data=(int *)malloc(InitSize*sizeof(int));
  10. L.length=0
  11. L.MaxSize=InitSize;
  12. }
  13. void IncreaseSize(Seqlist &L, int len){
  14. int *p=L.data;
  15. L.data=(int *)malloc((L.MaxSize+len)sizeof(int)); //申请一块新空间
  16. for(int i=0;i<l.length;i++){
  17. L.data[i]=p[i]; //将数据复制到新区域
  18. }
  19. L.MaxSize=L.MaxSize+len;
  20. free(p); //释放原来的内存空间,p也会被自动收回
  21. }
  22. int main(){
  23. Seqlist L;
  24. InitList(L);
  25. IncreaseSize(L,len);
  26. return 0;
  27. }

二、插入和删除:

ListInsert(&L,i,e)在表中第i位插入指定元素e。

ListDelete(&L,i,&e)在表中第i位指定元素,并用e返回删除元素的值。

静态分配顺序表的插入和删除:

  1. //插入
  2. #define MaxSize 10
  3. typedef struct{
  4. int data[MaxSize];//定义数据元素的类型为int型
  5. int length;
  6. }Sqlist;
  7. void InitList(Sqlist &L){
  8. int j;
  9. for(j=0;j<MaxSize;j++)
  10. L.data[j]=0; //防止脏数据
  11. L.length=0;
  12. }
  13. bool ListInsert(Sqlist &L, int i ,int e){
  14. if(i<1||i>length+1)
  15. return false;
  16. if(L.length>=MaxSize)
  17. return false;
  18. for(intj=L.length;j>=i;j--)
  19. L.data[j]=L.data[j-1];
  20. L.data[i-1]=e;
  21. L.length++;
  22. return true;
  23. }
  24. int main(){
  25. Sqlist L;
  26. InitList(L);
  27. ListInsert(L,i,e);
  28. return 0;
  29. }

最好时间复杂度O(1),最坏时间复杂度O(n),平均时间复杂度为(1/n+1)·n·(n+1)/2=n/2,T(n)=n/2

  1. //删除
  2. #define MaxSize 10
  3. typedef struct{
  4. int data[MaxSize];//定义数据元素的类型为int型
  5. int length;
  6. }Sqlist;
  7. void InitList(Sqlist &L){
  8. for(int j=0;j<MaxSize;j++){
  9. data[j]=0;
  10. }
  11. L.length=0;
  12. }
  13. bool ListDelete(Sqlist &L, int i ,int &e){
  14. if(i<1||i>length)
  15. return false;
  16. e=L.data[i-1];
  17. for(int j=i;j<L.length;j++)
  18. L.data[j-1]=L.data[j];
  19. L.length--;
  20. return true;
  21. }
  22. int main(){
  23. Sqlist L;
  24. InitList(L);
  25. //此处省去插入元素代码
  26. int e = -1;
  27. if(ListDelete(L,i,e))
  28. print("已删除第i个元素,值位%d\n",e);//如果在删除方法中e不加&,则改变的是e的复制品,此处输出的e仍为-1
  29. //同理,Sqlist L也一样
  30. else
  31. print("位序不合法,失败\n");
  32. return 0;
  33. }

最好时间复杂度O(1),最坏时间复杂度O(n),平均时间复杂度为(1/n)·n·(n-1)/2=n/2,T(n)=(n-1)/2

动态分配顺序表的插入和删除:

  1. //插入
  2. #include<stdio.h>
  3. #define InitSize 10
  4. typedef struct{
  5. int *data;//定义数据元素的类型为int型
  6. int MaxSize;
  7. int Length;
  8. }Seqlist;
  9. bool InitList(Seqlist &L){
  10. L.data=(int *)malloc(sizeof(int *));
  11. for(int j=0; j<L.Maxsize; j++){
  12. L.data[j]=0;
  13. L.length=0;
  14. return true;
  15. }
  16. void IncreaseSize(Seqlist &L, int len){
  17. int *p=L.data;
  18. L.data=(int *)malloc((L.MaxSize+len)sizeof(int)); //申请一块新空间
  19. for(int i=0;i<l.length;i++){
  20. L.data[i]=p[i]; //将数据复制到新区域
  21. }
  22. L.MaxSize=L.MaxSize+len;
  23. free(p); //释放原来的内存空间,p也会被自动收回
  24. }
  25. void InsertList(Seqlist &L, int i, int e){
  26. if(i<1||i>length+1)
  27. return false;
  28. if(L.length>=L.MaxSize)
  29. //此处添加代码提示增加空间
  30. IncreaseSize(L, int len);
  31. for(int j=L.length; j>=i; j--)
  32. L.data[j]=L.data[j-1];
  33. L.data[i-1]=e;
  34. L.length++;
  35. return true;
  36. }
  37. int main(){
  38. Seqlist L;
  39. InitList(L);
  40. InsertList(L,i,e);
  41. }
  1. //删除
  2. #include<stdio.h>
  3. #define InitSize 10
  4. typedef struct{
  5. int *data;//定义数据元素的类型为int型
  6. int MaxSize;
  7. int length;
  8. }Seqlist;
  9. void InitList(Seqlist &L){
  10. for(int j=0;j<MaxSize;j++){
  11. L.data[j]=0;
  12. }
  13. L.length=0;
  14. }
  15. bool ListDelete(Seqlist &L, int i ,int &e){
  16. if(i<1||i>length)
  17. return false;
  18. e=L.data[i-1];
  19. for(int j=i;j<L.length;j++)
  20. L.data[j-1]=L.data[j];
  21. L.length--;
  22. return true;
  23. }
  24. int main(){
  25. Sqlist L;
  26. InitList(L);
  27. //此处省去插入元素代码
  28. int e = -1;
  29. if(ListDelete(L,i,e))
  30. print("已删除第i个元素,值位%d\n",e);//如果在删除方法中e不加&,则改变的是e的复制品,此处输出的e仍为-1
  31. //同理,Seqlist L也一样
  32. else
  33. print("位序不合法,失败\n");
  34. return 0;
  35. }

四、静态分配顺序表的查找:

按位查找主代码

GetElem(L,i)获取表中第i个位置的元素  

  1. //以静态分配为例
  2. #define MaxSize 10
  3. typedef struct{
  4. ElemType data[MaxSize];
  5. int Length;
  6. }Sqlist;
  7. ElemType getElem(Sqlist L,int i){
  8. return L.data[i-1];
  9. }
  1. //以动态分配为例
  2. #define InitSize 10
  3. typedef struct{
  4. ElemType *data;//data指针指向malloc分配函数占一个ElemType的地址空间
  5. int MaxSize;
  6. int Length;
  7. }Seqlist;
  8. ElemType getElem(Seqlist L,int i){
  9. return L.data[i-1];//如果sizeof(ElemType)=6,malloc分配到的起始地址空间为200,
  10. //那么data[0]从200开始,data[1]从2006开始
  11. }

两种分配方式的时间复杂度都是O(1)。

按值查找:

LocateElem(L,e),在表L中查找具有给定关键字值的元素。

  1. #define MaxSize 10
  2. typedef struct{
  3. ElemType data[MaxSize];//此处不指定数据类型
  4. int Length;
  5. }Sqlist;
  6. int LocateElem(Sqlist L, ElemType e){
  7. for(int i=0; i<L.length; i++){
  8. if(L.data[i]== e)
  9. return i+1;//返回位序
  10. renturn 0;
  11. }
  1. #define InitSize 10
  2. typedef struct{
  3. ElemType data;//此处不指定数据类型
  4. int Length;
  5. int MaxSize;
  6. }Seqlist;
  7. int LocateElem(Seqlist L, ElemType e){
  8. for(int i=0; i<L.length; i++){
  9. if(L.data[i]== e)
  10. return i+1;//返回位序
  11. renturn 0;
  12. }

两种分配方式按值查找的时间复杂度都是O(n)

顺序表的判空便是长度为0;

  1. bool IsEmpty(SqList L) //判断List是否为空
  2. {
  3. if (L.length == 0)
  4. return OK;
  5. else
  6. return false;
  7. }

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

闽ICP备14008679号