作业:
1> 顺序表按元素删除
思路:参数【顺序表 删除的值key】
1.根据删除的元素得到下标
2.根据下标实现【按下标删除】
2>顺序表排序【类似数组排序】
比较:if( list->data[j] > list->data[j+1])
程序如下:
main.c
#include "main.h"
int main(int argc, char const *argv[])
{
int n;
printf("\n<-------------------顺序表数据输入------------------->\n");
printf("请输入数据元素个数:");
scanf("%d",&n);
Seqlist *list = Create();
datatype e;
//尾部插入元素
for (size_t i = 0; i < n; i++)
{
printf("请输入第%ld个值:",i+1);
scanf("%d",&e);
insert_rear(list,e);
}
//遍历元素
printf("\n<-------------------顺序表数据遍历------------------->\n\n");
Output_Seqlist(list);
printf("\n<-------------------顺序表数据排序------------------->\n\n");
//冒泡排序
BubbleSort(list);
Output_Seqlist(list);
//指定元素删除
printf("\n<-------------------顺序表数据删除------------------->\n\n");
printf("请输入要删除的元素:");
scanf("%d",&e);
DeleteBydata(list,e);
Output_Seqlist(list);
printf("\n\n");
printf("请输入要删除的元素:");
scanf("%d",&e);
DeleteBydata(list,e);
Output_Seqlist(list);
printf("\n<-------------------顺序表DAY12完成------------------->\n");
return 0;
}
main.h
#ifndef __MAIN_H
#define __MAIN_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 10
typedef int datatype;
typedef struct
{
datatype data[MAXSIZE];
int len;
}Seqlist;
Seqlist *Create(); //为顺序表在堆区申请空间
int Full_Seqlist(Seqlist *list); //判断顺序表是否为满
int Empty_Seqlist(Seqlist *list); //判断顺序表是否为空
int insert_rear(Seqlist *list,datatype e); //顺序表尾部插入元素
void Output_Seqlist(Seqlist *list); //遍历顺序表元素
void BubbleSort(Seqlist *list); //冒泡排序
int Searchbydata(Seqlist *list,datatype key); //按给定元素查找顺序表
int DeleteBysub(Seqlist *list,int sub); //按照下标删除
int DeleteBydata(Seqlist *list,datatype e); //按照元素删除
#endif // !__MAIN_H
Seqlist.c
#include "main.h"
/**
* @brief 为顺序表在堆区申请空间
*
* @return Seqlist* 成功返回堆区首地址,失败返回NULL
*/
Seqlist *Create()
{
Seqlist *list = (Seqlist *)malloc(sizeof(Seqlist));
if (list == NULL)
return NULL;
list->len = 0;
return list;
}
/**
* @brief 判断顺序表是否为满
*
* @param list 顺序表首地址
* @return int 成功(满)返回-1,失败(不满)返回0
*/
int Full_Seqlist(Seqlist *list)
{
if (list->len == MAXSIZE)
return -1;
return 0;
}
/**
* @brief 判断顺序表是否为空
*
* @param list 顺序表首地址
* @return int 成功(满)返回-1,失败(不满)返回0
*/
int Empty_Seqlist(Seqlist *list)
{
if (list->len == 0)
return -1;
return 0;
}
/**
* @brief 顺序表尾部插入元素
*
* @param list 顺序表首地址
* @param e 插入的数据元素
* @return int 成功返回0,失败返回-1
*/
int insert_rear(Seqlist *list,datatype e)
{
if (Full_Seqlist(list))
{
printf("顺序表已满,插入失败!\n");
return -1;
}
list->data[list->len++] = e;
return 0;
}
/**
* @brief 遍历顺序表元素
*
* @param list 顺序表首地址
*/
void Output_Seqlist(Seqlist *list)
{
for (size_t i = 0; i < list->len; i++)
{
printf("%d\t",list->data[i]);
}
printf("\n");
}
/**
* @brief 冒泡排序
*
* @param list
*/
void BubbleSort(Seqlist *list)
{
for (size_t i = 1; i < list->len; i++)
{
int flag = 0;
for (size_t j = 0; j < list->len-i; 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;
flag = 1;
}
}
if (flag == 0)
break;
}
}
/**
* @brief 按给定元素查找顺序表
*
* @param list 顺序表首地址
* @param key 查找的元素值
* @return int 成功返回元素下标,失败返回-1
*/
int Searchbydata(Seqlist *list,datatype key)
{
for (size_t i = 0; i < list->len; i++)
{
if (list->data[i] == key)
{
return i;
}
}
return -1;
}
/**
* @brief 按照下标删除
*
* @param list 顺序表首地址
* @param sub 删除元素的下标
* @return int 成功返回0,失败返回-1
*/
int DeleteBysub(Seqlist *list,int sub)
{
if (Empty_Seqlist(list) || sub < 0 || sub >= list->len)
{
return -1;
}
for (size_t i = sub+1; i < list->len; i++)
{
list->data[i-1] = list->data[i];
}
list->len--;
return 0;
}
/**
* @brief 按照元素删除
*
* @param list 顺序表首地址
* @param e 要删除的元素
* @return int 成功返回0,失败返回-1
*/
int DeleteBydata(Seqlist *list,datatype e)
{
int sub = Searchbydata(list,e);
if (sub == -1)
{
printf("该元素不存在,删除失败!!!\n");
return -1;
}
DeleteBysub(list,sub);
return 0;
}
运行效果如下所示: