利用顺序表存储数据,实现数据表的创建,增删改查,利用index下标增删改查,以及顺序表的去重等。
主函数:01_seq_main.c
#include "./03_seq_func.h"
//打印选项并返回选择
int show()
{
printf("-------------------------------------\n");
printf(" <------1. 插入数据------->\n");
printf(" <------2. 删除数据------->\n");
printf(" <------3. 修改数据------->\n");
printf(" <------4. 查询数据------->\n");
printf(" <------5. 下标插入数据--->\n");
printf(" <------6. 下标删除数据--->\n");
printf(" <------7. 下标修改数据--->\n");
printf(" <------8. 下标查询数据--->\n");
printf(" <------9. 显示所有数据--->\n");
printf(" <------10. 去重---------->\n");
printf(" <------11. 退出---------->\n");
printf("请输入>>>");
int choose;
scanf("%d", &choose);
return choose;
}
int main(int argc, const char *argv[])
{
// 创建顺序表
Seq *list = create_seq();
int choose = 0;
int data, new_data, index;
// 测试使用数据
insert_seq(list, 1);
insert_seq(list, 2);
insert_seq(list, 2);
insert_seq(list, 1);
insert_seq(list, 1);
insert_seq(list, 3);
insert_seq(list, 4);
insert_seq(list, 3);
insert_seq(list, 2);
insert_seq(list, 4);
insert_seq(list, 5);
insert_seq(list, 3);
insert_seq(list, 4);
insert_seq(list, 5);
insert_seq(list, 4);
insert_seq(list, 1);
while (1)
{
// 打印选项并返回选择
choose = show();
switch (choose)
{
case 1:
// 插入数据
printf("请输入要插入的数据>>>");
scanf("%d", &data);
insert_seq(list, data);
break;
case 2:
// 删除数据
delete_seq(list);
break;
case 3:
// 修改数据
printf("请输入要修改的旧数据和新数据>>>");
scanf("%d%d", &data, &new_data);
update_seq(list, data, new_data);
break;
case 4:
// 查询数据
printf("请输入要查询的数据>>>");
scanf("%d", &data);
query_seq(list, data);
break;
case 5:
// 下标插入数据
printf("请输入要插入的数据和下标>>>");
scanf("%d%d", &data, &index);
insert_seq_index(list, index, data);
break;
case 6:
// 下标删除数据
printf("请输入要删除的数据的下标>>>");
scanf("%d", &index);
delete_seq_index(list, index);
break;
case 7:
// 下标修改数据
printf("请输入要修改的数据和下标>>>");
scanf("%d%d", &data, &index);
update_seq_index(list, index, data);
break;
case 8:
// 下标查询数据
printf("请输入要查询的下标>>>");
scanf("%d", &index);
query_seq_index(list, index);
break;
case 9:
// 显示所有数据
show_seq(list);
break;
case 10:
// 去重
unique_seq(list);
break;
case 11:
// 退出
free(list);
exit(0);
break;
default:
printf("选项输入错误,请重新输入!\n");
}
}
return 0;
}
功能函数:02_seq_func.c
#include "./03_seq_func.h"
// 创建顺序表
Seq *create_seq()
{
Seq *list = (Seq *)malloc(sizeof(Seq));
memset(list, 0, sizeof(Seq));
return list;
}
// 判断顺序表是否为满,为满返回1,否则返回0
int is_Full(Seq *list)
{
return list->pos >= N ? 1 : 0;
}
// 判断顺序表是否为空,为空返回1,否则返回0
int is_Null(Seq *list)
{
return list->pos <= 0 ? 1 : 0;
}
// 在尾部插入数据,成功返回0,失败返回1
int insert_seq(Seq *list, dataType data)
{
if (list->pos < N)
{
list->data[list->pos] = data;
list->pos++;
printf("%d插入成功!\n", data);
}
else
{
printf("顺序表已满,无法插入%d\n", data);
return -1;
}
return 0;
}
/*
函数功能:根据index下标插入数据
函数参数:Seq *list顺序表 int index插入位置 dataType data插入内容
函数返回值:int 成功返回0,失败返回1
*/
int insert_seq_index(Seq *list, int index, dataType data)
{
// 判断index位置是否有效
if (index < 0 || index > list->pos)
{
printf("%d位置无法插入!\n", index);
return -1;
}
// 判断顺序表是否为满
if (is_Full(list))
{
printf("顺序表已满,无法插入%d\n", data);
return -1;
}
int i;
for (i = list->pos; i > index; i--)
{
list->data[i] = list->data[i - 1];
}
list->data[index] = data;
list->pos++;
printf("%d插入成功!\n", data);
return 0;
}
// 删除尾部数据,成功返回0,失败返回-1
int delete_seq(Seq *list)
{
// 判断顺序表是否为空
if (is_Null(list))
{
printf("顺序表为空,删除失败!\n");
return -1;
}
list->pos--;
printf("%d删除成功!\n", list->data[list->pos]);
return 0;
}
/*
函数功能:根据index下标删除数据
函数参数:Seq *list顺序表 int index删除位置的下标
函数返回值:int 成功返回0,失败返回1
*/
int delete_seq_index(Seq *list, int index)
{
// 判断index位置是否有效
if (index < 0 || index >= list->pos)
{
printf("无法删除下标%d!\n", index);
return -1;
}
// 判断顺序表是否为空
if (is_Null(list))
{
printf("顺序表为空,无法删除下标%d\n", index);
return -1;
}
int i;
for (i = index; i < list->pos - 1; i++)
{
list->data[i] = list->data[i + 1];
}
list->pos--;
printf("下标%d删除成功!\n", index);
return 0;
}
// 修改数据,将旧数据改为新数据,成功返回0,失败返回-1
int update_seq(Seq *list, dataType old_data, dataType new_data)
{
// query_seq(list,data);可替换下列代码
if (is_Null(list))
{
printf("顺序表为空,修改失败!\n");
return -1;
}
int i, flag = -1;
for (i = 0; i < list->pos; i++)
{
if (list->data[i] == old_data)
{
list->data[i] = new_data;
flag = 0;
}
}
if (flag == 0)
{
printf("成功修改%d为%d\n", old_data, new_data);
return 0;
}
else
{
printf("顺序表中不存在%d,无法修改\n", old_data);
return -1;
}
}
// 根据index下标修改数据,成功返回0,失败返回-1
int update_seq_index(Seq *list, int index, dataType data)
{
if (index < 0 || index >= list->pos)
{
printf("index=%d下标不合法,无法修改\n", index);
return -1;
}
list->data[index] = data;
printf("index = %d,修改成功\n", index);
}
// 查询数据,成功返回查询数据的下标,失败返回-1
int query_seq(Seq *list, dataType data)
{
int i, flag = 0, p;
if (is_Null(list))
{
printf("顺序表为空,%d查询失败!\n", data);
return -1;
}
for (i = 0; i < list->pos; i++)
{
if (data == list->data[i])
{
printf("找到%d,下标为:%d\n", data, i);
p = i;
flag = 1;
}
}
if (flag)
{
return p;
}
else
{
printf("顺序表中没有%d\n", data);
return -1;
}
}
// 根据下标查询数据,成功返回该数据,失败返回-1
dataType query_seq_index(Seq *list, int index)
{
int i;
if (is_Null(list))
{
printf("顺序表为空,下标%d查询失败!\n", index);
return -1;
}
for (i = 0; i < list->pos; i++)
{
if (list->data[index] == list->data[i])
{
printf("找到%d,下标为:%d\n", list->data[index], i);
return i;
}
}
}
// 显示所有数据
void show_seq(Seq *list)
{
int i;
printf("\ndata:\n");
for (i = 0; i < list->pos; i++)
{
printf("%d\n", list->data[i]);
}
}
// 顺序表去重
int unique_seq(Seq *list)
{
int i, j;
if (is_Null(list))
{
printf("顺序表为空,无法去重!\n");
return -1;
}
for (i = 0; i < list->pos; i++)
{
for (j = i + 1; j < list->pos; j++)
{
if (list->data[i] == list->data[j])
{
delete_seq_index(list, j);
j--;
}
}
}
printf("顺序表去重成功!\n");
return 0;
}
头文件:03_seq_func.h
#ifndef __SEQ_FUNC__
#define __SEQ_FUNC__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 16 //顺序表的大小
typedef int dataType;
typedef struct
{
dataType data[N];
int pos;
} Seq;
// 创建顺序表
Seq *create_seq();
// 在尾部插入数据,成功返回0,失败返回1
int insert_seq(Seq *list, dataType data);
/*
函数功能:根据index下标插入数据
函数参数:Seq *list顺序表 int index插入位置 dataType data插入内容
函数返回值:int 成功返回0,失败返回1
*/
int insert_seq_index(Seq *list, int index, dataType data);
// 删除尾部数据,成功返回0,失败返回-1
int delete_seq(Seq *list);
/*
函数功能:根据index下标删除数据
函数参数:Seq *list顺序表 int index删除位置的下标
函数返回值:int 成功返回0,失败返回1
*/
int delete_seq_index(Seq *list, int index);
// 修改数据,将旧数据改为新数据,成功返回0,失败返回-1
int update_seq(Seq *list, dataType data, dataType new_data);
// 根据index下标修改数据,成功返回0,失败返回-1
int update_seq_index(Seq *list, int index, dataType data);
// 查询数据,成功返回查询数据的下标,失败返回-1
int query_seq(Seq *list, dataType data);
// 根据下标查询数据,成功返回该数据,失败返回-1
dataType query_seq_index(Seq *list, int index);
// 显示所有数据
void show_seq(Seq *list);
// 顺序表去重
int unique_seq(Seq *list);
#endif
Makefile:
Makefile
-include ./makefile.cfg
$(Target):$(Obj)
$(CC) $^ -o $@
%.o:%.c
@$(CC) $< $(CAN) $@
.PHONY:clean
clean:
rm $(Obj) $(Target)
makefile.cfg
Target:=a.out
Obj:=01_seq_main.o 02_seq_func.o
CC:=gcc
CAN:=-c -o