数据结构—动态顺序表的实现

前面我们实现了顺序表,但是我们应该会考虑到一个问题,顺序表一次性创建那么大空间造成的浪费很多,所以在这里,我们需要一个可以动态增长的顺序表来满足我们的需求!

实现中需要注意的是:在这里我们要注意的是首先你应该给顺序表一个容量,当每次满了的时候,进行扩容!

另外,在这里我分别使用了三种的排序算法:插入排序,选择排序,冒泡排序。

dynamic_seqlist.h

#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __DYNAMIC_SEQLIST_H__
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>

#define INIT_SIZE 3
#define CAPACITY_SIZE 3
typedef int datatype;

typedef struct seqlist
{
    datatype *data;
    int size;
    int capacity;
}Seqlist,*pSeqlist;

static enum seq
{
    EXIT,
    INIT,
    PUSHBACK,
    POPBACK,
    PUSHFRONT,
    POPFRONT,
    INSERT,
    REMOVE,
    REMOVEALL,
    BUBBLESORT,
    SELECTSORT,
    INSERTIONSORT,
    ERASE,
    BINARYSEARCH,
    PRINTFSEQLIST

};

void PrintSeqlist(pSeqlist pSeq);
void InitSqlist(pSeqlist pSeq);
void DestorySeqlist(pSeqlist pSeq);
void PushBack(pSeqlist pSeq, datatype x);
void PopBack(pSeqlist pSeq);
void PushFront(pSeqlist pSeq, datatype x);
void PopFront(pSeqlist pSeq);
void Insert(pSeqlist pSeq, int pos, datatype x);
void Remove(pSeqlist pSeq, datatype x);
void RemoveAll(pSeqlist pSeq, datatype x);
void BubbleSort(pSeqlist pSeq);
void SelectSort(pSeqlist pSeq);
void InsertionSort(pSeqlist pSeq);
void Erase(pSeqlist pSeq, int pos);
int BinarySearch(pSeqlist pSeq, datatype x);

void meau();

#endif // !__DYNAMIC_SEQLIST_H__

dynamic_seqlist.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"dynamic_seqlist.h"

void meau()
{
    printf("$$$$$$$$$$$$$$    SEQLIST    $$$$$$$$$$$$$$$$\n");
	printf("$$$$$$$$$$$$$$$$$$$$$$¥$$$$$$$$$$$$$$$$$$$$$\n");
    printf("$$$  1.init              2.push_back      $$$\n");
    printf("$$$  3.pop_back          4.push_front     $$$\n");
    printf("$$$  5.pop_front         6.insert         $$$\n");
    printf("$$$  7.remove            8.removeall      $$$\n");
    printf("$$$  9.bubblesort        10.selectsort    $$$\n");
    printf("$$$  11.insertionsort    12.earse         $$$\n");
    printf("$$$  13.binarysearch     14.printseqlist  $$$\n");
    printf("$$$                       0.EXIT          $$$\n");
    printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");

}

void InitSqlist(pSeqlist pseq)
{
    pseq->data = (datatype *)malloc(sizeof(datatype)*INIT_SIZE);
    if (NULL == pseq->data)
    {
        perror("out of memory");
        exit(-1);
    }
    pseq->size = 0;
    pseq->capacity = INIT_SIZE;
}

void DestorySeqlist(pSeqlist pSeq)
{
    free(pSeq->data);
    pSeq->data = NULL;
    pSeq->size = 0;
    pSeq->capacity = 0;
}

void PrintSeqlist(pSeqlist pSeq)
{
    int i = 0;
    for (i = 0; i < pSeq->size; i++)
    {
        printf("%3d", pSeq->data[i]);
    }
    printf("\n");
}
void check(pSeqlist pSeq)
{
    datatype *tmp = NULL;
    if (pSeq->size == pSeq->capacity)
    {
        tmp = (datatype *)realloc(pSeq->data, sizeof(datatype)*(pSeq->size + CAPACITY_SIZE));
        if (tmp == NULL)
        {
            perror("out of memory");
            exit(-1);
        }
        else
        {
            pSeq->data = tmp;
            pSeq->capacity += CAPACITY_SIZE;
        }
    }
}
void PushBack(pSeqlist pSeq, datatype x)
{
    check(pSeq);
    pSeq->data[pSeq->size] = x;
    pSeq->size++;
}

void PopBack(pSeqlist pSeq)
{
    if (pSeq->size <= 0)
    {
        printf("顺序表已空\n");
        return;
    }
    pSeq->size--;
}
void PushFront(pSeqlist pSeq, datatype x)
{
    check(pSeq);
    for (int i = pSeq->size; i >= 0; i--)
    {
        pSeq->data[i + 1] = pSeq->data[i];
    }
    pSeq->data[0] = x;
    pSeq->size++;
}

void PopFront(pSeqlist pSeq)
{
    if (pSeq->size <= 0)
    {
        printf("顺序表已空\n");
        return;
    }
    for (int i = 0; i < pSeq->size; i++)
    {
        pSeq->data[i] = pSeq->data[i + 1];
    }
    pSeq->size--;
}
void Insert(pSeqlist pSeq, int pos, datatype x)
{
    check(pSeq);
    for (int i = pSeq->size; i >= pos; i--)
    {
        pSeq->data[i + 1] = pSeq->data[i];
    }
    pSeq->data[pos] = x;
    pSeq->size++;

}
void Remove(pSeqlist pSeq, datatype x)
{
    if (pSeq->size <= 0)
    {
        printf("顺序表已空,无法删除\n");
        return;
    }
    for (int i = 0; i < pSeq->size; i++)
    {
        if (pSeq->data[i] == x)
        {
            for (int j = i; j < pSeq->size - i; j++)
            {
                pSeq->data[j] = pSeq->data[j + 1];
            }
            pSeq->size--;
            return;
        }
    }
}
void RemoveAll(pSeqlist pSeq, datatype x)
{
    if (pSeq->size <= 0)
    {
        printf("顺序表已空,无法删除\n");
        return;
    }
    for (int i = 0; i < pSeq->size; i++)
    {
        if (pSeq->data[i] == x)
        {
            for (int j = i; j <pSeq->size; j++)
            {
                pSeq->data[j] = pSeq->data[j + 1];
            }
            pSeq->size--;
        }
    }
}
void BubbleSort(pSeqlist pSeq)
{

    char ch = 0;
    int i = 0;
    int j = 0;
    if (pSeq->size <= 0)
    {
        printf("顺序表已空,无法排序\n");
        return;
    }
    printf("请选择排序类型(>:从大到小),(<:从小到大):\n");
    fflush(stdin);
    scanf("%c", &ch);

    switch (ch)
    {
    case‘>‘:
        for (i = 0; i < pSeq->size - 1; i++)
        {
            for (j = 0; j < pSeq->size - i - 1; j++)
            {
                if (pSeq->data[j] < pSeq->data[j + 1])
                {
                    int tmp = pSeq->data[j];
                    pSeq->data[j] = pSeq->data[j + 1];
                    pSeq->data[j + 1] = tmp;
                }
            }
        }
        break;
    case‘<‘:
        for (i = 0; i < pSeq->size - 1; i++)
        {
            for (j = i; j < pSeq->size - i - 1; j++)
            {
                if (pSeq->data[j] > pSeq->data[j + 1])
                {
                    int tmp = pSeq->data[j];
                    pSeq->data[j] = pSeq->data[j + 1];
                    pSeq->data[j + 1] = tmp;
                }
            }
        }
        break;
    default:
        printf("所给出排序类型有问题!\n");
        break;
    };
}
void SelectSort(pSeqlist pSeq)
{
    datatype min = 0;
    int i = 0;
    int j = 0;
    if (pSeq->size <= 0)
    {
        printf("顺序表已空,无法排序\n");
        return;
    }
    for (i = 0; i < pSeq->size - 1; i++)
    {
        min = i ;
        for (j = i + 1; j < pSeq->size; j++)
        {
            if (pSeq->data[min]>pSeq->data[j])
            {
                min = j;
            }
        }
        if (min != i)
        {
            datatype tmp = pSeq->data[i];
            pSeq->data[i] = pSeq->data[min];
            pSeq->data[min] = tmp;
        }
    }
}
void InsertionSort(pSeqlist pSeq)
{
    int i = 0;
    int j = 0;
    if (pSeq->size <= 0)
    {
        printf("顺序表已空,无法排序\n");
        return;
    }
    for (i = 1; i < pSeq->size; i++)
    {
        datatype tmp = pSeq->data[i];
        for (j = i - 1; j >= 0; j--)
        {
            if (pSeq->data[j]>tmp)
            {
                pSeq->data[j + 1] = pSeq->data[j];
            }
            else
            {
                break;
            }
        }
        pSeq->data[j + 1] = tmp;
    }

}
void Erase(pSeqlist pSeq, int pos)
{
    int i = 0;
    if (pSeq->size <= 0)
    {
        printf("顺序表已空,无法删除\n");
        return;
    }
    else if (pos<0 || pos>=pSeq->size)
    {
        printf("输入位置不合法");
        return;
    }
    for (i = pos; i <pSeq->size-1; i++)
    {
        pSeq->data[i] = pSeq->data[i + 1];
    }
    pSeq->size--;
}
int BinarySearch(pSeqlist pSeq, datatype x)
{
    int left = 0;
    int right = pSeq->size - 1;
    int mid = 0;
    while (left <= right)
    {
        mid = (left + right) >> 1;
        if (pSeq->data[mid] < x)
        {
            left = mid + 1;
        }
        else if (pSeq->data[mid]>x)
        {
            right = mid - 1;
        }
        else
            return mid;
    }
    return -1;;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"dynamic_seqlist.h"
void Test()
{
    Seqlist seq;
    int input = 1;
    int x = 0;
    int pos = 0;
    int search = 0;
    InitSqlist(&seq);
    while (input)
    {
        meau();
        printf("请选择:");
        scanf("%d", &input);
        fflush(stdin);
        switch (input)
        {
        case INIT:
            InitSqlist(&seq);
            break;
        case PUSHBACK:
            fflush(stdin);
            printf("请输入你所要尾部push的元素:\n");
            scanf("%d", &x);
            PushBack(&seq, x);
            break;
        case POPBACK:
            PopBack(&seq);
            break;
        case PUSHFRONT:
            fflush(stdin);
            printf("请输入你所要头部push的元素:\n");
            scanf("%d", &x);
            PushFront(&seq, x);
            break;
        case POPFRONT:
            PopFront(&seq);
            break;
        case INSERT:
            fflush(stdin);
            printf("请输入你所要插入的元素:\n");
            scanf("%d", &x);
            fflush(stdin);
            printf("请输入你所要插入的位置:\n");
            scanf("%d", &pos);
            Insert(&seq, pos, x);
            break;
        case REMOVE:
            fflush(stdin);
            printf("请输入要删除的元素\n");
            scanf("%d", &x);
            Remove(&seq, x);
            break;
        case REMOVEALL:
            fflush(stdin);
            printf("请输入要删除的元素\n");
            scanf("%d", &x);
            RemoveAll(&seq, x);
            break;
        case BUBBLESORT:
            BubbleSort(&seq);
            break;
        case SELECTSORT:
            SelectSort(&seq);
            break;
        case INSERTIONSORT:
            InsertionSort(&seq);
            break;
        case ERASE:
            fflush(stdin);
            printf("请输入你所要删除元素的位置");
            scanf("%d", &pos);
            Erase(&seq,pos);
            break;
        case BINARYSEARCH:
            printf("请输入要二分查找的元素\n");
            fflush(stdin);
            scanf("%d", &x);
            search = BinarySearch(&seq, x);
            printf("%d所在的位置是:%d", x, search);
            break;
        case EXIT:
            DestorySeqlist(&seq);
            input = 0;
            break;
        case PRINTFSEQLIST:
            PrintSeqlist(&seq);
            break;
        default:
            break;
        }
    }

}

int main()
{
    Test();

    system("pause");
    return 0;
}
时间: 2024-08-14 16:42:30

数据结构—动态顺序表的实现的相关文章

【数据结构】顺序表和链表

一.顺序表 顺序表定义 :顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素.使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表.顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中. 顺序表可以分为静态顺序表和动态顺序表,静态较为简单,本文提供全部动态顺序表基本操作的代码. 顺序表的基本操作:

c实现的动态顺序表

第一篇文章中用c实现了静态顺序表,但是使用静态顺序表还有不足的地方.当我们需要存储的数据很少时,如果静态顺序表的数组容量较大就会造成空间的浪费:当我们需要存储的数据很多时,如果静态顺序表的数组容量较小可能就会造成数据丢失.所以一般情况我们应该尽量把顺序表实现成动态的.需要多大容量就开辟多大容量. 静态顺序表和动态顺序表只有以下函数不同: 1.定义结构体时,多定义一个capacity,并对capacity进行初始化和增加大小的设置: #define INIT_CAPACITY 3 #define 

C语言:【动态顺序表】动态顺序表的初始化、打印、尾插PushBack、尾删PopBack

#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> #include<malloc.h> typedef int DateType; typedef struct SeqList {     DateType *arr;     size_t capacility;     size_t size; }SeqList; //创建空间 void Che

动态顺序表 与 双向链表的模板类

//////////////////////////////////////////////////////////////////////// /////////////////////泛型编程之动态顺序表的模板///////////////////////// //////////////////////////////////////////////////////////////////////// #include<iostream> #include<string> u

数据结构。顺序表

#include <stdio.h>#include <stdlib.h> #define LIST_INIT_SIZE 100#define LIST_INCREMENT 10typedef struct Point   //element type{    int x;    int y;}Point;typedef Point ElemType;typedef struct          //list type{    ElemType *elem;     //data

静态顺序表和动态顺序表

实现一个静态顺序表,首先,要定义一个保存数据的数组,保存在结构体中,用size来存储数组中的元素个数, typedef struct SeqList { DataType array[MAX_SIZE]; size_t size; }SeqList; 首先来实现一下静态顺序表的初始化函数,可以借用系统的memset函数来实现,开辟一块空间全部初始化为0,没有存入数据所以size也为0 void InitSeqList(SeqList *pSeq) { assert(pSeq); memset(p

Windows 已在 数据结构_顺序表.exe 中触发一个断点——new和delete注意事项

实现数据结构的顺序表的类时,输入,改,删,查都可以,但是最后析构函数时持续出错 错误提示"Windows 已在 数据结构_顺序表.exe 中触发一个断点" int *elem=new int(LIST_INIT_SIZE); if(!elem)cout<<"overflow"<<endl; if(leng>LIST_INIT_SIZE) cout<<"error"; else {    length=le

【C语言】静态顺序表和动态顺序表的实现

静态顺序表 定义一张顺序表也就是在内存中开辟一段连续的存储空间,并给它一个名字进行标识.只有定义了一个顺序表,才能利用该顺序表存放数据元素,也才能对该顺序表进行各种操作. 有两种定义顺序表的方法:一是静态地定义一张顺序表:二是动态地生成一张顺序表. 静态地定义一张顺序表的方法与定义一个数组的方法类似.可以描述如下: #define MAX_SIZE 100 typedef int DataType; typedef struct SeqList { DataType array[MAX_SIZE

动态顺序表(可分配内存空间)

<strong style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">前几天写了一个静态顺序表,但是觉得一开始开辟很大一部分空间却不一定可以完全用得上,会造成很大的内存浪费,于是写了一个可以自动开辟内存空间的动态顺序表作为改进.</strong> "DynamicSeqllist.h" #pragma once #def