【データ構造】C言語実装シーケンステーブル(静的シーケンステーブル)
静的順序テーブルの定義:
シーケンシャルテーブルのコンセプト?--データ要素の線形構造は、連続するメモリセルで順次格納される.
順序テーブルを実装する理由--配列を比較...
シーケンステーブルの特徴:特定の要素にアクセスする時間の複雑度がO(1)増加し、1つの要素を削除する時間がO(n)長さ固定、記憶連続である
順序テーブルの定義:
実装コード:
SeqList.h
test.c
シーケンシャルテーブルのコンセプト?--データ要素の線形構造は、連続するメモリセルで順次格納される.
順序テーブルを実装する理由--配列を比較...
シーケンステーブルの特徴:特定の要素にアクセスする時間の複雑度がO(1)増加し、1つの要素を削除する時間がO(n)長さ固定、記憶連続である
順序テーブルの定義:
typedef int DataType;
#define MAX 100
typedef struct seqlist
{
DataType data[MAX];
int _size;
}SeqList, *pSeqList;
//void InitSeqlist(pSeqList plist);//
//void PrintSeqlist(pSeqList plist);//
//void PushBack(pSeqList plist, DataType x);//
//void PopBack(pSeqList plist);//
//void PushFront(pSeqList plist, DataType x);//
//void PopFront(pSeqList plist);//
//void Insert(pSeqList plist, int pos, DataType x);//
//void Remove(pSeqList plist, DataType x);//
//void RemoveAll(pSeqList plist, DataType x);
//int Find(pSeqList plist, DataType x);//
//void ReverseList(pSeqList plist);//
//void SortList(pSeqList plist);//
//void BinarySearch(pSeqList plist, DataType x);//
実装コード:
SeqList.h
#ifndef _SEQ_LIST_H_
#define _SEQ_LIST_H_
#include
#include
#include
#include
typedef int DataType;
#define MAX 100
typedef struct seqlist
{
DataType data[MAX];
int _size;
}SeqList, *pSeqList;
//
void InitSeqList(pSeqList plist)
{
assert(NULL != plist);
memset(plist->data, 0, sizeof(DataType)*MAX);
plist->_size = 0;
}
//
void PrintSeqList(SeqList plist)
{
int i = 0;
if (plist._size == 0)
{
printf("SeqList id empty...
");
return;
}
for (i = 0; i < plist._size; i++)
{
printf("%d ", plist.data[i]);
}
printf("
");
}
//
void Push_back(pSeqList plist, DataType x)
{
assert(NULL != plist);
if (plist->_size == MAX)
{
printf("SeqList if full!!!
");
return;
}
plist->data[plist->_size++] = x;
}
//
void Pop_back(pSeqList plist)
{
assert(NULL != plist);
if (plist->_size == 0)
{
printf("SeqList is empty!!!
");
return;
}
plist->_size--;
}
void Push_Front(pSeqList plist, DataType x)
{
assert(NULL != plist);
if (plist->_size == MAX)
{
printf("SeqList if full!!!
");
return;
}
int index = plist->_size;
for (; index > 0; index--)
{
plist->data[index] = plist->data[index - 1];
}
plist->data[index] = x;
plist->_size++;
}
void Pop_Front(pSeqList plist)
{
assert(NULL != plist);
if (plist->_size == 0)
{
printf("SeqList is empty!!!
");
return;
}
int index = 0;
for (; index < plist->_size; index++)
{
plist->data[index] = plist->data[index + 1];
}
plist->_size--;
}
//
void Insert(pSeqList plist, DataType x, int pos)
{
assert(NULL != plist);
if ((pos >= MAX) && pos < 0)
{
printf("position is error!!!
");
return;
}
int index = plist->_size;
for (; index>pos; index--)
{
plist->data[index] = plist->data[index - 1];
}
plist->data[index] = x;
plist->_size++;
}
//
void Remove(pSeqList plist, DataType x)
{
assert(NULL != plist);
if (plist->_size == 0)
{
printf("SeqList is empty!!!
");
return;
}
int isFind = Find(*plist, x);
if (isFind > 0)
{
int index = isFind;
for (; index < plist->_size; index++)
{
plist->data[index] = plist->data[index + 1];
}
plist->_size--;
}
else
printf("not exist
");
}
//
void RemoveAll(pSeqList plist, DataType x)
{
assert(NULL != plist);
if (plist->_size == 0)
{
printf("SeqList is empty!!!
");
return;
}
int isFind = 0;
while ((isFind = Find(*plist, x))!=-1)
{
int index = isFind;
for (; index < plist->_size; index++)
{
plist->data[index] = plist->data[index + 1];
}
plist->_size--;
}
}
int Find(SeqList plist, DataType x)
{
int index = 0;
for (; index < plist._size; index++)
{
if (x == plist.data[index])
return index;
}
return -1;
}
//
void SortSeqList(pSeqList plist)
{
assert(NULL != plist);
int index = 0;
int index2 = 0;
int flag = 0;
for (; index < plist->_size - 1;index++)
{
flag = 1;
for (index2 = 0; index2 < plist->_size - index - 1; index2++)
{
if (plist->data[index2] > plist->data[index2 + 1])
{
DataType tmp = plist->data[index2];
plist->data[index2] = plist->data[index2 + 1];
plist->data[index2 + 1] = tmp;
flag = 0;
}
}
if (flag == 1)
return;
}
}
//
void Reverse(pSeqList plist)
{
assert(NULL != plist);
int start = 0;
int end = plist->_size - 1;
while (start != end)
{
DataType tmp = plist->data[start];
plist->data[start] = plist->data[end];
plist->data[end] = tmp;
start++;
end--;
}
}
void BinarySearch(pSeqList plist, DataType x)
{
assert(NULL != plist);
int left = 0;
int right = plist->_size - 1;
int mid = (left + right) / 2;
while (left <= right)
{
int mid = (left + right) / 2;
if (plist->data[mid] == x)
{
printf(" , %d
", mid + 1);
return 0;
}
else if (x > plist->data[mid])
{
left = mid + 1;
}
else if (x < plist->data[mid])
{
right = mid - 1;
}
}
printf("
");
}
#endif
test.c
#include"SeqList.h"
void FunTest1()
{
SeqList _list;
InitSeqList(&_list);
//
Push_back(&_list,1);
Push_back(&_list, 2);
Push_back(&_list, 3);
Push_back(&_list, 4);
Push_back(&_list, 5);
Push_back(&_list, 6);
Push_back(&_list, 2);
Push_back(&_list, 8);
Push_back(&_list, 2);
PrintSeqList(_list);
//
Pop_back(&_list);
PrintSeqList(_list);
//
Push_Front(&_list, 0);
PrintSeqList(_list);
//
Pop_Front(&_list);
PrintSeqList(_list);
//
Insert(&_list, 6, 2);
PrintSeqList(_list);
//
Remove(&_list, 2);
PrintSeqList(_list);
//
RemoveAll(&_list, 2);
PrintSeqList(_list);
//
/*Reverse(&_list);
PrintSeqList(_list);*/
//
BinarySearch(&_list, 5);
//
SortSeqList(&_list);
PrintSeqList(_list);
}
int main()
{
FunTest1();
system("pause");
return 0;
}