顺序表的基本操作和相关题目

顺序表:

用一段地址连续的存储单元依次存储数据元素的线性结构,地址空间一般是连续的,一般情况下采用数组,但数组有静态数组和动态数组, 所以顺序表分为:静态顺序表和动态顺序表 这篇文章是介绍静态顺序表的

顺序表结构:

#define MAX 10
typedef int DataType;//数据类型

typedef struct SeqList
{
    DataType data[MAX];
    int sz;//长度,也就是有效元素的个数
}SeqList, *pSeqList;

顺序表的优点和缺点:

1.因为存储空间连续因此可以节约空间。

2.在查找元素是支持随机查找,但是在插入和删除时要进行元素的移动,因此效率比较低。

基本操作和相关题目:

函数声明:

int Empty(pSeqList pSeq);//判空
void InitSeqList(pSeqList pSeq);
void PushBack(pSeqList pSeq, DataType data);//尾插
void PopBack(pSeqList pSeq);//尾删
void PushFront(pSeqList pSeq, DataType data);//头插
void PopFront(pSeqList pSeq);//头删
int Find(pSeqList pSeq, DataType data);//查找
void PrintSeqList(pSeqList pSeq);//打印函数
void Insert(pSeqList pSeq, int pos, DataType data);//指定位置插入
void Erase(pSeqList pSeq, int pos);//删除指定位置元素
void Remove(pSeqList pSeq, DataType data);//删除指定元素
void RemoveAll(pSeqList pSeq, DataType data);//删除所有的指定元素 
int Size(pSeqList pSeq);//返回顺序表的大小
void BubbleSort(pSeqList pSeq);//冒泡排序
int BinarySearch(pSeqList pSeq, DataType data);//二分查找 
int BinarySearch_R(pSeqList pSeq, int left, int right, DataType data);//二分查找递归写法 
void SelectSort(pSeqList pSeq);//选择排序

相关函数的实现:

void InitSeqList(pSeqList pSeq)//初始化
{
    assert(pSeq != NULL);

    pSeq->sz = 0;
    memset(pSeq->data, 0, sizeof(pSeq->data));
}

int Empty(pSeqList pSeq)//判空
{
    assert(pSeq);
    if (pSeq->sz == 0)
        return 0;
    else
    return 1;

}
void PushBack(pSeqList pSeq, DataType d)//尾插入
{
    assert(pSeq != NULL);
    if (pSeq->sz == MAX)
    {
        printf("顺表表已满,不能插入\n");
        return;
    }
    pSeq->data[pSeq->sz] = d;
    pSeq->sz++;
}
void PopBack(pSeqList pSeq)//尾删
{
    assert(pSeq);
    if(Empty(pSeq));
    //pSeq->data[pSeq->sz - 1] = NULL;
    pSeq->sz--;

}
void PushFront(pSeqList pSeq, DataType data) //头插
{
    int i = 0;
    assert(pSeq);
    if (pSeq->sz == MAX)
    {
        printf("顺序表已满,不能插入");

    }
    for (i = pSeq->sz; i > 0; i--)
    {
        pSeq->data[i] = pSeq->data[i - 1];
    }
    pSeq->data[0] = data;
    pSeq->sz++;
}
void PopFront(pSeqList pSeq)//头删
{
    int i = 0;
    assert(pSeq);
    if (Empty(pSeq))
    for (i = 0; i < pSeq->sz-1; i++)
    {
        pSeq->data[i] = pSeq->data[i + 1];
    }
    pSeq->sz--;

}
int Find(pSeqList pSeq, DataType data)//查找指定元素


{
    assert(pSeq);
    int i = 0;
    for (i = 0; i < pSeq->sz; i++)
    {
        if (pSeq->data[i] == data)
            break;
    }
    return i;

}
void Insert(pSeqList pSeq, int pos, DataType data)//指定位置插入
{
    assert(pSeq);
    if (pos > pSeq->sz)
    {
        printf("该位置不存在\n");
    }
    int i = 0;
    for (i = pSeq->sz; i >= pos; i--)
        pSeq->data[i] = pSeq->data[i - 1];
    pSeq->data[pos] = data;
    pSeq->sz++;

}
void Erase(pSeqList pSeq, int pos)//删除指定位置元素
{
    assert(pSeq);
    int i = 0;
    if (Empty(pSeq))
    for (i = pos; i < pSeq->sz-1; i++)
    {
        pSeq->data[i] = pSeq->data[i + 1];
    }
    pSeq->sz--;
}
void Remove(pSeqList pSeq, DataType data)//删除指定元素

{
    
    int i = 0;
    assert(pSeq);
    if (Empty(pSeq));
    {
    for (i = 0; i < pSeq->sz; i++)
    {
        int pos = 0;
        if (pSeq->data[i] == data)
        break;
    }
    int pos = 0;
    pos = i;
    for (i = pos; i < pSeq->sz-1; i++)
    {
        pSeq->data[i] = pSeq->data[i + 1];
    }
    pSeq->sz--;

    }
}

void RemoveAll(pSeqList pSeq, DataType data)//删除所有的指定元素
{
    assert(pSeq);
    int i = 0;
    int j = 0;
    if (Empty(pSeq))
    {
        for (i = 0; i < pSeq->sz; i++)
        {//12145
            if (pSeq->data[i] != data)
            {
                pSeq->data[j] = pSeq->data[i];
                j++;
            }
            
        }
        pSeq->sz = j;//12345
    }
    
}
int Size(pSeqList pSeq)//返回顺序表的大小
{
    assert(pSeq);
    return pSeq->sz;
}
void BubbleSort(pSeqList pSeq)//冒泡排序
{
    int i = 0;
    int j = 0;
    int tmp = 0;
    for (i = 0; i < pSeq->sz-1; i++)
    {
        for (j = 0; j < pSeq->sz - i-1; j++)
        {

            if (pSeq->data[j]>pSeq->data[j + 1])//32145
            {
                tmp = pSeq->data[j];
                pSeq->data[j] = pSeq->data[j + 1];
                pSeq->data[j + 1] = tmp;
            }
        }
    }

}
int BinarySearch(pSeqList pSeq, DataType data)//二分查找
{
    int left = 0;
    int right = pSeq->sz - 1;
    int mid = 0;
    while (left <=right)
    {
        mid = (left + (right - left)) / 2;
        if (pSeq->data[mid]>data)//12345
            right = mid-1;
        else if (pSeq->data[mid] < data)
            left = mid+1;
        else if (pSeq->data[mid] == data)
            return mid;

    }
    return -1;
}
int BinarySearch_R(pSeqList pSeq, int left, int right, DataType data)
{
    
    int mid = 0;
    assert(NULL != pSeq);

    while (left <= right)
    {
        mid = left + (right - left) / 2;
        if (pSeq->data[mid] == data)
        {
            printf("找到了\n");
            return mid;
        }
        else if (pSeq->data[mid] < data)
        {
            return BinarySearch_R(pSeq, mid + 1, right, data);
        }
        else if (pSeq->data[mid] > data)
        {
            return BinarySearch_R(pSeq, left, mid - 1, data);
        }
    }
    return -1;
}
void SelectSort(pSeqList pSeq)//选择排序
{
    int i = 0;
    int j = 0;
    int mindix = 0;
    int k = 0;
    for (i = 0; i < pSeq->sz - 1; i++)
    {
        mindix = i;
        for (j = i + 1; j < pSeq->sz; j++)
        {
            if (pSeq->data[mindix] > pSeq->data[j])
            {
                mindix = j;
            }
        }
        int temp = pSeq->data[mindix];//231465
        for (k = mindix; k >i; k--)
        {
            pSeq->data[k] = pSeq->data[k - 1];
        }
        pSeq->data[i] = temp;
    }
}
 

 

你可能感兴趣的:(顺序表的基本操作和相关题目)