数据结构之实现顺序表的简单操作函数

简单实现静态顺序表的基本操作:初始化,销毁,增删改查等操作。

SeqList.h

#ifndef _SEQLIST_H_
#define _SEQLIST_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define MAX_SIZE 100
typedef int DataType;
typedef struct SeqList
{
    DataType array[MAX_SIZE];//存数据的空间
    int size;//1.顺序表中有效元素的个数 2.当前可用的数组下标
}SeqList;


void SeqListInit(SeqList *pSL);//初始化
void SeqlistDestroy(SeqList *pSL);//销毁
//插入
void SeqListPushBack(SeqList *pSL,DataType data);//尾插
void SeqListPushFront(SeqList *pSL,DataType data);//头插
void SeqListInsert(SeqList *pSL,int pos,DataType data);//根据下标插入
//删除
void SeqListPopBack(SeqList *pSL);//尾删
void SeqListPopFront(SeqList *pSL);//头删
void SeqListErase(SeqList *pSL, int pos);//根据下标删除
void SeqListRemove(SeqList *pSL,DataType data);//根据数据删除,删除遇到的第一个
void SeqListRemoveAll(SeqList *pSL,DataType data);//根据数据删除,删除所有指定数据
//修改
void SeqListUpdate(SeqList *pSL,int pos,DataType data);//根据下标更新数据
//查询
int SeqListFind(SeqList *pSL,DataType data);//返回遇到的第一个下标,若没有遇到,就返回-1

SeqList.c

#include "Seqlist.h"
void SeqListPrint(SeqList *pSL)
{
    int i ;
    for (i = 0; i < pSL->size; i++)
    {
        printf("%d ", pSL->array[i]);
    }
    printf("\n");
}

void SeqListInit(SeqList *pSL)//初始化
{
    assert(pSL != NULL);
    memset(pSL->array, 0, MAX_SIZE*sizeof(DataType));
    pSL->size = 0;

}
void SeqlistDestroy(SeqList *pSL)//销毁
{
    assert(pSL != NULL);
    pSL->size = 0;

}
void SeqListPushBack(SeqList *pSL, DataType data)//尾插
{
    assert(pSL != NULL);
    assert(pSL->size < MAX_SIZE);
    pSL->array[pSL->size] = data;
    pSL->size++;
}
void SeqListPushFront(SeqList *pSL, DataType data)//头插
{
    assert(pSL != NULL);
    assert(pSL->size < MAX_SIZE);
    //将已知数据往后移
    //1.以条件写循环
#if 0
    int pos;//以搬移的数做循环指示
    for (pos = pSL->size - 1; pos >= 0; pos--)
    {
        pSL->array[pos + 1] = pSL->array[pos];
    }
#endif
#if 0
    int space;//以搬到的位置做循环指示
    for(space = pSL->size; space > 0; space--)
    {
        pSL->array[space] = pSL->array[space - 1];
    }
#endif
#if 2
    //2.以循环次数做循环指示
    int i;
    for (i = 0; i < pSL->size; i++)
    {
        pSL->array[pSL->size - i] = pSL->array[pSL->size - i - 1];
    }
#endif
    pSL->array[0] = data;
    pSL->size++;
}
void SeqListInsert(SeqList *pSL, int pos, DataType data)//根据下标插入
{
    assert(pSL != NULL);
    assert(pSL->size < MAX_SIZE);
    int space;
    for (space = pSL->size; space>pos; space--)
    {
        pSL->array[space] = pSL->array[space - 1];
    }
    pSL->array[pos] = data;
    pSL->size++;
}

void SeqListPopBack(SeqList *pSL)//尾删
{
    assert(pSL != NULL);
    assert(pSL->size > 0);
    pSL->size--;
}
void SeqListPopFront(SeqList *pSL)//头删
{
    assert(pSL != NULL);
    int pos;
    for (pos = 1; pos < pSL->size; pos++)
    {
        pSL->array[pos - 1] = pSL->array[pos];
    }
    pSL->size--;
}
void SeqListErase(SeqList *pSL, int pos)//根据下标删除
{
    assert(pSL != NULL);
    assert(pSL->size>0);
    int i;
    for (i = pos; pos < pSL->size - 1; pos++)
    {
        pSL->array[pos] = pSL->array[pos + 1];
    }
    pSL->size--;
}

void SeqListRemove(SeqList *pSL, DataType data)//根据数据删除,删除遇到的第一个
{
    int pos = SeqListFind(pSL, data);
    if (pos != -1)
    {
        SeqListErase(pSL, pos);
    }
}
void SeqListRemoveAll(SeqList *pSL, DataType data)//根据数据删除,删除所有指定数据
{
#if 0
    for (i = 0, j = 0; i < pSL->size; i++)
    {
        if (pSL->array[i] != data)
        {
            pSL->array[j] = pSL->array[i];
            j++;
        }
    }
    pSL->size = j;
#endif
#if 1
    int i = 0;
    int count = 0;
    for (i = 0; i < pSL->size; i++)
    {
        if (pSL->array[i] == data)
        {
            count++;
        }
        else
        {
            pSL->array[i - count] = pSL->array[i];
        }
        pSL->size -= count;
    }

#endif
}
void SeqListUpdate(SeqList *pSL, int pos, DataType data)//根据下标更新数据
{
    assert(pSL != NULL);
    assert(pos >= 0 && pos < pSL->size);
    pSL->array[pos] = data;
}
int SeqListFind(SeqList *pSL, DataType data)//返回遇到的第一个下标,若没有遇到,就返回-1
{
    assert(pSL != NULL);
    int i;
    for (i = 0; i < pSL->size; i++)
    {
        if (pSL->array[i] == data)
        {
            return i;
        }
    }
    return -1;
}

测试代码:

int main()
{
    SeqList S;
    SeqListInit(&S);
    SeqListPrint(&S);
    //尾插
    SeqListPushBack(&S,1);
    SeqListPushBack(&S,3);
    SeqListPushBack(&S,4);
    SeqListPushBack(&S,3);
    SeqListPushBack(&S,5);
    SeqListPushBack(&S,7);
    SeqListPushBack(&S, 8);
    SeqListPushBack(&S, 0);
    SeqListPushBack(&S, 9);
    SeqListPushBack(&S, 3);
    SeqListPrint(&S);
    //头插
    SeqListPushFront(&S, 4);
    SeqListPushFront(&S, 7);
    SeqListPushFront(&S, 0);
    SeqListPrint(&S);
    //根据下标插入
    SeqListInsert(&S, 2,6);
    SeqListInsert(&S, 4,5);
    SeqListPrint(&S);
    //尾删
    SeqListPopBack(&S);
    SeqListPrint(&S);
    //头删
    SeqListPopFront(&S);
    SeqListPopFront(&S);
    SeqListPrint(&S);
    //根据下标删除
    SeqListErase(&S, 4);
    SeqListErase(&S, 7);
    SeqListPrint(&S);
    //根据数据删除,删除遇到的第一个
    SeqListRemove(&S, 5);
    SeqListPrint(&S);
    //根据数据删除,删除所有指定数据
    SeqListRemoveAll(&S, 5);
    SeqListPrint(&S);
    //根据下标更新数据
    SeqListUpdate(&S,1,8);
    SeqListUpdate(&S,3,0);
    SeqListPrint(&S);
    //查询
    printf("%d\n", SeqListFind(&S, 3));
    //销毁顺序表
    SeqlistDestroy(&S);
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/mmwwxx123/article/details/80671795
今日推荐