• 使用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
    2. #include
    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
    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
    17. if(L.data[i]==e){
    18. index=i;
    19. break;
    20. }
    21. }
    22. for(int j=index;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
    4. L.data[i]=0;
    5. }
    6. L.length=0;
    7. }
    8. //顺序表的打印操作
    9. void PrintSqList(SqList L){
    10. for(int i=0;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)测试

     

  • 相关阅读:
    【week307-amazon】leetcode2386. 找出数组的第 K 大和
    C++ 结构体
    博客整理 vim编译器
    cad由于找不到mfc140u.dll怎么回事?mfc140u.dll丢失的解决方法
    Docker 核心知识回顾
    linux统计程序耗时和最大内存消耗
    08、SpringCloud之SpringBoot-Admin监控组件学习笔记
    Eclipse安装使用UML插件
    【简记】getprop, setprop 命令使用
    一、Azkaban简明笔记
  • 原文地址:https://blog.csdn.net/Keep_Trying_Go/article/details/126198225