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("找不到该值!")
        }
    }
}
    It's a lonely road!!!
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号