#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SeqListMaxSize 1000
typedef char SeqType;
typedef struct SeqList
{
SeqType data[SeqListMaxSize];
size_t size;
}SeqList;
/**
* * @brief 给一个顺序表进行初始化
* *
* * @param seq 表示一个顺序表结构的指针
* */
void SeqListInit(SeqList* seq)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
memset(seq->data,0,1000*sizeof(SeqType));
seq->size=0;
}
/**
* * @brief 将一个元素插入到顺序表的末尾
* *
* * @param seq 顺序表结构的指针
* * @param value 新插入的值
* */
void SeqListPushBack(SeqList* seq, SeqType value)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
if(seq->size==SeqListMaxSize)
{
printf("The Seqlist is FULL!\n");
exit(0);
}
seq->data[seq->size]=value;
seq->size++;
}
/**
* * @brief 将顺序表的最后一个元素删除
* *
* * @param seq 顺序表结构的指针
* */
void SeqListPopBack(SeqList* seq)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
if(seq->size==0)
{
printf("NO data to be delet!");
exit(0);
}
seq->data[seq->size-1]=0;
seq->size--;
}
/**
* * @brief 往顺序表的前面插入一个元素
* *
* * @param seq 顺序表结构的指针
* * @param value 新插入的值
* */
void SeqListPushFront(SeqList* seq, SeqType value)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
if(seq->size==SeqListMaxSize)
{
printf("The Seqlist is FULL!\n");
exit(0);
}
size_t i=seq->size;
for(i;i>0;i--)
{
seq->data[i]=seq->data[i-1];
}
seq->data[0]=value;
seq->size++;
}
/**
* * @brief 删除顺序表的第一个元素
* *
* * @param seq 顺序表结构的指针
* */
void SeqListPopFront(SeqList* seq)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
if(seq->size==0)
{
printf("NO data to be delet!");
exit(0);
}
int i=0;
for(i=0;i<(seq->size-1);i++)
{
seq->data[i]=seq->data[i+1];
}
seq->data[i]=0;
seq->size--;
}
/**
* * @brief 取顺序表中任意位置的一个元素
* *
* * @param seq 顺序表的指针
* * @param pos 要取的元素的下标
* * @param default_value 如果取元素失败, 就返回这个值
* *
* * @return 对应下标位置的元素的值
* */
SeqType SeqListGet(SeqList* seq, size_t pos, SeqType default_value)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
if(seq->data[pos]==0)
{
return default_value;
}
else
{
return seq->data[pos];
}
}
/**
* * @brief 将顺序表中指定位置的值进行设置
* *
* * @param seq 顺序表的结构指针
* * @param pos 要修改的顺序表的元素位置
* * @param value 要设置的值.
* */
void SeqListSet(SeqList* seq, size_t pos, SeqType value)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
if(seq->data[pos]==0)
{
printf("NO data to be SET!");
exit(0);
}
else
{
seq->data[pos]=value;
}
}
/**
* * @brief 查找顺序表中指定元素的下标
* *
* * @param seq 顺序表结构指针
* * @param value 要查找的值
* *
* * @return 对应值的下标. 如果找不到, 就返回
* * (size_t)-1
* */
size_t SeqListFind(SeqList* seq, SeqType value)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
if(seq->size==0)
{
printf("NO data to be FIND!");
exit(0);
}
size_t i=0;
for(i;i<seq->size-1;i++)
{
if(seq->data[i]==value)
{
return i;
}
}
return -1;
}
/**
* * @brief 在指定位置插入元素
* *
* * @param seq 顺序表指针
* * @param pos 要插入的位置
* * @param value 要插入的值.
* */
void SeqListInsert(SeqList* seq, size_t pos, SeqType value)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
if(seq->size==SeqListMaxSize)
{
printf("The Seqlist is FULL!\n");
exit(0);
}
if(seq->size<=pos)
{
seq->data[seq->size]=value;
}
else
{
size_t i;
for(i=seq->size;i>pos;i--)
{
seq->data[i]=seq->data[i-1];
}
seq->data[pos]=value;
seq->size++;
}
}
/**
* * @brief 删除指定位置的元素
* *
* * @param seq 顺序表指针
* * @param pos 要删除的元素位置
* */
void SeqListErase(SeqList* seq, size_t pos)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
if(seq->size-1<pos)
{
printf("The position is no value!");
exit(0);
}
size_t i;
for(i=pos;i<seq->size-1;i++)
{
seq->data[i]=seq->data[i+1];
}
seq->data[i]=0;
seq->size--;
}
/**
* * @brief 删除顺序表中指定的值, 如果存在重复元素, 只删除第一个
* *
* * @param seq 顺序表指针
* * @param to_delete 待删除的值
* */
void SeqListRemove(SeqList* seq, SeqType to_delete)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
size_t i=0;
for(i;i<seq->size-1;i++)
{
if(seq->data[i]==to_delete)
{
SeqListErase(seq,i);
break;
}
}
if(i==seq->size-1)
{
printf("The to_delete was not find!");
}
}
/**
* * @brief 删除顺序表中所有的指定的值, 另外要实现一个时间复杂度为 O(N) 的优化版本
* *
* * @param seq 顺序表指针
* * @param to_delete 待删除的元素
* */
void SeqListRemoveAll(SeqList* seq, SeqType to_delete)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
size_t i;
size_t count=0;
size_t flag=0;
size_t j=0;
//O(N^2)
for(i=0;i<seq->size-1;i++)
{
if(seq->data[i]==to_delete)
{
SeqListErase(seq,i);
}
}
//0(N)The seplist should be sorted
for(i=0;i<seq->size-1;i++)
{
if(seq->data[i]==to_delete)
{
if(count==0)
{
flag=i;
}
count++;
}
else if(count!=0)
{
seq->data[flag+j]=seq->data[i];
j++;
}
}
seq->data[flag+j]=0;
}
/**
* * @brief 获取顺序表元素个数
* *
* * @param seq 顺序表指针
* *
* * @return 顺序表元素的个数
* */
size_t SeqListSize(SeqList* seq)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
return seq->size;
}
/**
* * @brief 判定顺序表是否为空
* *
* * @param seq 顺序表指针
* *
* * @return 如果顺序表为空, 返回 1; 否则返回 0
* */
int SeqListEmpty(SeqList* seq)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
if (seq->size==0)
{
return 1;
}
else
{
return 0;
}
}
/**
* * @brief 冒泡排序
* *
* * @param seq 顺序表指针
* */
void SeqListBubbleSort(SeqList* seq)
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
size_t flag=0;
size_t i=0;
size_t j=0;
char tmp;
for(i=0;i<seq->size-1;i++)
{
flag=0;
for(j=0;j<seq->size-1-i;j++)
{
if(seq->data[j]>seq->data[j+1])
{
flag=1;
tmp=seq->data[j];
seq->data[j]=seq->data[j+1];
seq->data[j+1]=tmp;
}
}
if(flag==0)
{
break;
}
}
}
int cmp_char( void *p1,void *p2)
{
return ( *(char*)p1 > *(char*)p2);
}
/**
* * @brief 冒泡排序
* *
* * @param seq 顺序表指针
* */
void SeqListBubbleSortEx(SeqList* seq, int (*cmp)(void*p1 , void*p2))
{
if(seq==NULL)
{
printf("The Seqlist is NULL!\n");
exit(0);
}
size_t flag=0;
size_t i=0;
size_t j=0;
char tmp;
for(i=0;i<seq->size-1;i++)
{
flag=0;
for(j=0;j<seq->size-1-i;j++)
{
if(cmp(&seq->data[j],&seq->data[j+1])>0)
{
flag=1;
tmp=seq->data[j];
seq->data[j]=seq->data[j+1];
seq->data[j+1]=tmp;
}
}
if(flag==0)
{
break;
}
}
}
int main()
{
SeqList *p=(SeqList*)malloc(sizeof(SeqList));
SeqListInit(p);
SeqListPushBack(p, 'a');
SeqListPopBack(p);
SeqListPushBack(p, 'a');
SeqListPushBack(p, 'a');
SeqListPushBack(p, 'a');
SeqListPushBack(p, 'b');
SeqListPushBack(p, 'c');
printf("The pos 3 is '%c'.\n", SeqListGet(p, 3, 'm'));
SeqListPushFront(p, 'z');
SeqListPopFront(p);
printf("The pos 3 is %c.\n", SeqListGet(p, 3, 'm'));
SeqListSet(p, 2, 'x');
printf("The pos is %d.\n",SeqListFind(p, 'x'));
SeqListInsert(p, 3, 'n');
SeqListErase(p, 3);
printf("The size of seqlist is %d. \n",SeqListSize(p));
SeqListRemove(p, 'x');
SeqListBubbleSortEx(p, cmp_char);
SeqListRemoveAll(p, 'a');
printf("The size of seqlist is %d.\n",SeqListSize(p));
SeqListBubbleSort(p);
SeqListEmpty(p);
return 0;
}