9.7顺序表之增、删、改、查

9.7顺序表之增、删、改、查

向顺序表中增数据

  • 插入到顺序表头

  • 插入到顺序表中间部分

  • 插入到顺序表尾部,作为最后一个元素


插入元素的特点

步骤:

  • 检查传入的索引是否合法

  • 判断顺序表是否有多余的存储空间提供给插入的元素,如果没有,需要申请

  • 将元素整体向后移动一格或者直接在后一位直接插入

插入元素图示:

由上诉可知可以写三个方法和一个调用方法来实现:

检查插入位置是否合法:

int checkInt(int index)
{
   //判断插入的位置本身是否由问题
   if(index>t.length+1||index<1)
  {
       printf("插入位置有问题!!!");
       return 0;
  }
   return index;
}

判断顺序表空间是否足够插入:

table checkSize(Table t)
{
   if(t.length == t.size)
  {
       //扩容
       t.head = (int *)realloc(t.head, (t.size+1)*sizeof(int));
       return t;
  }
   return t;
}

实现插入元素的方法:

table addTable(table t, int element, int index)
{
   //先判断传入的index
   checkInt(index);
   //如果传入的index>t.length直接扩容然后插入在最后一位
   if(index>t.length)
  {
       t.head = (int *)realloc(t.head, (t.size+1)*sizeof(int));
       index = t.length+1;
       t.head[index] = element;
  }else
  {
       //判断当前的顺序表是否有空间
       checkSize(t);
       //插入操作,需要将从插入位置开始的后续元素,逐个后移
       for(int j=t.length-1; j>=index-1; j++)
      {
           t.head[j+1] = t.head[j];
      }
       
       //后移完成后,直接将所需插入元素,添加到顺序表的相应位置
       t.head[index-1] = element;
       //让长度+1
       t.length++;
       
       //返回顺序表对象
       return t;
  }
}

动态数组额外申请更多物理空间使用的是 realloc 函数。并且,在实现后续元素整体后移的过程,目标位置其实是有数据的,还是 3,只是下一步新插入元素时会把旧元素直接覆盖。--->所以是将原来的该位置往后的数据整体的向后复制了一遍

删除元素的特点

步骤:

  • 找到目标元素

  • 并将其后续所有元素整体前移 1 个位置

删除元素图示:

代码示例:

table delTable(table t, int index)
{
   //判断索引是否违法
   checkInt(index);
   //删除操作--->从传入的位置开始,将传入的位置后面的元素复制到传入的位置处
   for(int i=index; i<t.length; i++)
  {
       t.head[i-1] = t.head[i];
  }
   
   //位置缩短
   t.length--;
   return t;
}

顺序表改元素

步骤:

  • 找到目标元素

  • 直接赋值

示例代码:

table changeTable(table t, int element, int newElement)
{
   //判断索引是否合法
   checkInt(index);
   //循环找位置
   for(int i=0; i<t.length; i++)
  {
       if(t.head[i] == element)
      {
           t.head[i] = newElement;
      }else
      {
           printf("元素有误");
           exit(0);
      }
  }
}

顺序表查找元素

步骤:

  • 传入表格和需要查找的元素

  • 循环进行查找

int selectEle(table t, int element)
{
   //循环查找
   for(int j=0; j<t.length; j++)
  {
       if(t.head[j] == element)
      {
           printf("值是:");
           printf(element);
      }else
      {
           printf("找不到该值!")
      }
  }
}

 

原文地址:https://www.cnblogs.com/JunkingBoy/p/15239784.html