顺序表的创建,数据元素的增删改查。
代码
head1.h
//多文件编译,创建顺序表的头文件
#ifndef __HEAD_H__//防止头文件被多次包含
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE 8
typedef int datatype;
//定义顺序表
typedef struct
{
int len;//顺序表长度
datatype data[MAXSIZE];//数据元素
}Seqlist;
Seqlist *create_list();
int insert_rear(datatype e, Seqlist *list);
int full_list(Seqlist *list);
void output(Seqlist *list);
int delete_rear(Seqlist *list);
datatype search_by_sub(int sub, Seqlist *list);
int update_by_sub(Seqlist *list, int sub, datatype e);
int insert_by_sub(Seqlist *list, int sub, datatype e);
int delete_by_sub(Seqlist *list, int sub);
int search_by_data(datatype key, Seqlist *list);
int delete_by_data(datatype key, Seqlist *list);
int update_by_data(datatype key, Seqlist *list, datatype e);
int insert_by_data(datatype key, Seqlist *list, datatype e);
#endif
test1.c
//多文件编译,创建顺序表的其他函数文件
#include "head1.h"
/*
* function: 申请顺序表空间
* @param [ in]
* @param [out]
* @return 返回地址
*/
Seqlist *create_list()
{
Seqlist *list = (Seqlist *)malloc(sizeof(Seqlist));
if(NULL == list)
return NULL;
list -> len = 0;//顺序表长度清零
memset(list -> data, 0, sizeof(list -> data));//memset(list -> data, 0, sizeof(datatype)*MAXSIZE);
return list;
}
/*
* function: 判断顺序表是否为满
* @param [ in]
* @param [out]
* @return 不满返回0,满返回-1
*/
int full_list(Seqlist *list)
{
return list -> len == MAXSIZE ? -1 : 0;
}
/*
* function: 判断顺序表是否为空
* @param [ in]
* @param [out]
* @return 不空返回0,空返回-1
*/
int empty(Seqlist *list)
{
return list -> len == 0 ? -1 : 0;
}
/*
* function: 尾插,插入一个
* @param [ in]
* @param [out]
* @return 成功返回0,失败返回-1
*/
int insert_rear(datatype e, Seqlist *list)
{
//判断顺序表是否合法
//判断顺序表是否为满
if(NULL == list || list -> len == MAXSIZE)
{
printf("insert rear fail\n");
return -1;
}
list -> data[list -> len] = e;
list -> len++;
return 0;
}
/*
* function: 输出
* @param [ in]
* @param [out]
* @return 成功返回0,失败返回-1
*/
void output(Seqlist *list)
{
//判断顺序表是否合法
//判断顺序表是否为空
if(NULL == list || empty(list) == -1)
{
puts("output error");
}
for(int i = 0; i < list -> len; i++)
{
printf("%d ", list -> data[i]);
}
puts("");
}
/*
* function: 尾部删除
* @param [ in]
* @param [out]
* @return 成功返回0,失败返回-1
*/
int delete_rear(Seqlist *list)
{
//判断顺序表是否合法
//判断顺序表是否为空
if(NULL == list || empty(list) == -1)
{
puts("delete rear error");
return -1;
}
printf("删除的元素是:%d\n", list -> data[list -> len - 1]);
list -> len--;
return 0;
}
/*
* function: 按下标查找
* @param [ in]
* @param [out]
* @return 成功返回值,失败结束程序
*/
datatype search_by_sub(int sub, Seqlist *list)
{
//判断顺序表是否合法
//判断顺序表是否为空
//判断下标是否合法
if(NULL == list || empty(list) == -1 || sub < 0 || sub >= list -> len)
{
puts("search element error");
exit(1);
}
return list -> data[sub];
}
/*
* function: 按下标修改
* @param [ in]
* @param [out]
* @return 成功返回0,失败返回-1
*/
int update_by_sub(Seqlist *list, int sub, datatype e)
{
//判断顺序表是否合法
//判断顺序表是否为空
//判断下标是否合法
if(NULL == list || empty(list) == -1 || sub < 0 || sub >= list -> len)
{
puts("update element error");
return -1;
}
list -> data[sub] = e;
return 0;
}
/*
* function: 按下标插入
* @param [ in]
* @param [out]
* @return 成功返回0,失败返回-1
*/
int insert_by_sub(Seqlist *list, int sub, datatype e)
{
//判断顺序表是否合法
//判断顺序表是否为满
//判断下标是否合法
if(NULL == list || full_list(list) == -1 || sub < 0 || sub > list -> len)
{
puts("insert element error");
return -1;
}
for(int i = list -> len - 1; i >= sub; i--)
{
list -> data[i + 1] = list -> data[i];
}
list -> data[sub] = e;
list -> len++;
return 0;
}
/*
* function: 按下表删除
* @param [ in]
* @param [out]
* @return 成功返回0,失败返回-1
*/
int delete_by_sub(Seqlist *list, int sub)
{
//判断顺序表是否合法
//判断顺序表是否为空
//判断下标是否合法
if(NULL == list || empty(list) == -1 || sub < 0 || sub > list -> len)
{
puts("delete element error");
return -1;
}
printf("删除的元素是:%d\n", list -> data[sub]);
for(int i = sub; i < list -> len - 1; i++)
{
list -> data[i] = list -> data[i + 1];
}
//list -> data[sub] = ;
list -> len--;
return 0;
}
/*
* function: 按元素查找
* @param [ in]
* @param [out]
* @return 成功返回下标,失败返回-1
*/
int search_by_data(datatype key, Seqlist *list)
{
if(NULL == list || empty(list))
{
return -1;
}
for(int i = 0; i < list -> len; i++)
{
if(key == list -> data[i])
{
return i;
}
}
return -1;
}
/*
* function: 按元素删除
* @param [ in]
* @param [out]
* @return 成功返回0,失败返回-1
*/
int delete_by_data(datatype key, Seqlist *list)
{
int sub = search_by_data(key, list);
if (sub == -1)
{
printf("delete element error\n");
return -1;
}
else
{
return delete_by_sub(list, sub);
}
}
/*
* function: 按元素修改
* @param [ in]
* @param [out]
* @return 成功返回0,失败返回-1
*/
int update_by_data(datatype key, Seqlist *list, datatype e)
{
int sub = search_by_data(key, list);
if (sub == -1)
{
printf("update element error\n");
return -1;
}
else
{
return update_by_sub(list, sub, e);
}
}
/*
* function: 按元素插入
* @param [ in]
* @param [out]
* @return 成功返回0,失败返回-1
*/
int insert_by_data(datatype key, Seqlist *list, datatype e)
{
int sub = search_by_data(key, list);
if(sub == -1)
{
printf("not found key\n");
return -1;
}
else
{
return insert_by_sub(list, sub, e);
}
}
main1.c
//多文件编译,创建顺序表的主函数文件
#include "head1.h"
int main(int argc, const char *argv[])
{
Seqlist *list = create_list();
int n;
printf("please enter n:");
scanf("%d", &n);
datatype e;//表示插入的值
for (int i = 0; i < n; i++)
{
//if(insert_rear(e, list) == -1)
//break;
printf("please enter rear element:");
scanf("%d", &e);
if(NULL == list || full_list(list) == -1)
break;
insert_rear(e, list);
}
printf("%ld\n", sizeof(list -> data));
output(list);
delete_rear(list);
output(list);
int sub;
printf("please search sub:");
scanf("%d", &sub);
e = search_by_sub(sub, list);
printf("search element is: %d\n", e);
printf("please enter sub:");
scanf("%d", &sub);
printf("please enter update element:");
scanf("%d", &e);
update_by_sub(list, sub, e);
output(list);
printf("please enter sub:");
scanf("%d", &sub);
printf("please enter insert element:");
scanf("%d", &e);
insert_by_sub(list, sub, e);
output(list);
printf("please enter sub:");
scanf("%d", &sub);
//printf("please enter insert element:");
//scanf("%d", &e);
printf("delet sub_element:");
delete_by_sub(list, sub);
output(list);
datatype key;
printf("please enter search key:");
scanf("%d", &key);
sub = search_by_data(key, list);
if(sub == -1)
{
printf("not found key\n");
}
else
{
printf("found the key, sub is %d\n", sub);
}
printf("please enter search key:");
scanf("%d", &key);
printf("please enter update element:");
scanf("%d", &e);
update_by_data(key, list, e);
output(list);
printf("please enter search key:");
scanf("%d", &key);
printf("please enter insert element:");
scanf("%d", &e);
insert_by_data(key, list, e);
output(list);
printf("please enter search key:");
scanf("%d", &key);
delete_by_data(key, list);
output(list);
return 0;
}
结果
ubuntu@ubuntu:day3$ gcc main1.c test1.c && ./a.out
please enter n:4
please enter rear element:11
please enter rear element:22
please enter rear element:33
please enter rear element:44
32
11 22 33 44
删除的元素是:44
11 22 33
please search sub:1
search element is: 22
please enter sub:1
please enter update element:44
11 44 33
please enter sub:1
please enter insert element:22
11 22 44 33
please enter sub:1
delet sub_element:删除的元素是:22
11 44 33
please enter search key:33
found the key, sub is 2
please enter search key:33
please enter update element:44
11 44 44
please enter search key:44
please enter insert element:33
11 33 44 44
please enter search key:33
删除的元素是:33
11 44 44
思维导图