当前位置:   article > 正文

使用C语言实现动态顺序表

使用C语言实现动态顺序表

目录

1.顺序表的定义

2.申请空间

 (1)申请空间的方式一

(2)申请空间的方式二

3.动态顺序表的定义

4.动态顺序表的相关操作

(1)初始化

(2)申请空间

(3)顺序表的判空和判满

(4)顺序表的插入和定位插入元素

(5)定位删除元素和按值删除元素

(6)删除表和打印

(7)主函数

(8)测试


1.顺序表的定义

用顺序存储的方式实现线性表顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系又存储的邻接关系体现。

注:之所以要提出动态顺序表,是因为如果使用静态顺序表的话,空间上很容易就处于满的状态,但是如果一下子申请很大的空间的话,那么会造成空间上的浪费,所以根据需要申请空间的大小是必要的。

使用C语言实现静态顺序表

2.申请空间

 (1)申请空间的方式一

  1. ElemType *p=L.data;
  2. L.data=(ElemType*)malloc((L.MaxSize+len)*sizeof(ElemType));
  3. for(int i=0;i<L.length;i++){
  4. L.data[i]=p[i];
  5. }
  6. L.MaxSize=L.MaxSize+len;
  7. free(p);

(2)申请空间的方式二

  1. ElemType *newBase=(ElemType*)realloc(L.data,(L.MaxSize+len)*sizeof(ElemType));
  2. L.data=newBase;
  3. L.MaxSize+=len;

3.动态顺序表的定义

  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #define MAXSIZE 5
  4. typedef int ElemType;
  5. typedef struct {
  6. ElemType*data;
  7. int length;
  8. int MaxSize;
  9. }SqList;

4.动态顺序表的相关操作

(1)初始化

  1. //顺序表的初始化
  2. void InitSqList(SqList&L){
  3. L.data=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
  4. L.MaxSize=MAXSIZE;
  5. L.length=0;
  6. }

(2)申请空间

  1. //增加顺序表的容量
  2. void IncreaseSize(SqList&L,int len){
  3. //定义方式一
  4. // ElemType *p=L.data;
  5. // L.data=(ElemType*)malloc((L.MaxSize+len)*sizeof(ElemType));
  6. // for(int i=0;i<L.length;i++){
  7. // L.data[i]=p[i];
  8. // }
  9. // L.MaxSize=L.MaxSize+len;
  10. // free(p);
  11. //方式二
  12. ElemType *newBase=(ElemType*)realloc(L.data,(L.MaxSize+len)*sizeof(ElemType));
  13. L.data=newBase;
  14. L.MaxSize+=len;
  15. }

(3)顺序表的判空和判满

  1. //操作清单
  2. void MenuSqList(){
  3. printf("-------------1.插入操作-------------\n");
  4. printf("-------------2.定位插入操作---------\n");
  5. printf("-------------3.查找操作-------------\n");
  6. printf("-------------4.定位删除操作---------\n");
  7. printf("-------------5.按值删除元素---------\n");
  8. printf("-------------6.删除整个顺序表-------\n");
  9. printf("-------------7.打印操作-------------\n");
  10. printf("-------------8.结束操作-------------\n");
  11. }
  12. //判断顺序表是否空
  13. bool IsEmpty (SqList L){
  14. if(L.length<=0){
  15. return true;
  16. }else {
  17. return false;
  18. }
  19. }
  20. //判断顺序表是否为满
  21. bool IsFull(SqList L){
  22. if(L.length>=L.MaxSize){
  23. return true;
  24. }else{
  25. return false;
  26. }
  27. }

(4)顺序表的插入和定位插入元素

  1. //顺序表的插入操作
  2. void ListInsert(SqList&L,ElemType e) {
  3. if(IsFull(L)){
  4. printf("顺序表已满!\n");
  5. return ;
  6. }
  7. L.data[L.length]=e;
  8. L.length++;
  9. }
  10. //定位向顺序表中插入数据
  11. void ListInsertLocate(SqList&L,int i,ElemType e){
  12. if(i<0||i>L.length+1){
  13. printf("输入的插入元素位置不合法\n");
  14. return ;
  15. }
  16. if(L.length>=L.MaxSize){
  17. printf("存储空间已满!\n");
  18. printf("请输入申请的空间大小: ");
  19. int len=0;
  20. scanf("%d",&len);
  21. IncreaseSize(L,len);
  22. printf("申请空间成功,目前空间大小: %d\n",L.MaxSize);
  23. return ;
  24. }
  25. for(int j=L.length;j>=i;j--){
  26. L.data[j]=L.data[j-1];
  27. }
  28. L.data[i-1]=e;
  29. L.length++;
  30. }

(5)定位删除元素和按值删除元素

  1. //定位删除操作
  2. void DeleteElemType(SqList&L,int i,ElemType&e){
  3. if(i<0||i>L.length+1){
  4. printf("输入的插入元素位置不合法\n");
  5. return ;
  6. }
  7. e=L.data[i-1];
  8. for(int j=i-1;j<L.length;j++){
  9. L.data[j]=L.data[j+1];
  10. }
  11. L.length--;
  12. }
  13. //顺序表按值删除(删除第一个元素为e的值)
  14. void DeleteElem(SqList&L,ElemType&e) {
  15. int index=0;
  16. for(int i=0;i<L.length;i++){
  17. if(L.data[i]==e){
  18. index=i;
  19. break;
  20. }
  21. }
  22. for(int j=index;j<L.length;j++){
  23. L.data[j]=L.data[j+1];
  24. }
  25. L.length--;
  26. }

(6)删除表和打印

  1. //删除顺序表
  2. void DeleteSqList(SqList&L){
  3. for(int i=0;i<L.length;i++){
  4. L.data[i]=0;
  5. }
  6. L.length=0;
  7. }
  8. //顺序表的打印操作
  9. void PrintSqList(SqList L){
  10. for(int i=0;i<L.length;i++){
  11. printf("%d\t",L.data[i]);
  12. }
  13. printf("\n");
  14. }

(7)主函数

  1. int main() {
  2. SqList L;
  3. //对顺序表进行初始化
  4. InitSqList(L);
  5. //对顺序表进行插入操作
  6. ElemType x;
  7. int flag=-1;
  8. //各种操作
  9. while(1) {
  10. int i=0;
  11. ElemType e=0;
  12. MenuSqList();
  13. printf("请输入操作: ");
  14. scanf("%d",&flag);
  15. switch(flag){
  16. case 1:
  17. printf("请输入元素(-1_end): ");
  18. scanf("%d",&x);
  19. i=1;
  20. while(x!=-1) {
  21. ListInsert(L,x);
  22. printf("请输入元素(-1_end): ");
  23. scanf("%d",&x);
  24. i++;
  25. if(i>=L.MaxSize+1){
  26. printf("存储空间已满!\n");
  27. break;
  28. }
  29. }
  30. break;
  31. case 2:
  32. printf("请输入元素插入位置: \n");
  33. scanf("%d",&i);
  34. printf("请输入元素: ");
  35. scanf("%d",&x);
  36. ListInsertLocate(L,i,x);
  37. break;
  38. case 3:
  39. printf("请输入查找元素位置: ");
  40. scanf("%d",&i);
  41. if(i<0||i>=L.length+1){
  42. printf("输入的查找元素位置不合法!\n");
  43. break;
  44. }
  45. printf("Elem = %d\n",L.data[i-1]);
  46. printf("删除元素成功!\n");
  47. break;
  48. case 4:
  49. printf("请输入删除的定位位置: ");
  50. scanf("%d",&i);
  51. DeleteElemType(L,i,e);
  52. printf("删除成功元素=%d\n",e);
  53. break;
  54. case 5:
  55. printf("请输入要删除的元素: ");
  56. scanf("%d",&e);
  57. DeleteElem(L,e);
  58. break;
  59. case 6:
  60. DeleteSqList(L);
  61. printf("删除成功!\n");
  62. break;
  63. case 7:
  64. PrintSqList(L);
  65. break;
  66. default:
  67. printf("结束操作\n");
  68. }
  69. if(flag==8){
  70. break;
  71. }
  72. }
  73. return 0;
  74. }

(8)测试

 

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

闽ICP备14008679号