您的位置:首页 > 编程语言 > C语言/C++

c语言顺序表动态实现

2016-09-11 13:33 357 查看

动态版与静态版区别:当插入数据时内存空间不够时,动态版的顺序表可以再重新开辟一块更大的空间用来存放数据。

顺序表的优缺点:顺序表的优点是便于随机存储,缺点是不便于插入删除等操作,因为插入删除一个元素需要移动其后的所有元素。

结构体实现

typedef int DataType;
typedef struct SeqListD
{
DataType* array;
int capacity;
int size;
}Seq, *pSeq;
函数功能实现

void InitSeqlist(pSeq Seq)
{//初始化
assert(Seq);
Seq->capacity = 3;
Seq->array = (DataType*)malloc(sizeof(DataType)*Seq->capacity);
memset(Seq->array, 0, sizeof(DataType) * 3);
Seq->size = 0;
}
int Empty(pSeq Seq)
{//判空
assert(Seq);
if (0 == Seq->size)
{
return 1;
}
return 0;
}
void PopBack(pSeq Seq)
{//尾删
assert(Seq);
if (Empty(Seq))
return 0;
Seq->size--;
}
void PushBack(pSeq Seq, DataType data)
{//尾插
assert(Seq && data);
if (Seq->size >= Seq->capacity)
{
DataType* temp;
Seq->capacity *= 2;
temp = (DataType*)malloc(sizeof(DataType)*Seq->capacity);
memcpy(temp, Seq->array, sizeof(DataType)*Seq->size);
Seq->array = temp;
}
Seq->array[Seq->size++] = data;
}
void PopFront(pSeq Seq)
{//头删
int i = 0;
assert(Seq);
if (Empty(Seq))
return 0;
for (i = 0; i < Seq->size - 1; i++)
{
Seq->array[i] = Seq->array[i + 1];
}
Seq->size--;
}
void PushFront(pSeq Seq, DataType data)
{//头插
int i = 0;
assert(Seq && data);
if (Seq->size >= Seq->capacity)
{
DataType* temp;
Seq->capacity *= 2;
temp = (DataType*)malloc(sizeof(DataType)*Seq->capacity);
memcpy(temp, Seq->array, sizeof(DataType)*Seq->size);
Seq->array = temp;
}
for (i = Seq->size; i > 0; i--)
{
Seq->array[i] = Seq->array[i - 1];
}
Seq->array[0] = data;
Seq->size++;

}
void PrintSeq(pSeq Seq)
{//打印
int i = 0;
assert(Seq);
for (i = 0; i < Seq->size; i++)
printf("%d", Seq->array[i]);
printf("\n");
}
void BubbleSort1(pSeq Seq)
{//回调函数冒泡升序
int i = 0;
int j = 0;
int flag = 0;
assert(Seq);
for (j = 0; j < Seq->size; j++)
{
flag = 1;
for (i = 0; i < Seq->size - j - 1; i++)
{
if (Seq->array[i]>Seq->array[i + 1])
{
DataType temp = Seq->array[i];
Seq->array[i] = Seq->array[i + 1];
Seq->array[i + 1] = temp;
flag = 0;
}
}
if (flag)
return 0;
}
}

void BubbleSort2(pSeq Seq)
{//回调函数冒泡降序
int i = 0;
int j = 0;
int flag = 0;
assert(Seq);
for (i = 0; i < Seq->size; i++)
{
flag = 1;
for (j = 0; j < Seq->size - i - 1; j++)
{
if (Seq->array[j] < Seq->array[j + 1])
{
DataType temp = Seq->array[j];
Seq->array[j] = Seq->array[j + 1];
Seq->array[j + 1] = temp;
flag = 0;
}
}
if (flag)
return 0;
}
}

void BubbleSort(pSeq Seq, void(*op)(pSeq))
{//回调函数登记函数
assert(Seq);
op(Seq);
}
void SelectSort(pSeq Seq)
{//选择排序降序
int i = 0;
int j = 0;
int min = 0;
assert(Seq);
for (j = 0; j < Seq->size; j++)
{
min = j;
for (i = j + 1; i < Seq->size - j - 1; i++)
{
if (Seq->array[min] > Seq->array[i])
{
min = i;
}
DataType temp = 0;
temp = Seq->array[i];
Seq->array[i] = Seq->array[min];
Seq->array[min] = temp;
}
}
}

int BinarySearch(pSeq Seq, DataType data)
{//二分
assert(Seq);
int left = 0;
int right = Seq->size - 1;
int mid = left + (right - left) >> 1;
assert(Seq && data);
while (left <= right)
{
if (Seq->array[mid] > data)
right = mid - 1;
else if (Seq->array[mid] < data)
left = mid + 1;
else
return mid;
}
}

int BinarySearch2(pSeq Seq,DataType data,int left,int right)
{//递归二分
assert(Seq&& (right < Seq->size));
int mid = left + (right - left) >> 1;
if (data<Seq->array[mid])
{
BinarySearch2(Seq,data,left,mid-1);
}
else if (data>Seq->array[mid])
{
BinarySearch2(Seq, data, mid, right);
}
else
{
return mid;
}
}

int Size(pSeq Seq)
{//判断大小
assert(Seq);
return Seq->size;
}

void Clear(pSeq Seq)
{//清空
asserr(Seq);
Seq->size = 0;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  结构 typedef struct c