靜態順序表優化改正版
阿新 • • 發佈:2018-11-26
前幾天發的靜態順序表,在處理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;
}
執行結果:
大佬們可以看看還有錯沒,我覺得已經沒有了~~