#include <stdio.h>
#include <stdlib.h>
//为了提高代码的拓展性,对数据类型取别名,方便对表中的数据类型进行修改
typedef int DataType;
#define N 32
//定义一个结构体
typedef struct
{
DataType data[N];
int pos; //数组下标
}seqlist;
//顺序表的创建
seqlist * SeqlistCreate();
//判断顺序表是否为满
int SeqlistIsFull(seqlist *st);
//插入数据
void SeqlistInsert(seqlist *st,DataType value);
//遍历顺序表
void SeqlistPrint(seqlist *st);
//判断顺序表是否为空
int SeqlistIsEmpty(seqlist *st);
//删除数据并且返回要删除的数据
DataType SeqlistDelete(seqlist *st);
//按照位置插入数据
void SeqlistInsertByPos(seqlist *st,int p,DataType value);
//按照位置删除数据,返回删除的数据
DataType SeqlistDeleteByPos(seqlist *st,int p);
//按照数据修改数据
void SeqlistUpdateByData(seqlist *st,DataType OldValue,DataType NewValue);
//按照位置修改数据
void SeqlistUpdateByPos(seqlist *st,int p,DataType value);
//按照数据查找位置
int SeqlistSearchPos(seqlist *st,DataType value);
//按照位置查找数据
DataType SeqlistSearchData(seqlist *st,int p);
//删除重复数据
void SeqlistDeleteRepeat(seqlist *st);
//合并表
void SeqlistMerge(seqlist *s1,seqlist *s2);
int main(int argc, char const *argv[])
{
seqlist *st = SeqlistCreate();
if(st == NULL)
{
printf("顺序表初始化失败!\n");
return -1;
}
int i;
for(i = 1 ; i <= 32;i++)
{
SeqlistInsert(st,i);
}
SeqlistPrint(st);
for(i = 0 ; i < 10;i++)
{
SeqlistDelete(st);
}
SeqlistPrint(st);
SeqlistInsertByPos(st,7,777);
SeqlistPrint(st);
SeqlistDeleteByPos(st,9);
SeqlistPrint(st);
SeqlistUpdateByData(st,10,999);
SeqlistPrint(st);
SeqlistUpdateByPos(st,17,1001);
SeqlistPrint(st);
printf("位置为:%d\n",SeqlistSearchPos(st,999));
printf("按照位置查找的数据为:%d\n",SeqlistSearchData(st,19));
SeqlistInsert(st,1);
SeqlistInsert(st,2);
SeqlistInsert(st,3);
SeqlistInsert(st,1);
SeqlistInsert(st,3);
SeqlistInsert(st,4);
SeqlistInsert(st,5);
SeqlistPrint(st);
SeqlistDeleteRepeat(st);
SeqlistPrint(st);
seqlist *s1 = SeqlistCreate();
seqlist *s2 = SeqlistCreate();
SeqlistInsert(s1,1);
SeqlistInsert(s1,2);
SeqlistInsert(s1,3);
SeqlistInsert(s1,4);
SeqlistInsert(s1,5);
SeqlistInsert(s2,1);
SeqlistInsert(s2,3);
SeqlistInsert(s2,5);
SeqlistInsert(s2,7);
SeqlistInsert(s2,9);
SeqlistMerge(s1,s2);
SeqlistPrint(s1);
return 0;
}
//顺序表的创建
seqlist *SeqlistCreate()
{
//在堆上申请空间
seqlist *st = (seqlist *)malloc(sizeof(seqlist));
if(NULL == st)
{
return NULL;
}
//初始化,标识当前顺序表中没有元素
st->pos = -1;
//返回顺序表的首地址
return st;
}
//判断顺序表是否为满
int SeqlistIsFull(seqlist *st)
{
#if 0
if(st->pos == N -1)
{
return 1;
}
else
{
return 0;
}
#endif
return st->pos == N -1 ? 1 : 0;
}
//插入数据
void SeqlistInsert(seqlist *st,DataType value)
{
if(SeqlistIsFull(st) == 1)
{
printf("插入失败,顺序表为满!\n");
return;
}
//保存最后一个元素的变量pos自增
st->pos++;
//将数据插入到pos的位置
st->data[st->pos] = value;
printf("插入成功!\n");
return;
}
//遍历顺序表
void SeqlistPrint(seqlist *st)
{
int i;
for(i = 0 ;i <= st->pos;i++)
{
printf("%d ",st->data[i]);
}
putchar(10);
}
//判断顺序表是否为空
int SeqlistIsEmpty(seqlist *st)
{
return st->pos == -1 ? 1 : 0;
}
//删除数据并且返回要删除的数据
DataType SeqlistDelete(seqlist *st)
{
if(SeqlistIsEmpty(st) == 1)
{
printf("删除失败,顺序表为空!\n");
return (DataType)-1;
}
DataType value = st->data[st->pos];
st->pos--;
printf("删除成功!\n");
return value;
}
//按照位置插入数据
void SeqlistInsertByPos(seqlist *st,int p,DataType value)
{
if(SeqlistIsFull(st))
{
printf("插入失败,顺序表为满!\n");
return;
}
if(p < 0 || p > st->pos + 1)
{
printf("插入失败,插入位置有误!\n");
return;
}
int i;
if(p == st->pos + 1)
{
st->data[p] = value;
st->pos++;
}
else
{
for(i = st->pos;i >= p;i--)
{
st->data[i + 1] = st->data[i];
}
//将插入的数据放在P的位置
st->data[p] = value;
st->pos++;
}
printf("按照位置插入数据成功!\n");
return;
}
//按照位置删除数据,返回删除的数据
DataType SeqlistDeleteByPos(seqlist *st,int p)
{
if(SeqlistIsEmpty(st))
{
printf("顺序表为空,按照位置删除失败!\n");
return (DataType)-1;
}
if(p < 0 || p > st->pos)
{
printf("删除失败,输入位置有误!\n");
return (DataType)-1;
}
//将要删除的数据保存在value中
DataType value = st->data[p];
//将p往上的数据向下移动
int i;
for(i = p;i < st->pos;i++)
{
st->data[i] = st->data[i + 1];
}
st->pos--;
printf("按照位置删除数据成功\n");
return value;
}
//按照数据修改数据
void SeqlistUpdateByData(seqlist *st,DataType OldValue,DataType NewValue)
{
int i,flags = 0;
for(i = 0 ; i <= st->pos;i++)
{
if(st->data[i] == OldValue)
{
st->data[i] = NewValue;
flags = 1;
}
}
if(flags == 0)
{
printf("修改数据失败,%d不存在\n",OldValue);
}
}
//按照位置修改数据
void SeqlistUpdateByPos(seqlist *st,int p,DataType value)
{
if(p < 0 || p > st->pos)
{
printf("修改失败,位置有误!\n");
return;
}
st->data[p] = value;
printf("按照位置修改数据成功!\n");
}
//按照数据查找位置
int SeqlistSearchPos(seqlist *st,DataType value)
{
int i;
for(i = 0 ; i <= st->pos;i++)
{
if(st->data[i] == value)
{
printf("按照数据查找位置成功!\n");
return i;
}
}
printf("查找失败,数据%d不存在\n",value);
return -1;
}
//按照位置查找数据
DataType SeqlistSearchData(seqlist *st,int p)
{
if(p < 0 || p > st->pos)
{
printf("按照位置查找数据失败,位置有误!\n");
return (DataType)-1;
}
printf("按照位置查找数据成功!\n");
return st->data[p];
}
//删除重复数据
void SeqlistDeleteRepeat(seqlist *st)
{
int i,j;
for(i = 0 ; i < st->pos;i++)
{
for(j = i + 1;j <= st->pos;j++)
{
if(st->data[i] == st->data[j])
{
//按照位置删除j的数据
SeqlistDeleteByPos(st,j);
//j--目的防止删除位置的数据不作比较
j--;
}
}
}
}
//合并表
void SeqlistMerge(seqlist *s1,seqlist *s2)
{
int i;
for(i = 0 ; i <= s2->pos;i++)
{
if(SeqlistSearchPos(s1,s2->data[i]) == -1)
{
SeqlistInsert(s1,s2->data[i]);
}
}
}