数据结构静态顺序表

来源:互联网 发布:java中国天气网api 编辑:程序博客网 时间:2024/05/24 16:16

顺序表:用一段地址连续存储单元依次存储数据元素的线性结构。

#define MAX_SIZE 10typedef int DataType;struct SeqList{DataType _array[MAX_SIZE];int _size;//顺序表中元素的个数}

以上代码,就是创建一个顺序表,其中SeqList是整个顺序表的空间而size是顺序表中元素的个数。

接下来我将用静态顺序表来实现尾插,头插,任意插入数据,尾删,头删等

头文件:

#ifndef __SEP__LIST__#define __SEP__LIST__
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<assert.h>
#define MAX_SIZE 10typedef int DataType;typedef struct seqlist{ DataType arr[MAX_SIZE]; size_t size;//顺序表中元素的个数
}SeqList,*PseqList;//初始化顺序表void InitSeqList(SeqList* seqList);//在顺序表中尾插元素datavoid PushBack(SeqList* seqList, DataType data);//将顺序表的尾部元素抛出void PopBack(SeqList* seqList);//头插datavoid PushFront(SeqList* pSeqList, DataType data);//头删void PopFront(SeqList* pSeqList);//查找data,返回该元素的顺序表的位置int Find(SeqList* pSeqList, DataType data);//在顺序表的pos的位置插入元素void Insert(SeqList* pSeqList, size_t pos, DataType data);//删除顺序表pos位置的元素void Erase(SeqList* pSeqList, size_t pos);//移除顺序表中值为data 的值void Remove(SeqList* pSeqList, DataType data);//移除顺序表中所有值为data 的值void RemoveAll(SeqList* pSeqList, DataType data);#endif

函数实现部分

#include "seqlist.h"void InitSeqList(SeqList* seqList){assert(seqList);memset(seqList, 0, sizeof(DataType)*MAX_SIZE);//可以一个字节一个字节的把整个数组设置成指定的值(第一个参数是起始地址,第二个是设置数组每个字节的值,第三个是数组长度)seqList->size = 0;//插入数据从顺序表的最开始插入}void PushBack(SeqList* seqList, DataType data){assert(seqList);if (MAX_SIZE == seqList->size){printf("顺序表已经满\n");return;}seqList->arr[seqList->size] = data;seqList->size++;}void PopBack(SeqList* seqList){assert(seqList);if (0 == seqList->size){printf("顺序表是空的,不能Pop\n");return;}seqList->size--;//此时顺序表中元素没有被真正删除,只是使得Pop的元素无效}void PushFront(SeqList* pSeqList, DataType data){size_t index = pSeqList->size;assert(pSeqList);if (MAX_SIZE == pSeqList->size){printf("顺序表已经满");return;}for (; index > 0; index--){pSeqList->arr[index] = pSeqList->arr[index - 1];//顺序表是从第一位插入的,所以以后的元素要向后移动,否则会被覆盖。}pSeqList->arr[index] = data;pSeqList->size++;}  void Popfront(SeqList* pSeqList){size_t index = 1;assert(pSeqList);if (0 == pSeqList->size){printf("顺序表为空不能POP");return;}for (; index < pSeqList->size; index++){pSeqList->arr[index - 1] = pSeqList->arr[index];//index=1在操作时对它减一,是因为害怕数组越界。}pSeqList->size--;} int Find(SeqList* pSeqList, DataType data){size_t index = 0;assert(pSeqList);for (; index < pSeqList->size; index++){if (pSeqList->arr[index] == data){return index + 1;}}return -1;//位置不会是负数,当返回-1时,知道顺序表中没有想要的数据}void Tnsert(SeqList* pSeqList, size_t pos, DataType data){size_t index = pSeqList->size;assert(pSeqList);if (pos > pSeqList->size){printf("插入位置不合法\n");//保证插入的元素都是连续的return;}if (MAX_SIZE == pSeqList->size){printf("顺序表满了\n");return;}for (; index >= pos; index--){pSeqList->arr[index] = pSeqList->arr[index - 1];//把插入数据及其后面的元素向后移动。}pSeqList->arr[index] = data;pSeqList->size++;}void Erase(SeqList* pSeqList, size_t pos){size_t index = pos - 1;assert(pSeqList);if (pos > pSeqList->size){printf("这个位置没有存储数据元素");return;//否则会溢出}for (; index < pSeqList->size - 1; index++){pSeqList->arr[index] = pSeqList->arr[index + 1];//此时数组下标不会越界,index最多到size-2。}pSeqList->size--;}void Remove(SeqList* pSeqList, DataType data){size_t index = 0;size_t temp = 0;assert(pSeqList);for (; index < pSeqList->size;index++){if (pSeqList->arr[index] == data){for (temp = index; temp < pSeqList->size - 1; temp++){pSeqList->arr[temp] = pSeqList->arr[temp + 1];//在顺序表中找到该数时,就把后面的元素向前移动一位,达到消除目的}pSeqList->size--;return;}}}void RemoveAll(SeqList* pSeqList, DataType data);{size_t index = 0;size_t rem = 0;assert(pSeqList);for (; index < pSeqList->size; index++){if (pSeqList->arr[index] == data){for (rem = index; rem < pSeqList->size - 1; rem++){pSeqList->arr[rem] = pSeqList->arr[rem + 1];}pSeqList->size--;index--;}}}


测试部分

#include "seqlist.h"SeqList seqList;//尾插尾删void TestFun1(){InitSeqList(&seqList);PushBack(&seqList, 1);PushBack(&seqList, 2);PushBack(&seqList, 3);PushBack(&seqList, 4);printSeqList(&seqList);PopBack(&seqList);PopBack(&seqList);printSeqList(&seqList);}//测试头插头删void TestFun2(){InitSeqList(&seqList);pushFornt(&seqList, 1);pushFornt(&seqList, 2);pushFornt(&seqList, 3);pushFornt(&seqList, 4);printSeqList(&seqList);PopFront(&seqList);PopFront(&seqList);printSeqList(&seqList);}//测试在任意位置插入删除datavoid TestFun3(){int ret = 0;InitSeqList(&seqList);pushFornt(&seqList, 1);pushFornt(&seqList, 2);pushFornt(&seqList, 3);pushFornt(&seqList, 4);ret = Find(&seqList,4);Insert(&seqList, 3, 5);Erase(&seqList,5);printf("%d\n",ret);printSeqList(&seqList);}//测试移除datavoid TestFun3(){InitSeqList(&seqList);pushFornt(&seqList, 1);pushFornt(&seqList, 2);pushFornt(&seqList, 2);pushFornt(&seqList, 4);pushFornt(&seqList, 1);pushFornt(&seqList, 2);pushFornt(&seqList, 2);pushFornt(&seqList, 4);Remove(&seqList, 2);printSeqList(&seqList);RemoveAll(&seqList,2);printSeqList(&seqList);}


原创粉丝点击