1、逻辑结构:①具有线性结构,有表头(没有前驱)、有表尾(没有后继)。②有且只有一个直接前驱和一个直接后继。
2、操作规则:任意位置插入和删除数据。
1、顺序表和线性表的关系:顺序表是线性表的顺序存储结构。
last:
①非空:表示最后一块数据的下标。
②空:last = -1
1、构造存储结构
#define SIZE 8
typedef int datatype;
typedef struct seqlist{
datatype data[SIZE];
int last;
}seq_list, *seq_plist;
2、初始化
初始化要完成的工作:①申请一块空间。②设置last = -1。
/* 初始化 */
void init_seqlist(seq_plist *list)
{
*list = (seq_plist)malloc(sizeof(seq_list)); /* 申请内存空间 */
if (NULL == *list)
{
printf("申请内存失败\n");
perror("malloc"); /* 打印申请内存失败的原因*/
exit(1); /* 让当前程序结束 */
}
(*list)->last = -1;
}
3、插入数据
①确定插入的位置
②移动旧的数据
③插入新的数据
④last++;
(1)、如下图所示,在位置3后面插入一个新的数据,插入前last = 5。
(2)、如下图所示,插入新数据后,last = 6。
/* 插入数据
list:顺序表
i:新数据插入的位置
data:插入的新数据
*/
void insert_seqlist(seq_plist list, int i, datatype data)
{
int j = 0;
/* 从位置i开始将顺序表的数据往后移动 */
for (j = list->last; j >= i; j--)
{
list->data[j+1] = list->data[j];
}
list->data[i] = data; /* 将data插入到i的位置 */
list->last++; /* 因为last表示最后一个数据的下标,因此需要将last加1*/
}
4、删除数据
①确定要删除数据的位置。
②移动数据
③last–
如下图所示,删除数据前last为5。
如下图所示,删除数据后last为4。
/* 删除数据
list:顺序表
i:删除数据的位置
*/
void delete_seqlist(seq_plist list, int i)
{
int j = 0;
/* 将位置i后面的数据全部往前面移动一个位置 */
for (j = i; j < list->last; j++)
{
list->data[j] = list->data[j+1];
}
list->last--; /* 因为last表示最后一个数据的下标,因此需要让last减去1 */
}
5、判断顺序表是否为空
判断数据是否为空,只需判断last是否为-1。
/* 判断顺序表是否为空
list:顺序表
*/
void isempty_seqlist(seq_plist list)
{
if (-1 == list->last)
{
return true;
}
else
{
return false;
}
}
6、判断顺序表是否已经满
判断顺序表是否已经满,只需判断last是否为SIZE - 1。
/* 判断顺序表是否已满
list:顺序表
*/
bool isfull_seqlist(seq_plist list)
{
if ((SIZE - 1) == list->last)
{
return true;
}
else
{
return false;
}
}
用顺序表存储一些整数,要求如下:
①输入正整数表示插入数据(比如输入3表示插入3)。
②输入负数表示删除数据(比如输入-2表示删除2)。
③输入字符表示退出程序。
④插入和删除数据的过程中保持该顺序表数据有序递增。
1、将数据插入顺序表,且保持数据有序递增
/* 将数据插入顺序表,且保持有序递增
list:顺序表
idata:要插入的数据
*/
void insert_data(seq_plist list, datatype idata)
{
int i = 0;
if(isfull_seqlist(list))
{
printf("顺序表已满!\n");
return;
}
/* 然顺序表有序递增插入 */
for(i = 0; i <= list->last; i++)
{
if(idata < list->data[i])
{
break;
}
}
insert_seqlist(list, i, idata);
}
2、将数据从顺序表删除,且保持数据有序递
/* 将数据从顺序表删除,且保持有序递增
list:顺序表
ddata:要删除的数据
*/
void delelet_data(seq_plist list, datatype ddata)
{
int i = 0;
if(isempty_seqlist(list))
{
printf("顺序表为空!\n");
return ;
}
for(i = 0; i <= list->last; i++)
{
if(ddata == list->data[i])
{
break;
}
}
if(i > list->last)
{
printf("%d 不在顺序表中!\n", ddata);
return ;
}
delete_seqlist(list, i);
}
3、遍历打印顺序表
/* 遍历打印顺序表
list:顺序表
*/
void show_seqlist(seq_plist list)
{
int i = 0;
for (i = 0; i <= list->last; i++)
{
printf("%d\t", list->data[i]);
}
}
4、主函数
int main(void)
{
seq_plist list;
datatype data;
int ret = 0;
init_seqlist(&list); /* 初始化顺序表 */
while(1)
{
printf("请输入一个除0之外的整数:");
ret = scanf("%d", &data); /* 输入int型返回1,否则返回0 */
if(ret == 0) /* 输入为字符,退出while循环,程序结束 */
{
printf("Bye-bye!\n");
break;
}
else
{
if(data > 0) /* 输入为正整数,插入数据并打印新的顺序表 */
{
insert_data(list, data);
show_seqlist(list);
}
else if(data < 0) /* 输入为负整数,删除数据并打印新的顺序表 */
{
delelet_data(list, -data);
show_seqlist(list);
}
else
{
/* code */
}
}
}
return 0;
}
5、实验结果
(1)、输入正整数时,增加数据且数据有序递增:
(2)、当超过8个数据时会提示顺序表已满:
(3)、输入负整数时,删除数据,且数据有序递增:
(4)、如果删除数据不在顺序表中,则提示该数据不在顺序表中:
https://github.com/sanjaywu/DataStructure