-
顺序表
顺序表:用一段地址连续的存储单元依次存储数据元素的线性结构地址连续的空间,一般情况下采用数组,但数组有静态数组和动态数组, 所以顺序表分为:静态顺序表和动态顺序表
头文件(SeqList.h):
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
typedef int DataType;
#define MAX_SIZE (100)
typedef struct SeqList{
DataType array[MAX_SIZE]; //存数据的空间
int size; //有效数据个数,可用数据下标
} 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);
// 查询
// 返回遇到的第一个下标,如果没有遇到,返回 -1
int SeqListFind(SeqList *pSL, DataType data);
源文件(SeqList.c):
#include "SeqList.h"
//初始化
void SeqListInit(SeqList *pSL)
{
assert(pSL!=NULL);
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);
int pos;
for(pos=pSL->size-1;pos>=0;pos--)
{
pSL->array[pos+1]=pSL->array[pos];
}
pSL->array[0]=data;
pSL->size++;
}
// 根据下标插入
void SeqListInsert(SeqList *pSL, int pos, DataType data)
{
assert(pSL!=NULL);
assert(pSL->size<MAX_SIZE);
assert(pos>=0 && pos<pSL->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);
assert(pSL->size>0);
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);
assert(pos>=0 && pos<pSL->size);
int space;
for(space=pos;space<pSL->size-1;space++)
{
pSL->array[space]=pSL->array[space+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)
{
DataType *newArray = (DataType *)malloc(sizeof(DataType)* pSL->size);
assert(newArray);
int i, j, k;
for (i = 0, j = 0; i < pSL->size; i++) {
if (pSL->array[i] != data) {
newArray[j] = pSL->array[i];
j++;
}
}
pSL->size = j;
// 把数据从 newArray 放回到 array
for (k = 0; k < pSL->size; k++) {
pSL->array[k] = newArray[k];
}
free(newArray);
}
// 根据下标更新
void SeqListUpdate(SeqList *pSL, int pos, DataType data)
{
assert(pSL!=NULL);
assert(pos>=0 && pos<pSL->size);
pSL->array[pos]=data;
}
// 查询
// 返回遇到的第一个下标,如果没有遇到,返回 -1
int SeqListFind(SeqList *pSL, DataType data)
{
assert(pSL!=NULL);
int i;
for(i=0;i<pSL->size;i++)
{
if(pSL->array[i]==data)
{
printf("找到了,在下标为%d的位置\n",i);
return i;
}
}
return -1;
}
void SeqListPrint(SeqList *pSL) //打印
{
int i;
for(i=0;i<pSL->size;i++)
{
printf("%d",pSL->array[i]);
}
printf("\n");
}
void TestSeqList() //测试
{
SeqList sl;
SeqListInit(&sl);
SeqListPushBack(&sl, 1);
SeqListPushBack(&sl, 2);
SeqListPushBack(&sl, 3);
SeqListPushBack(&sl, 3);
SeqListPushBack(&sl, 3);
SeqListPushBack(&sl, 4);
SeqListPushBack(&sl, 3);
SeqListPrint(&sl);
SeqListFind(&sl,4);
//SeqListUpdate(&sl,5,9);
//SeqListErase(&sl,2);
//SeqListPopFront(&sl);
//SeqListPopBack(&sl);
//SeqListInsert(&sl,3,1);
//SeqListPushFront(&sl,5);
//SeqListRemove(&sl,3);
//SeqListRemoveAll(&sl, 3);
SeqListPrint(&sl);
SeqListDestroy(&sl);
}
int main()
{
TestSeqList();
return 0;
}