数据结构顺序表的增删改查相关操作及代码
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
enum PASSBALY{SUCCESS,FALSE=-1};
#define MAXSIZE 10
typedef int datatype;
typedef struct{
datatype data[MAXSIZE];
int len;
}Sqlist;
Sqlist *create_list();
int insert_rear(datatype element,Sqlist *list);
void output_sqlist(Sqlist *list);
int delete_rear(Sqlist *list);
int insert_sub(Sqlist *list, datatype element, int sub);
int delete_sub(Sqlist *list, int sub);
int change_sub(Sqlist *list, datatype element, int sub);
int find_sub(Sqlist *list, int sub);
int find_element(Sqlist *list, datatype element);
int delete_element(Sqlist *list, datatype element);
int change_element(Sqlist *list,datatype element,datatype changed );
void remove_duplicates(Sqlist *list);
void bubble_sort(Sqlist *list);
void selection_sort(Sqlist *list);
Sqlist *free_fun(Sqlist *list);
#endif
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
Sqlist *list =create_list();
int n;
datatype element;
printf("please inter n:");
scanf("%d", &n);
for(int i=0; i<n; i++)
{
printf("please input %d element:", i+1);
scanf("%d", &element);
//把element插入到顺序表尾部
insert_rear(element,list);
}
output_sqlist(list);
//尾部删除
delete_rear(list);
output_sqlist(list);
//按照下标插入
int sub;
printf("please enter insert element:");
scanf("%d", &element);
printf("plsase enter insert sub:");
scanf("%d", &sub);
insert_sub(list,element,sub);
output_sqlist(list);
/*
//按下标删除
printf("pleasr enter delete sub:");
scanf("%d", &sub);
delete_sub(list,sub);
output_sqlist(list);
//按下标修改
printf("please enter change element:");
scanf("%d", &element);
printf("please enter change sub:");
scanf("%d", &sub);
change_sub(list,element,sub);
output_sqlist(list);
//按下标查找
printf("please enter find sub:");
scanf("%d", &sub);
find_sub(list, sub);
printf("list->data[%d]=%d\n", sub,list->data[sub]);
*/
//按元素查找
printf("please enter find element:");
scanf("%d", &element);
find_element(list, element);
//printf("element %d is at index %d\n", element, x);
//按元素删除
printf("pelease enter delete element:");
scanf("%d", &element);
delete_element(list,element);
output_sqlist(list);
//按元素修改
printf("please enter change element:");
scanf("%d", &element);
printf("please enter element to be changed:");
scanf("%d", &sub); //该处的sub参数不是下标,是被修改的元素值
change_element(list, element, sub);
output_sqlist(list);
//顺序表去重
remove_duplicates(list);
printf("After removing duplicates:\n");
output_sqlist(list);
//顺序表冒泡排序
bubble_sort(list);
printf("After bubble_sort:");
output_sqlist(list);
//顺序表选择排序
selection_sort(list);
printf("After selection_sort:");
output_sqlist(list);
//释放
list = free_fun(list);
return SUCCESS;
}
test.c
#include "head.h"
Sqlist *create_list()
{
//创建顺序表
Sqlist *list =(Sqlist *) malloc(sizeof(Sqlist));
if(NULL==list)
{
printf("Sqlist create false");
return NULL;
}
//对数据元素清0
memset(list->data,0,sizeof(list->data));
//对顺序表长度清0
list->len = 0;
return list;
}
int insert_rear(datatype element,Sqlist *list)
{
//1.判断顺序表是否创建
//2.判断顺序表是否已满
if(list==NULL || list->len == MAXSIZE)
{
printf("insert_rear error\n");
return FALSE;
}
//3.在尾部插入
list->data[list->len]=element;
list->len++;
return SUCCESS;
}
//循环输出
void output_sqlist(Sqlist *list)
{
//1.顺序表创建失败
//2.顺序表为空
if(list == NULL || list->len == 0)
{
printf("optput error\n");
return;
}
for(int i=0; i<list->len; i++)
{
printf("%d ", list->data[i]);
}
printf("\n");
}
int delete_rear(Sqlist *list)
{
//1.判断顺序表是否创建
//2.判断顺序表是否为空
if(list ==NULL || list->len == 0)
{
printf("delete error\n");
return FALSE;
}
list->data[list->len-1] = 0;
list->len--;
return SUCCESS;
}
int insert_sub(Sqlist *list, datatype element, int sub)
{
//判断顺序表是否创建
//判断顺序表是否已满
//判断下标是否合法
if(list == NULL || list->len==MAXSIZE || sub<0 || sub>list->len)
{
printf("insert_sub error\n");
return FALSE;
}
//循环后移
for(int i=list->len-1; i>=sub; i--)
{
list->data[i+1] = list->data[i];
}
//在下标为sub的位置插入
list->data[sub] = element;
list->len++;
return SUCCESS;
}
int delete_sub(Sqlist *list, int sub)
{
//判断顺序表是否创建
//判断顺序表是否为空
//判断下标是否合法
if(list == NULL || list->len==0 || sub<0 || sub>list->len)
{
printf("delete_sub error\n");
return FALSE;
}
//循环前移
for(int i=sub+1; i<list->len; i++)
{
list->data[i-1] = list->data[i];
}
list->len--;
return SUCCESS;
}
int change_sub(Sqlist *list, datatype element, int sub)
{
//判断顺序表是否创建
//判断顺序表是否为空
//判断下标是否合法
if(list == NULL || list->len == 0 || sub<0 || sub>=list->len)
{
printf("change_sub error\n");
return FALSE;
}
list->data[sub] = element;
return SUCCESS;
}
int find_sub(Sqlist *list, int sub)
{
//判断顺序表是否创建
//判断顺序表是否为空
//判断下标是否合法
if(list == NULL || list->len == 0 || sub<0 || sub>=list->len)
{
printf("find_sub error\n");
return FALSE;
}
return SUCCESS;
}
int find_element(Sqlist *list, datatype element)
{
//判断顺序表是否创建
//判断顺序表是否为空
if(list == NULL || list->len==0)
{
printf("find_element error\n");
return FALSE;
}
//循环顺序表的元素,如果元素存在则返回下标sub,否则返回-1
for(int i=0; i<list->len; i++)
{
if(list->data[i] == element)
{
printf("element %d found at index %d\n", element, i);
return i;
}
}
printf("element %d don't exit\n", element);
return FALSE;
}
int delete_element(Sqlist *list, datatype element)
{
//调用按元素查找的函数
int sub = find_element(list, element);
if(sub == FALSE)
{
printf("delete_element error:element don't exit\n");
return FALSE;
}
//调用按下标删除元素的函数
return delete_sub(list, sub);
}
int change_element(Sqlist *list,datatype element,datatype changed )
{
//调用按元素查找的函数
int sub = find_element(list, changed);
if(sub == -1)
{
// printf("change_element error: element %d don't exit\n", changed);
return FALSE;
}
//调用按下标修改元素的函数
return change_sub(list, element, sub);
}
//去重函数
void remove_duplicates(Sqlist *list)
{
//判断顺序表是否创建
//判断顺序表是否为空
if(list ==NULL || list->len == 0)
{
printf("remove_duplicates error\n");
return;
}
//去重
for(int i=0; i<list->len; i++)
{
for(int j=i+1; j<list->len; j++)
{
if(list->data[i] == list->data[j])
{
delete_sub(list,j);
j--;
}
}
}
}
void bubble_sort(Sqlist *list)
{
//判断顺序表是否创建
//判断顺序表中的元素数量是否小于1
if(list == NULL || list->len <=1)
{
printf("bubble_sort error\n");
return ;
}
//冒泡排序
for(int i=0; i<list->len; i++)
{
for(int j=0; j<list->len-i-1; j++)
{
if(list->data[j]>list->data[j+1])
{
datatype temp = list->data[j];
list->data[j] = list->data[j+1];
list->data[j+1] = temp;
}
}
}
}
void selection_sort(Sqlist *list)
{
if(list == NULL || list->len <= 1)
{
printf("selection_sort error\n");
return;
}
//选择排序
for(int i=0; i<list->len-1; i++)
{
datatype min = i;
for(int j=i+1; j<list->len; j++)
{
if(list->data[min]<list->data[j])
min = j;
}
if(min != i)
{
datatype temp = list->data[min];
list->data[min] = list->data[i];
list->data[i] = temp;
}
}
}
Sqlist *free_fun(Sqlist *list)
{
if(list == NULL)
return NULL;
free(list);
list = NULL;
return list;
}