///C语言实现静态顺序表///
#include<stdio.h>
#include<assert.h>
#define MaxSize 5
typedef int DataType;
typedef struct SeqList
{
DataType arr[MaxSize];
size_t size;
}SeqList,*pSeqList;
void InitSeqList(SeqList* seq)//初始化
{
assert(seq);
printf("%x\n",&seq);
memset(seq->arr,0,sizeof(seq->arr));
seq->size = 0;
}
void PrintSeqList(SeqList* seq)//打印
{
int i = 0;
for(; i < seq->size; i++)
{
printf("%d ",seq->arr[i]);
}
printf("\n");
}
void Reverse(SeqList* seq, int left, int right)//递归逆序打印顺序表
{
if(left < right)
{
int temp;
temp = seq->arr[right];
seq->arr[right] = seq->arr[left];
seq->arr[left] = temp;
Reverse(seq, left+1, right-1);
}
}
void PushBack(SeqList* seq, DataType data)//尾插
{
assert(seq);
if(seq->size >= MaxSize)
return;
seq->arr[seq->size++] = data;
}
void PopBack(SeqList* seq)//尾删
{
assert(seq);
if(seq->size == 0)
return;
seq->size--;
}
void PushFront(SeqList* seq, DataType data)//头插
{
int idx = 0;
for(idx = seq->size-1; idx >= 0; idx--)
{
seq->arr[idx+1] = seq->arr[idx];
}
seq->arr[0] = data;
seq->size++;
}
void PopFront(SeqList* seq)//头删
{
int idx = 0;
assert(seq);
for(idx = 0; idx < seq->size-1; idx++)
{
seq->arr[idx] = seq->arr[idx+1];
}
seq->size--;
}
void Insert(SeqList* seq, size_t pos, DataType data)//任意位置插入
{
int idx = seq->size;//可能尾插
if(NULL == seq || pos > seq->size)//链表为空pos位置大于size都不合法
return;
if(seq->size >= MaxSize)//插入后元素个数大于容量
return;
for(; idx >= pos; idx--)
{
seq->arr[idx] = seq->arr[idx+1];
}
seq->arr[pos] = data;
seq->size++;
}
void Erase(SeqList* seq, size_t pos)//任意位置删除
{
int idx = pos;
if(NULL == seq || pos >= seq->size || seq->size == 0)//如果链表为空或删除位置不合法或链表元素为0
return;
for(;idx < seq->size; idx++)
{
seq->arr[idx] = seq->arr[idx+1];
}
seq->size--;
}
int Find(SeqList* seq, DataType data)//查找某个元素位置
{
int idx = 0;
assert(seq);
for(;idx < seq->size; idx++)
{
if(seq->arr[idx] == data)
return idx;
}
return -1;
}
int BinarySearch(SeqList* seq, int key, int left, int right)
{
int mid;
//left = 0;
//right = seq->size-1;
//assert(seq);
if(left <= right){//左边要小于右边
mid = left + (right-left)/2;
if(seq->arr[mid] == key)
return mid;
else if(seq->arr[mid] < key)
return BinarySearch(seq, key, mid+1, right);
else /*if((seq->arr[mid] > key))*/
{
return BinarySearch(seq, key, left, mid-1);
}
}
else{
return -1;}
}
void Remove(SeqList* seq, DataType data)//删除值为data的元素
{
assert(seq);
Erase(seq, Find(seq, data));
}
void RemoveAll(SeqList* seq, DataType data)//删除所有值为data的元素
{
int count = 0;
int idx = 0;
//assert(seq);
while(idx < seq->size)
{
if(seq->arr[idx] = data)
{
count++;
}
else
{
seq->arr[idx-count] = seq->arr[idx];
}
idx++;
}
seq->size -= count;
}
void BubbleSort(SeqList* seq)//冒泡排序
{
int i = 0;
int j = 0;
int flag = 0;
assert(seq);
for(i = 0; i < seq->size-1; i++)
{
flag = 0;
for(j = 0; j < seq->size-1-i; j++)
{
if(seq->arr[j] > seq->arr[j+1])
{
DataType temp;
temp = seq->arr[j+1];
seq->arr[j+1] = seq->arr[j];
seq->arr[j] = temp;
flag = 1;
}
}
if(flag == 0)
return;
}
}
void FunTest()
{
SeqList seq;
int pos = 0;
InitSeqList(&seq);
//PrintSeqList(&seq);
PushBack(&seq, 2);
PushBack(&seq, 3);
PushBack(&seq, 4);
PushBack(&seq, 5);
PushFront(&seq, 1);
//Insert(&seq, 3, 3);
PrintSeqList(&seq);
Reverse(&seq, 0, 4);
//BubbleSort(&seq);
//pos = BinarySearch(&seq, 4, 0, 4);
//RemoveAll(&seq, 4);
PrintSeqList(&seq);//有问题
PopFront(&seq);
//pos = Find(&seq, 4);
//printf("%d\n",pos);
//Remove(&seq, 4);
printf("%d\n",seq.size);
}
int main()
{
FunTest();
system("pause");
return 0;
}
C语言实现顺序表--静态
最新推荐文章于 2024-09-23 11:12:22 发布