您的位置:首页 > 数据库 > Oracle

Oracle内存结构研究-PGA篇

2009-11-17 16:34 344 查看
顺序表的搭建,就是一个本身的结构,利用的是数组,开辟的内存空间大小是固定的。没有链式结构那样的开辟空间的可控性。最基本的数据结构认知。

然后我们来看看数据结构中的基本实现和思想:

#include "seqList.h"
#include <stdio.h>
#include <assert.h>
//顺序表的初始化
void InitSeqList(SeqList* seq)
{
int _index = 0;
assert(seq);
for(;_index < MAX_SIZE;++_index)
{
seq->_array[_index] = 0;
}
seq->_size = 0;
}

//打印顺序表
void PrintSeqList(SeqList* seq)
{
int _index = 0;
assert(seq);
if(0 == seq->_size)
{
printf("顺序表没有数据\n");
return;
}
for(;_index<seq->_size;++_index)
{
printf("%d ",seq->_array[_index]);
}
printf("\n");
}
//尾部插入
void PushBack(SeqList* seq, DataType x)
{
int _CheckSeq;
assert(seq);
if(1 == (_CheckSeq = CheckSeqList(seq)))
{
printf("顺序表已满");
return;
}
seq->_array[seq->_size++] = x;
}
//尾部删除
void PopBack(SeqList* seq)
{
int _CheckSeq;
assert(seq);
if(0 == (_CheckSeq = CheckSeqList(seq)))
{
printf("顺序表为空\n");
return;
}
seq->_array[--seq->_size] = 0;
}
//头部插入
void PushFront(SeqList* seq, DataType x)
{
int _index = 0;
int _CheckSeq;
assert(seq);
if(1 == (_CheckSeq = CheckSeqList(seq)))
{
printf("顺序表已满");
return;
}
for(;_index < seq->_size;++_index)
{
seq->_array[seq->_size-_index] = seq->_array[seq->_size - _index - 1];
}
seq->_array[0] = x;
seq->_size++;
}
//头部删除
void PopFront(SeqList* seq)
{
int _index = 0;
int _CheckSeq;
assert(seq);
if(0 == (_CheckSeq = CheckSeqList(seq)))
{
printf("顺序表为空\n");
return;
}
for(;_index<seq->_size-1;++_index)
{
seq->_array[_index] = seq->_array[_index+1];
}
seq->_size--;
}
//插入操作
void Insert(SeqList* seq, size_t pos, DataType x)
{
int _index = seq->_size;
int _CheckSeq;
assert(seq);
if(1 == (_CheckSeq = CheckSeqList(seq)))
{
printf("顺序表已满");
return;
}
if(pos < 0 || pos > seq->_size)
{
printf("修改位置超出边界");
return;
}
for(;_index > pos;--_index)
{
seq->_array[_index] = seq->_array[_index - 1];
}
seq->_array[pos] = x;
seq->_size++;
}

//寻找。
// 返回-1表示未找到数据
int Find(SeqList* seq, DataType x)
{
int _endIndex = 0;
assert(seq);
for(; _endIndex < seq->_size;++ _endIndex)
{
if(x == seq->_array[_endIndex])
{
return _endIndex;
}
}
return -1;
}
//擦除输入坐标的数据
void Erase(SeqList* seq, size_t pos)
{
int _index = pos;
assert(seq);
if(pos < 0 || pos > seq->_size)
{
printf("修改位置超出边界");
return;
}
for(;_index < seq->_size-1;++_index)
{
seq->_array[_index] = seq->_array[_index+1];
}
}
//移除查找到的第一个函数
void Remove(SeqList* seq, DataType x)
{
int _pos = 0;
int _index = -1;
for(;_pos < seq->_size;++_pos)
{
if(x == seq->_array[_pos])
{
_index = _pos;
break;
}
}
if(-1 != _index)
{
for(;_index < seq->_size - 1;++_index)
{
seq->_array[_index] = seq->_array[_index + 1];
}
seq->_size--;
}
else
{
printf("没有这个数");
}
}
//移除所有查询到的数据,这个算法比较优质。直接移动替换。
void RemoveAll(SeqList* seq, DataType x)
{
int _pos = 0;
int _index = 0;
for(;_pos < seq->_size;++_pos)
{
if(x != seq->_array[_pos])
{
seq->_array[_index] = seq->_array[_pos];
_index++;
}
}
}
//修改函数。
void Modify(SeqList* seq, size_t pos, DataType x)
{
assert(seq);
if(pos < 0 || pos > seq->_size)
{
printf("修改位置超出边界");
return;
}
seq->_array[pos] = x;
}

int CheckSeqList(SeqList *seq)
{
if(MAX_SIZE == seq->_size)
{
return 1;
}
if(0 == seq->_size)
{
return 0;
}
}
就这么多了。其实就是一些简单的数据结构的基本思维。增删改插的基本思维。

本文出自 “剩蛋君” 博客,请务必保留此出处http://memory73.blog.51cto.com/10530560/1703683
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: