线性表(顺序表)的查找、新增、和删除

/************************************************************************
*
* 文件名:2.1.1.cpp
*
* 文件描述:使用线性表的顺序表来实现初始化、查找、插入、删除
*
* 创建人:  fdk

* 时  间:  2018-07-28
*
* 版本号:1.0
*
* 修改记录:
*
************************************************************************/
#include <iostream>
#include <cstdlib>
/*定义最大长度是1000*/
#define MAXSIZE 1000
using namespace std;

/*定义结构体*/
typedef struct
{
    int data[MAXSIZE];
    int last;
}List;

/*初始化函数,建立空的顺序表*/
List* MakeEmpty();

/*查找某一特定值,并返回下标*/
int Find(int x, List* Ptrl);

/*插入,在第i个位置上插入值为X的新元素*/
void Insert(int x, int i, List* Ptrl);

/*删除,删除表上的第i个位置的元素*/
void Delete(int i, List* Ptrl);

/*遍历,将一个顺序表上的所有元素遍历一遍*/
void OutPrint(List* Ptrl);
int main()
{
    int arrays[] = {2, 4, 5, 1, -2, 4, 6, 10};

    List* l = MakeEmpty();

    /*给顺序表赋值*/
    for (int i = 1; i <= 8; i++)
    {
        Insert(arrays[i-1], i, l);
    }
    /*遍历输出*/
    OutPrint(l);

    /*查找第5个位置上的元素*/
    cout << Find(5, l) << endl;

    /*插入在8个位置插入18*/
    Insert(18, 8, l);

    /*删除表上第1个元素*/
    Delete(1, l);

    /*遍历处理后的顺序表*/
    OutPrint(l);
    return 0;
}

/*初始化函数,建立空的顺序表*/
List* MakeEmpty()
{
    List* Ptrl;

    /*申请一个当前的结构,malloc函数向系统申请分配指定内存的空间*/
    Ptrl = (List*)malloc(sizeof (List));

    /*表示当前表没有元素*/
    Ptrl->last = -1;
    return Ptrl;
}

/*查找某一特定值,并返回下标*/
int Find(int x, List* Ptrl)
{
    int i = 0;
    while (i <= Ptrl->last && Ptrl->data[i] != x)
    {
        i++;
    }
    /*如果没有找到,返回-1*/
    if (i > Ptrl->last)
    {
        return -1;
    }
    /*返回下标*/
    else
    {
        return i;
    }
}

/*插入,在第i个位置上插入值为X的新元素*/
void Insert(int x, int i, List* Ptrl)
{
    int j;

    /*如果表满,则不能插入*/
    if (Ptrl->last == MAXSIZE -1)
    {
        cout << "表满不能插入" << endl;
        return;
    }
    if (i < 1 || i > Ptrl->last + 2)
    {
        cout << "位置不合法!" << endl;
        return;
    }
    /*将i-1之后的位置全部后移*/
    for (j = Ptrl->last; j >= i - 1; j--)
    {
        Ptrl->data[j+1] = Ptrl->data[j];
    }
    /*将新元素x插入*/
    Ptrl->data[i-1] = x;

    /*last仍指向最后一个元素*/
    Ptrl->last++;
}

/*删除,删除表上的第i个位置的元素*/
void Delete(int i, List* Ptrl)
{
    int j;
    if (i < 1 || i > Ptrl->last + 1)
    {
        cout << "删除有误,不存在该位置的元素" << endl;
        return;
    }
    /*将第i个位置之后的元素依次往前移动*/
    for (j = i; j <= Ptrl->last; j++)
    {
        Ptrl->data[j-1] = Ptrl->data[j];
    }
    /*last仍指向最后一个元素*/
    Ptrl->last--;
    return;
}

/*遍历,将一个顺序表上的所有元素遍历一遍*/
void OutPrint(List* Ptrl)
{
    for (int i = 0; i <= Ptrl->last; i++)
    {
        cout << Ptrl->data[i] << " ";
    }
    cout << endl;
}

猜你喜欢

转载自blog.csdn.net/fdkneverstoplearning/article/details/81262932