前几天发的静态顺序表,在处理Remove函数时,性能上出了一点小小的问题(恐慌恐慌),已经做了优化,以下是优化后的代码:
SeqList.h:
#pragma once
#define MAX_SIZE 100
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DataType;
typedef struct SeqList
{
DataType arr[MAX_SIZE]; // 值
int size; // 数量
} SeqList;
// 初始化
void SeqListInit(SeqList *pSL);
// 尾部插入
void SeqListPushBack(SeqList *pSL, DataType data);
// 头部插入
void SeqListPushFront(SeqList *pSL, DataType data);
// 尾部删除
void SeqListPopBack(SeqList *pSL);
// 头部删除
void SeqListPopFront(SeqList *pSL);
// 按下标插入,pos 的范围是 [0, size]
void SeqListInsert(SeqList *pSL, int pos, DataType data);
// 按下标删除,pos 的范围是 [0, size)
void SeqListErase(SeqList *pSL, int pos);
// 按值删除,只删遇到的第一个
void SeqListRemove(SeqList *pSL, DataType data);
// 按值删除,删除所有的
void SeqListRemoveAll(SeqList *pSL, DataType data);
// 清空
void SeqListClear(SeqList *pSL);
// 按值查找,返回第一个找到的下标,如果没找到,返回 -1
int SeqListFind(SeqList *pSL, DataType data);
// 判断是否为空,1 表示空, 0 表示不空
int SeqListEmpty(SeqList *pSL);
// 返回数量
int SeqListSize(SeqList *pSL);
// 销毁
void SeqListDestroy(SeqList *pSL);
//打印
int SeqListPrint(SeqList *pSL);
SeqList.c
#include"SeqList.h"
#include<memory.h>
//初始化
void SeqListInit(SeqList *pSL)
{
if (NULL == pSL)
{
return; //链表为空
}
pSL->size = 0;
}
// 尾部插入
void SeqListPushBack(SeqList *pSL, DataType data)
{
if (NULL == pSL)
{
return;//链表为空
}
if (pSL->size == MAX_SIZE)
{
printf("链表已满\n");
return;
}
pSL->arr[pSL->size] = data;
pSL->size++;
}
// 头部插入
void SeqListPushFront(SeqList *pSL, DataType data)
{
int i;
if (NULL == pSL)
{
return;//链表为空
}
if (pSL->size == MAX_SIZE)
{
printf("链表已满\n");
return;
}
for (i = pSL->size; i > 0; i--)
{
pSL->arr[i] = pSL->arr[i - 1];
}
pSL->arr[0] = data;
pSL->size++;
}
// 尾部删除
void SeqListPopBack(SeqList *pSL)
{
assert(pSL != NULL);
pSL->size--;
}
// 头部删除
void SeqListPopFront(SeqList *pSL)
{
assert(pSL != NULL);
int i;
for (i = 0; i < pSL->size; i++)
{
pSL->arr[i] = pSL->arr[i + 1];
}
pSL->size--;
}
// 按下标插入,pos 的范围是 [0, size]
void SeqListInsert(SeqList *pSL, int pos, DataType data)
{
assert(pSL != NULL);
assert(pos > 0 && pos < pSL->size);
int i = 0;
for (i = 0; i < pSL->size - pos; i++)
{
pSL->arr[pSL->size - i] = pSL->arr[pSL->size - i - 1];
}
pSL->arr[pos] = data;
pSL->size++;
}
// 按下标删除,pos 的范围是 [0, size)
void SeqListErase(SeqList *pSL, int pos)
{
assert(pSL != NULL);
assert(pos > 0 && pos < pSL->size);
int i = 0;
pSL->size--;
for (i = pos; i < pSL->size; i++)
{
pSL->arr[i] = pSL->arr[i + 1];
}
}
void SeqListRemove(SeqList *pSL, DataType data)
{
assert(pSL != NULL);
int index = SeqListFind(pSL, data);
int i;
if (index != -1)
{
for (i=index; i <pSL->size; i++)
{
pSL->arr[i] = pSL->arr[i + 1];
}
pSL->size--;
}
return;
}
// 按值删除,删除所有的
void SeqListRemoveAll(SeqList *pSL, DataType data)
{
assert(pSL != NULL);
int count = 0;
int i = 0;
for (i = 0; i < pSL->size; i++)
{
if (pSL->arr[i] == data)
count++;
else
pSL->arr[i - count] = pSL->arr[i];
}
pSL->size -= count;
return;
}
// 清空
void SeqListClear(SeqList *pSL)
{
memset(pSL, 0, pSL->size);
}
// 按值查找,返回第一个找到的下标,如果没找到,返回 -1
int SeqListFind(SeqList *pSL, DataType data)
{
assert(pSL != NULL);
int i;
for (i = 0; i < pSL->size; i++)
{
if (pSL->arr[i] == data)
return i;
}
return -1;
}
// 判断是否为空,1 表示空, 0 表示不空
int SeqListEmpty(SeqList *pSL)
{
assert(pSL != NULL);
if (pSL->size == 0)
return -1;
else
return 1;
}
// 返回数量
int SeqListSize(SeqList *pSL)
{
assert(pSL != NULL);
printf("pSL->size=%d\n", pSL->size);
return 0;
}
// 销毁
void SeqListDestroy(SeqList *pSL)
{
assert(pSL != NULL);
pSL->size = 0;
}
int SeqListPrint(SeqList *pSL)
{
assert(pSL != NULL);
int i;
for (i = 0; i < pSL->size; i++)
{
printf("%d ", pSL->arr[i]);
}
printf("\n");
return 0;
}
测试函数 test.c
#include"SeqList.h"
void TestSeqList()
{
SeqList S;
SeqListInit(&S);
SeqListPushBack(&S, 3);
SeqListPushBack(&S, 5);
SeqListPushBack(&S, 3);
SeqListPushBack(&S, 8);
SeqListPushBack(&S, 3);
SeqListPushBack(&S, 4);
SeqListPushFront(&S, 2);
SeqListPushFront(&S, 1);
SeqListPrint(&S);
int i =SeqListFind(&S, 3);
printf("%d ", &i);
SeqListPopBack(&S);
SeqListPopFront(&S);
SeqListPrint(&S);
SeqListSize(&S);
SeqListErase(&S, 2);
SeqListPrint(&S);
SeqListRemove(&S, 3);
SeqListPrint(&S);
SeqListRemoveAll(&S, 3);
SeqListPrint(&S);
SeqListSize(&S);
SeqListDestroy(&S);
}
int main()
{
TestSeqList();
system("pause");
return 0;
}
运行结果:
大佬们可以看看还有错没,我觉得已经没有了~~