静态顺序表和动态顺序表是其他表结构的基础
静态顺序表
SeqList.h
#ifndef __SEQLIST__H__
#define __SEQLIST__H__
#include <stdio.h>
#include <string.h>
#include <assert.h>
#define MAX 100
typedef int DateType;
typedef struct SeqList
{
DateType data[MAX];
int sz;
}SeqList,*pSeqList;
void InitSeqlist(pSeqList ps);
void PushBack(pSeqList ps, DateType d);
void PrintSeqist(const pSeqList ps);
void PopBack(pSeqList ps);
void PushFront(pSeqList ps, DateType d);
void PopFront(pSeqList ps);
void Insert(pSeqList ps, int pos, DateType d);
int Find(pSeqList ps, DateType d);
void Remove(pSeqList ps, DateType d);
void ReverseSeqlist(pSeqList ps);
void SortSeqlist(pSeqList ps);
int BinarySearch(pSeqList ps, DateType d);
#endif//__SEQLIST__H__
SeqList.c
#include "SeqList.h"
void InitSeqlist(pSeqList ps)
{
assert(ps);
memset(ps->data,0,sizeof(ps->data[0])*MAX);
ps->sz=0;
return;
}
void PrintSeqist(const pSeqList ps)
{
int i = 0;
for(i=0;i<ps->sz;i++)
{
printf("%d ",ps->data[i]);
}
printf("\n");
return;
}
void PushBack(pSeqList ps, DateType d)
{
assert(ps);
if(ps->sz==MAX)
{
return;
}
ps->data[ps->sz]=d;
ps->sz++;
return;
}
void PopBack(pSeqList ps)
{
assert(ps);
if(ps->sz==0)
{
return;
}
ps->sz--;
return;
}
void PushFront(pSeqList ps, DateType d)
{
int i = 0;
assert(ps);
if (ps->sz==MAX)
{
return;
}
for (i=ps->sz;i>0;i--)//在这种有判断的地方留一个心,可以假设最后那个值,看是否合适
{
ps->data[i]=ps->data[i-1];
}
ps->data[0]=d;
ps->sz++;
return;
}
void PopFront(pSeqList ps)
{
int i = 0;
assert(ps);
if (ps->sz==0)
{
return;
}
for (i=0;i<ps->sz-1;i++)
{
ps->data[i]=ps->data[i+1];
}
ps->sz--;
return;
}
void Insert(pSeqList ps, int pos, DateType d)
{
int i = 0;
assert(ps);
if (ps->sz==MAX)
{
return;
}
for (i=ps->sz;i>pos;i--)
{
ps->data[i]=ps->data[i-1];
}
ps->data[pos]=d;
ps->sz++;
return;
}
int Find(pSeqList ps, DateType d)
{
int i = 0;
assert(ps);
if(ps->sz!=0)
{
for (i=0;i<ps->sz;i++)
{
if(ps->data[i]==d)
return i;
}
}
return -1;
}
void Remove(pSeqList ps, DateType d)
{
int ret = 0;
int i = 0;
assert(ps);
if (ps->sz==0)
{
return;
}
ret = Find(ps,d);
if (ret!=-1)
{
for (i=ret;i<ps->sz-1;i++)
{
ps->data[i]=ps->data[i+1];
}
ps->sz--;
}
return;
}
void ReverseSeqlist(pSeqList ps)
{
int left = 0;
int right = ps->sz-1;
int tmp = 0;
assert(ps);
if (ps->sz==0)
{
return;
}
while(left<right)
{
tmp = ps->data[right];
ps->data[right] = ps->data[left];
ps->data[left] = tmp;
left++;
right--;
}
return;
}
void SortSeqlist(pSeqList ps)
{
int i = 0;
int j = 0;
int tmp = 0;
assert(ps);
if (ps->sz==0)
{
return;
}
for (i=0;i<ps->sz-1;i++)
{
for (j=0;j<ps->sz-1-i;j++)
{
if (ps->data[j]>ps->data[j+1])
{
tmp = ps->data[j];
ps->data[j] = ps->data[j+1];
ps->data[j+1] = tmp;
}
}
}
return;
}
int BinarySearch(pSeqList ps, DateType d)
{
int left = 0;
int right = ps->sz-1;
int mid = 0;
SortSeqlist(ps);
assert(ps);
if (ps->sz!=0)
{
while (left<=right)//注意是小于等于
{
mid = (left+right)/2;
if (ps->data[mid]==d)
{
return mid;
}
else if (ps->data[mid]<d)
{
left = mid+1;
}
else
{
right = mid-1;
}
}
}
return -1;
}
test.c
#include "SeqList.h"
void test()
{
SeqList s;
int ret = 0;
InitSeqlist(&s);
PushBack(&s,1);
PushBack(&s,3);
PushBack(&s,2);
PushBack(&s,4);
PrintSeqist(&s);
return;
}
int main()
{
test();
return 0;
}
上述功能均测试通过,有兴趣可以自行再测试。
动态顺序表
SeqList_D.h
#ifndef __SEQLIST_D_H__
#define __SEQLIST_D_H__
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int DataType;
#define DEFALUT_INC 5
typedef struct SeqList
{
DataType* pdata;//指向数据的存储位置
int sz;//有效个数
int capacity;//容量
}SeqList, *pSeqList;
//初始化顺序表
void InitSeqList(pSeqList ps);//初始化表
void DestroySeqList(pSeqList ps);//销毁表
void PushBack(pSeqList ps, DataType d);//在尾部添加
void PrintSeqList(const pSeqList ps);//打印顺序表
void PopBack(pSeqList ps);//删除尾部元素
void PushFront(pSeqList ps, DataType d);//在头部添加
void PopFront(pSeqList ps);//删除头部元素
void Insert(pSeqList ps, int pos, DataType d);//在输入位置前端插入
int Find(pSeqList ps, DataType d);//查找某元素位置
void Remove(pSeqList ps, DataType d);//删除输入的元素
void ReverseSeqlist(pSeqList ps);//逆序顺序表
void SortSeqlist(pSeqList ps);//排序顺序表(冒泡)
int BinarySearch(pSeqList ps, DataType d);//二分查找
#endif//__SEQLIST_D_H__
SeqList.c
#include "SeqList_D.h"
void InitSeqList(pSeqList ps)
{
ps->sz=0;//
ps->capacity=DEFALUT_INC;
ps->pdata=(DataType*)malloc(sizeof(DataType)*(DEFALUT_INC));
if(ps->pdata==NULL)
return;
}
void DestroySeqList(pSeqList ps)
{
ps->sz=0;
ps->capacity=DEFALUT_INC;
free(ps->pdata);//释放这个,并且之后要给空值
ps->pdata=NULL;
}
int Check_Capacity(pSeqList ps)
{
DataType* temp = ps->pdata;//预防开辟失败
assert(ps);
if(ps->capacity==ps->sz)
{
ps->pdata=(DataType*)realloc(ps->pdata,sizeof(DataType)*(ps->capacity+DEFALUT_INC));//realloc中还有个参数是内存起始地址
if(ps->pdata==NULL)
{
ps->pdata=temp;
return -1;
}
else
{
ps->capacity=ps->capacity+DEFALUT_INC;
}
}
return 1;
}
void PushBack(pSeqList ps, DataType d)
{
int ret= Check_Capacity(ps);//这个动态开辟也就是在添加时候需要
assert(ps);
if(ret==1)
{
ps->pdata[ps->sz]=d;
ps->sz++;
}
}
void PrintSeqList(const pSeqList ps)
{
int i = 0;
for(i=0;i<ps->sz;i++)
{
printf("%d ",ps->pdata[i]);
}
printf("\n");
return;
}
void PopBack(pSeqList ps)
{
assert(ps);
if(ps->sz==0)
{
return;
}
ps->sz--;
return;
}
void PushFront(pSeqList ps, DataType d)
{
int i = 0;
int ret = Check_Capacity(ps);
assert(ps);
if(ret==1)
{
for (i=ps->sz;i>0;i--)
{
ps->pdata[i]=ps->pdata[i-1];
}
ps->pdata[0]=d;
ps->sz++;
}
}
void PopFront(pSeqList ps)
{
int i = 0;
assert(ps);
if (ps->sz==0)
{
return;
}
for (i=0;i<ps->sz-1;i++)
{
ps->pdata[i]=ps->pdata[i+1];
}
ps->sz--;
return;
}
void Insert(pSeqList ps, int pos, DataType d)
{
int i = 0;
int ret = Check_Capacity(ps);
assert(ps);
if (ret==1)
{
for (i=ps->sz;i>pos;i--)
{
ps->pdata[i]=ps->pdata[i-1];
}
ps->pdata[pos]=d;
ps->sz++;
}
return;
}
int Find(pSeqList ps, DataType d)
{
int i = 0;
assert(ps);
if(ps->sz!=0)
{
for (i=0;i<ps->sz;i++)
{
if(ps->pdata[i]==d)
return i;
}
}
return -1;
}
void Remove(pSeqList ps, DataType d)
{
int ret = 0;
int i = 0;
assert(ps);
if (ps->sz==0)
{
return;
}
ret = Find(ps,d);
if (ret!=-1)
{
for (i=ret;i<ps->sz-1;i++)
{
ps->pdata[i]=ps->pdata[i+1];
}
ps->sz--;
}
return;
}
void ReverseSeqlist(pSeqList ps)
{
int left = 0;
int right = ps->sz-1;
int tmp = 0;
assert(ps);
if (ps->sz==0)
{
return;
}
while(left<right)
{
tmp = ps->pdata[right];
ps->pdata[right] = ps->pdata[left];
ps->pdata[left] = tmp;
left++;
right--;
}
return;
}
void SortSeqlist(pSeqList ps)
{
int i = 0;
int j = 0;
int tmp = 0;
assert(ps);
if (ps->sz==0)
{
return;
}
for (i=0;i<ps->sz-1;i++)
{
for (j=0;j<ps->sz-1-i;j++)
{
if (ps->pdata[j]>ps->pdata[j+1])
{
tmp = ps->pdata[j];
ps->pdata[j] = ps->pdata[j+1];
ps->pdata[j+1] = tmp;
}
}
}
return;
}
int BinarySearch(pSeqList ps, DataType d)
{
int left = 0;
int right = ps->sz-1;
int mid = 0;
SortSeqlist(ps);
assert(ps);
if (ps->sz!=0)
{
while (left<=right)
{
mid = (left+right)/2;
if (ps->pdata[mid]==d)
{
return mid;
}
else if (ps->pdata[mid]<d)
{
left = mid+1;
}
else
{
right = mid-1;
}
}
}
return -1;
}
test.c
#include "SeqList_D.h"
void test()
{
SeqList s;
InitSeqList(&s);
PushBack(&s,1);
PushBack(&s,2);
PushBack(&s,5);
PushBack(&s,4);
PushBack(&s,3);
PrintSeqList(&s);
SortSeqlist(&s);
PrintSeqList(&s);
return;
}
int main()
{
test();
return 0;
}