typedef int DataType;
#define MAX 100
typedef struct Seqlist
{
DataType data[MAX];
int sz;
}Seqlist;
//以下都是传址,结构体传址效率高
void InitSeqlist(Seqlist* plist); //初始化
void PushBack(Seqlist* plist, DataType x); //尾插
void PopBack(Seqlist* plist); //尾删
void PushFront(Seqlist* plist, DataType x); //头插
void PopFront(Seqlist* plist); //头删
void PrintSeqlist(const Seqlist* plist); //打印
void Insert(Seqlist* plist, int pos, DataType x); //在pos下标处插入数据
void Remove(Seqlist* plist, DataType x); //删除第一次出现的指定数据
void RemoveAll(Seqlist* plist, DataType x); //删除所有指定数据
void ReverseList(Seqlist* plist); //逆序存储
void SortSeqlist(Seqlist* plist); //排序
int Find(Seqlist* plist, DataType x); //查找
int BinarySearchSeqlist(Seqlist* plist, DataType x); //二分查找
void PrintSeqlist(const Seqlist* plist)
{
int i = 0;
for(i=0; i<(plist->sz); i++)
{
printf("%d ", plist->data[i]);
}
printf("\n");
}
void InitSeqlist(Seqlist* plist)
{
plist -> sz = 0;
memset(plist->data, 0, sizeof(plist->data));
}
void PushBack(Seqlist* plist, DataType x)
{
assert(plist);
if (plist -> sz == MAX)
{
return;
}
plist -> data[plist -> sz] = x;
(plist -> sz) += 1;
}
void PopBack(Seqlist* plist)
{
assert(plist);
if(plist -> sz == 0)
{
return;
}
(plist -> sz) --; //不用删数据,和链表free一样
}
void PushFront(Seqlist* plist, DataType x)
{
assert(plist);
int i = 0;
if(plist->sz == MAX)
{
return;
}
for (i=plist->sz; i>0; i--)
{
plist -> data[i] = plist -> data[i-1];
}
plist -> data[0] = x;
plist -> sz++;
}
void PopFront(Seqlist* plist)
{
int i = 0;
assert(plist);
if(plist -> sz == 0)
{
return;
}
//循环sz-1次
for(i=0; i<plist->sz-1; i++)
{
plist -> data[i] = plist -> data[i+1];
}
//如果只有一个元素,循环不进去,sz直接--
plist -> sz --;
}
void Insert(Seqlist* plist, int pos, DataType x)
{
int i = 0;
assert(plist);
if(plist->sz == MAX)
{
return;
}
for(i=plist->sz; i>pos; i--)
{
plist->data[i] = plist->data[i-1];
}
plist->data[pos] = x;
plist->sz ++;
}
int Find(Seqlist* plist, DataType x)
{
assert(plist);
int i = 0;
for(i=0; i<plist->sz; i++)
{
if(plist->data[i] == x)
{
return i;
}
}
return -1;
}
void Remove(Seqlist* plist, DataType x)
{
assert(plist);
int pos = Find(plist, x);
if(plist->sz == 0)
{
return;
}
if(pos == -1)
{
return;
}
int i = 0;
for(i=pos; i<plist->sz-1; i++)
{
plist->data[i] = plist->data[i+1];
}
plist->sz --;
}
void RemoveAll(Seqlist* plist, DataType x)
{
assert(plist);
if(plist->sz == 0)
{
return;
}
while(Find(plist, x) != -1)
{
int pos = Find(plist, x);
int i = 0;
for(i=pos; i<plist->sz-1; i++)
{
plist->data[i] = plist->data[i+1];
}
plist->sz --;
}
}
void ReverseList(Seqlist* plist)
{
assert(plist);
int left = 0;
int right = plist->sz-1;
while(left<right)
{
DataType tmp = plist->data[left];
plist->data[left] = plist->data[right];
plist->data[right] = tmp;
left++;
right--;
}
}
void SortSeqlist(Seqlist* plist)
{
assert(plist);
int i = 0;
for(i=0; i<plist->sz-1; i++)
{
int j = 0;
for(j=0; j<plist->sz-1-i; j++)
{
if(plist->data[j] > plist->data[j+1])
{
DataType tmp = plist->data[j];
plist->data[j] = plist->data[j+1];
plist->data[j+1] = tmp;
}
}
}
}
int BinarySearchSeqlist(Seqlist* plist, DataType x)
{
assert(plist);
int left = 0;
int right = plist->sz;
while (left <= right)
{
int mid = left - (left - right)/2;
if (x > plist->data[mid])
{
left = mid + 1;
}
else if (x < plist->data[mid])
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
C语言实现顺序表
最新推荐文章于 2017-07-22 18:02:58 发布