简单实现静态顺序表的基本操作:初始化,销毁,增删改查等操作。
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;
}