【データ構造】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;
}