• 数据结构-顺序表操作


    1、插入操作:

            (1)判断插入的位置是否合理。

                    ①不能大于所有元素再加1的值,否则按一次插入一个元素来讲,多出两个空位是不合理的。防止上溢出。

                    ②不能插入小于1的值,防止下溢出。

            (2)给新插入的元素分配空间。

                    ①这里使用realloc()函数用来给动态数组额外申请更多的物理空间。

                    size+1:把顺序表的实际容量增加一个单位。

            (3)进行插入操作时,要目标位置开始的元素依次向后移动,最后将目标位置腾出,把元素放入其中。

                    length++:是顺序表中存放的数据加一。

    1. //向数据表中插入元素
    2. table insertTable(table t,int elem,int pos)//t:顺序表结构体、elem:要插入的元素 pos:插入的位置
    3. {
    4. //1、检测插入位置是否合理:如果大于长度+1或者小于1则不合理
    5. if(pos>t.length+1||pos<1)
    6. {
    7. printf("插入位置有问题\n");
    8. return t;
    9. }
    10. //2、插入操作前,先检查顺序表中是否有空余位置,如果没有动态分配一个位置
    11. if(t.length>=t.size)//逻辑表长==实际空间大小
    12. {
    13. t.head=(int*)realloc(t.head,(t.size+1)*sizeof(int));
    14. if(!t.head)
    15. {
    16. printf("存储分配失败。\n");
    17. return t;
    18. }
    19. //分配成功,实际大小加一
    20. t.size+=1;
    21. }
    22. //3、插入操作,从插入位置开始的后续元素逐个后移
    23. for(int i=t.length-1;i>=pos-1;i--)
    24. {
    25. t.head[i+1]=t.head[i];
    26. }
    27. //4、向腾出的位置中插入目标元素
    28. t.head[pos-1]=elem;
    29. //5、逻辑表长+1
    30. t.length++;
    31. return t;
    32. }

    2、删除操作: 

            (1)判断删除元素的位置是否正确。

                            ①不能大于所有元素的实际个数,否则没有意义。

                            ②不能小于1,否则无意义。       

    (2)进行删除操作,从目标元素开始,将它后面的元素依次向前一个元素进行覆盖。

    1. table delTable(table t,int pos)
    2. {
    3. //1、判断删除位置是否有误
    4. if(pos>t.length||pos<1)
    5. {
    6. printf("被删除元素的位置有误\n");
    7. return t;
    8. }
    9. //2、删除操作
    10. for(int i=pos;i
    11. {
    12. t.head[i-1]=t.head[i];
    13. }
    14. //3、长度-1
    15. t.length--;
    16. return t;
    17. }

    3、查找操作:

            (1)从顺序表的第一个元素开始进行顺序查找

    1. //顺序表查找操作
    2. int selectTable(table t,int elem)
    3. {
    4. for(int i=0;i
    5. {
    6. if(t.head[i]==elem)
    7. {
    8. return i+1;
    9. }
    10. }
    11. return -1;//查找失败返回-1
    12. }

    4、修改操作:

            (1)可以通过函数嵌套,用查找函数找到目标位置,然后通过数组下标进行赋值。

    1. //顺序表修改元素
    2. table changeTable(table t,int elem,int newElem)
    3. {
    4. int pos=selectTable(t,elem);//1、先查找到目标元素位置
    5. t.head[pos-1]=newElem;//2、用新的值进行原来位置的覆盖
    6. return t;
    7. }

    5、完整代码:

    1. #include
    2. #include
    3. #define Size 5
    4. //定义顺序表
    5. typedef struct Table{
    6. int *head;//动态数组首地址
    7. int length;//数组逻辑长度
    8. int size;//数组物理长度
    9. }table;//给struct Table起的别名
    10. //顺序表的初始化
    11. table initTable(){
    12. table t;
    13. t.head=(int*)malloc(Size*sizeof(int));//给数组分配整块的地址空间
    14. if(!t.head)
    15. {
    16. printf("初始化失败\n");
    17. exit(0);
    18. }
    19. t.length=0;
    20. t.size=Size;
    21. return t;
    22. }
    23. //顺序表的插入
    24. table insertTable(table t,int elem,int pos){
    25. //1、判断插入位置是否合理
    26. if(pos<1||pos>t.length+1){
    27. printf("插入位置错误!\n");
    28. return t;
    29. }
    30. //2、为插入值新分配一个空间
    31. if(t.length>=t.size){
    32. t.head=(int*)realloc(t.head,(t.size+1)*sizeof(int));
    33. if(!t.head)
    34. {
    35. printf("新分配空间失败!\n");
    36. }
    37. t.size+=1;
    38. }
    39. //3、插入操作
    40. for(int i=t.length-1;i>=pos-1;i--){
    41. t.head[i+1]=t.head[i];
    42. }
    43. t.head[pos-1]=elem;
    44. t.length++;
    45. return t;
    46. }
    47. //顺序表的删除
    48. table delTable(table t,int pos){
    49. //1、判断删除位置是否合理
    50. if(pos>t.length||pos<1){
    51. printf("删除位置错误!\n");
    52. return t;
    53. }
    54. //2、删除操作
    55. for(int i=pos-1;i
    56. t.head[i]=t.head[i+1];
    57. }
    58. t.length--;
    59. return t;
    60. }
    61. //顺序表的查找
    62. int searchTable(table t,int elem){
    63. for(int i=0;i
    64. if(t.head[i]==elem){
    65. return i+1;
    66. }
    67. }
    68. }
    69. //顺序表的修改
    70. table changeTable(table t,int elem,int newElem){
    71. int pos = searchTable(t,elem);
    72. t.head[pos-1]=newElem;
    73. return t;
    74. }
    75. //输出顺序表中的元素
    76. void displayTable(table t){
    77. for(int i=0;i
    78. printf("%d ",*(t.head+i));
    79. }
    80. printf("\n");
    81. }
    82. int main()
    83. {
    84. //顺序表初始化并赋值
    85. table t=initTable();
    86. for(int i=0;i
    87. t.head[i]=i;
    88. t.length++;
    89. }
    90. //原顺序
    91. printf("顺序表原顺序 : ");
    92. displayTable(t);
    93. //向t中插入元素
    94. printf("第二个位置插入元素 9 : ");
    95. t=insertTable(t,9,2);
    96. displayTable(t);
    97. //删除t中元素
    98. printf("删除位置三中的元素 : ");
    99. t=delTable(t,3);
    100. displayTable(t);
    101. //查找t中元素
    102. int a = searchTable(t,3);
    103. printf("查找顺序表中3的位置 : %d\n",a);
    104. //修改t中元素
    105. printf("将顺序表中的2修改成8 : ");
    106. t=changeTable(t,2,8);
    107. displayTable(t);
    108. return 0;
    109. }

    输出结果:

     

  • 相关阅读:
    第八章 集成学习
    CakePHP 3.x/4.x反序列化RCE链
    java性能安全:OOM问题排查、Arthas分析高CPU问题、防止Dos攻击
    计算机毕业设计ssmJava防作弊的电子投票系统rgobs系统+程序+源码+lw+远程部署
    【Python】从同步到异步多核:测试桩性能优化,加速应用的开发和验证
    方程、等式、函数
    1387. 将整数按权重排序
    112. 使用自开发的代理服务器解决 SAP UI5 FileUploader 上传文件时遇到的跨域访问错误
    阿里云ECS导入本地,解决部署的问题
    Java.lang.Class类 isInterface()方法有什么功能呢?
  • 原文地址:https://blog.csdn.net/qq_51701007/article/details/125986981