数据结构2-顺序表

                                           数据结构2-顺序表

数据结构2-顺序表

顺序表就是一段有序的数组。 
静态顺序表:就是顺序表的最大长度是有确定值的。 
动态顺序表:相对于静态顺序表,最大长度命名为容量,容量可以在初始化顺序表时候给出,容量可以根据后续需求通过realloc函数进行动态分配改变。


举个栗子——–动态顺序表

//Seqlist.h
#ifndef Seqlist_h_
#define Seqlist_h_

//实现动态顺序表
#include<stdio.h>
#include<windows.h>
#include<assert.h>

typedef int DataType;

typedef struct SeqList
{
    DataType* a;
    size_t size; // 有效数据个数,相当于数组中的下标。 
    size_t capacity; // 容量 
}SeqList;

void SeqPrint(SeqList* pSeq);
void SeqInit(SeqList* pSeq,size_t capacity);//初始化顺序表
void SeqDestory(SeqList* pSeq);//销毁顺序表

void checkcapa(SeqList*pSeq);//动态特征,防止越界访问。
void SeqPushBack(SeqList* pSeq, DataType x);//尾插
void SeqPopBack(SeqList* pSeq);//尾删
void SeqPushFront(SeqList* pSeq, DataType x);//头插
void SeqPopFront(SeqList* pSeq);//头删

void SeqInsert(SeqList* pSeq, size_t pos, DataType x);//pos位置插入x
void SeqErase(SeqList* pSeq, size_t pos);//

int SeqFind(SeqList* pSeq, DataType x);//查找x
void SeqAt(SeqList* pSeq, size_t pos, DataType x);//修改posw位置的数据

void BubbleSort(SeqList* pSeq);//冒泡排序
void SelectSort(SeqList* pSeq);//选择排序
int BinarySearch(SeqList* pSeq,DataType x);//二分查找
void test();
#endif
//源.c
#include"Seqlist.h"

void SeqPrint(SeqList*pSeq)
{
    printf("输出的顺序表有%d个元素\n", pSeq->size);
    for (size_t i = 0; i<pSeq->size; i++)
    {
        printf("%d ", pSeq->a[i]);
    }
    printf("\n");
}
void SeqInit(SeqList* pSeq,size_t capacity)
{
    assert(pSeq&&capacity>0);
    pSeq->a = (DataType*)malloc(capacity*sizeof(DataType));
    assert(pSeq->a);

    pSeq->capacity = capacity;
    pSeq->size = 0;
}

void checkcapa(SeqList*pSeq)
{
    if (pSeq->size >= pSeq->capacity)
    {
        DataType*a = (DataType*)realloc(pSeq, sizeof(DataType)* 2 * pSeq->capacity);
        assert(a);
        pSeq->a = a;
        pSeq->capacity *= 2;
    }
}
void SeqPushBack(SeqList* pSeq, DataType x)
{

    assert(pSeq);

    checkcapa(pSeq);
    pSeq->a[pSeq->size] = x;
    pSeq->size++;

}
void SeqPopBack(SeqList* pSeq)
{
    assert(pSeq);
    pSeq->a[pSeq->size - 1] = 0;
    pSeq->size--;
}
void SeqPushFront(SeqList* pSeq, DataType x)
{
    assert(pSeq);
    checkcapa(pSeq);
    for (size_t i =pSeq->size; i >0; i--)
    {
        pSeq->a[i] = pSeq->a[i-1]; 
    }
    pSeq->a[0] = x;
    pSeq->size++;
}
void SeqPopFront(SeqList* pSeq)
{
    size_t tmp=1;
    assert(pSeq);
    while (tmp<pSeq->size)
    {
        pSeq->a[tmp -1] = pSeq->a[tmp];
        tmp++;
    }
    pSeq->size--;
}
void SeqDestory(SeqList* pSeq)
{
    assert(pSeq);
    free(pSeq->a);
    pSeq->a = NULL;
    pSeq->size = pSeq->capacity = 0;
}

void SeqInsert(SeqList* pSeq, size_t pos, DataType x)//pos后插入x
{
    assert(pSeq);
    assert(pos < pSeq->size);
    checkcapa(pSeq);

    for (size_t i = pSeq->size - 1; i>pos; i--)
    {
        pSeq->a[i + 1] = pSeq->a[i];
    }
    pSeq->a[pos + 1] = x;
    pSeq->size++;
}
void SeqErase(SeqList* pSeq, size_t pos)//删除pos位置的元素
{
    assert(pSeq&&pos<pSeq->size);
    for (size_t i = pos; i < pSeq->size; i++)
    {
        pSeq->a[i - 1] = pSeq->a[i];
    }
    pSeq->size--;
}
int SeqFind(SeqList* pSeq, DataType x)//在顺序表中找x
{
    size_t i = 0;
    assert(pSeq);
    while (i < pSeq->size)
    {
        if (pSeq->a[i] == x)
            return x;
        i++;
    }
    return -1;
}
void SeqAt(SeqList* pSeq, size_t pos, DataType x)//修改pos位置的数据
{
    assert(pSeq&&pos<pSeq->size);
    pSeq->a[pos] = x;
}
void Swap(DataType* a, DataType* b)
{
    *a ^=* b;
    *b ^= *a;
    *a ^= *b;
}
void BubbleSort(SeqList* pSeq)//冒泡排序
{
    assert(pSeq);
    for (size_t i = 0; i < pSeq->size - 1; i++)
    {
        int flag = 0;
        for (size_t j = 0; j < pSeq->size - i - 1; j++)
        {
            if (pSeq->a[j]>pSeq->a[j + 1])
            {
                Swap(&pSeq->a[j], &pSeq->a[j + 1]);
                flag = 1;
            }
        }
        if (flag == 0)
            break;
    }
}   
void SelectSort(SeqList* pSeq)
{
    size_t left = 0, right = pSeq->size-1;
    while (left < right)
    {
        size_t max=left, min=left;
        size_t i = left;
        while (i <= right)
        {
            if (pSeq->a[i] > pSeq->a[max])
                max = i;

            if (pSeq->a[i] < pSeq->a[min])
                min = i;

            ++i;
        }

        Swap(&pSeq->a[left], &pSeq->a[min]);
        if (left == max)
            max = min;

        Swap(&pSeq->a[right], &pSeq->a[max]);
        if (right==min)
            min=max;
        ++left;
        --right;
    }
}




int BinarySearch(SeqList* pSeq,DataType x)//二分查找
{
    assert(pSeq);
    size_t head = 0, tail = pSeq->size - 1;
    if (x == pSeq->a[head])
        return pSeq->a[head];
    else if (x == pSeq->a[tail])
        return pSeq->a[tail];
    else
    {
        size_t mid = head + ((tail - head) >> 1);
        if (x < pSeq->a[mid])
            tail = mid - 1;
        else if (x>pSeq->a[mid])
            head = mid + 1;
        else
            return pSeq->a[mid];
    }
    return -1;
}
void test1()
{
    SeqList s;
    SeqInit(&s, 20);
    SeqPushBack(&s, 0);
    SeqPushBack(&s, 1);
    SeqPushBack(&s, 2);
    SeqPushBack(&s, 3);
    SeqPushBack(&s, 4);
    SeqErase(&s, 0);
    SeqPopBack(&s);
    SeqPopBack(&s);
    SeqInsert(&s, 0, 9);
    SeqPrint(&s);
}
void test2()
{
    SeqList s;
    SeqInit(&s, 20);
    SeqPushBack(&s, 0);
    SeqPushBack(&s, 1);
    SeqPushBack(&s, 2);
    SeqPushFront(&s, 10);
    SeqPushFront(&s, 20);
    SeqPushFront(&s, 30);
    SeqAt(&s,0,50);
    SeqPrint(&s);
}
void test3()
{
    SeqList s;
    SeqInit(&s, 20);
    SeqPushBack(&s, 0);
    SeqPushBack(&s, 1);
    SeqPushBack(&s, 2);
    SeqPushBack(&s, 3);
    SeqPopFront(&s);
    SeqPopFront(&s);
    SeqPrint(&s);
}

void test4()
{
    SeqList s;
    SeqInit(&s, 20);
    SeqPushBack(&s, 0);
    SeqPushBack(&s, 1);
    printf("%d\n", SeqFind(&s, 0));
    printf("%d\n", SeqFind(&s, 1));
    printf("%d\n", SeqFind(&s, 2));
}

void test5()
{
    SeqList s;
    SeqInit(&s, 20);
    SeqPushBack(&s, 10);
    SeqPushBack(&s, 1);
    SeqPushBack(&s, 5);
    SeqPushBack(&s, 3);
    SeqPushBack(&s, 99);
    SeqPrint(&s);
    printf("%d\n", BinarySearch(&s, 5));
    printf("%d\n", BinarySearch(&s, 2));
    SeqPrint(&s);
    //BubbleSort(&s);
    SelectSort(&s);
    SeqPrint(&s);
}
int main()
{
    //test1();
    //test2();
    //test3();
    //test4();
    test5();
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/huangshulang1234/article/details/79876753