1>顺序表按元素删除
思路:参数[顺序表删除的值key]1.根据删除的元素得到下标
2.根据下标实现[按下标删除]
2>顺序表排序[类似数组排序]
比较: if( list->data[] > list->datal[+1])
main.c
#include"head.h"
int main (int argc, const char *argv[])
{
seqlist *list=create();
//循环在尾部插入;
int n;
datatype e;
printf("请输入数据元素个数");
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("请输入你要输入的值");
scanf("%d",&e);
insert_rear(list,e);
}
output(list);
//删除
delete_rear(list);
delete_rear(list);
output(list);
//查找
int sub;
printf("请输入你要查找的下标");
scanf("%d",&sub);
search_sub(list,sub);
//修改
printf("请输入你要修改的下标");
scanf("%d",&sub);
printf("请输入你要修改的元素");
scanf("%d",&e);
charge(list,sub,e);
output(list);
//插入
printf("请输入你要插入的下标");
scanf("%d",&sub);
printf("请输入你要插入的元素");
scanf("%d",&e);
inser_sub(list,sub,e);
output(list);
//删除
printf("请输入你要删除的下标");
scanf("%d",&sub);
delete_sub(list,sub);
output(list);
//按元素查找
datatype key;
printf("请输入你要查找元素");
scanf("%d",&key);
int flag= find(list,key);
if(flag==-1)
printf("查找失败\n");
else
printf("在下表%d出现\n",flag);
//按元素修改
printf("请输入被修改的值:");
scanf("%d",&key);
printf("请输入要修改的值:");
scanf("%d",&e);
update_data(list,key,e);
output(list);
//按元素删除
printf("请输入要删除的元素:");
scanf("%d",&key);
delete_key(list,key);
output(list);
//顺序表排序
sort_seqlist(list);
printf("排序后:");
output(list);
list=free_space(list);
return 0;
}
text.c
#include"head.h"
/*
* function: 在堆区申请顺序表
* @param [ in] 申请一共顺序表的空间
* @param [out] 成功返回地址,失败返回NULL
* @return
*/
seqlist *create(){
seqlist *list=(seqlist *)malloc(sizeof(seqlist));
if(list ==NULL)
return NULL;
list->len=0; //把顺序表清空
return list;
}
/*
* function: 判断顺序表满的函数
* @param [ in] 顺序表
* @param [out]
* @return 成功返回0 失败返回-1
*/
int full_seqlist(seqlist *list){
return list->len==MAXSIZE?-1:0;
}
/*
* function: 在尾部插入
* @param [ in] 顺序表 插入的值 e
* @param [out]
* @return 成功返回0 失败返回-1
*/
int insert_rear(seqlist *list,datatype e)
{
if(full_seqlist(list))//if(full_seqlist(list)==1)
{
printf("顺序表已满\n");
return -1;
}
//判断顺序表是否为满
list->data[list->len]=e;
list->len++;
return 0;
}
/*
* function: 循环输出
* @param [ in] 顺序表
* @param [out]
* @return 无返回
*/
void output(seqlist *list){
puts("");
for(int i=0;i<list->len;i++){
printf("%d\t",list->data[i]);
}
puts("");
}
/*
* function: 判断顺序表是否为空
* @param [ in] 顺序表
* @param [out]
* @return 成功返回0 失败返回-1
*/
int empty_seqlist(seqlist *list){
return list->len==0?-1:0;
}
/*
* function: 顺序表尾删
* @param [ in] 顺序表
* @param [out]
* @return 成功返回0失败返回-1
*/
int delete_rear(seqlist *list)
{
if(empty_seqlist(list))
{
printf("顺序表为空\n");
return -1;
}
//尾删
list->len--;
return 0;
}
/*
* function: 按下标查找
* @param [ in] 顺序表 查找下标
* @param [out]
* @return 成功返回0 失败返回-1
*/
int search_sub(seqlist *list,int sub){
//判断顺序表是否为空
//判断下标是否合法
if(empty_seqlist(list)||sub<0||sub>=list->len){
printf("顺序表查找失败\n");
return -1;
}
//查找输出
printf("查找的元素是%d\n",list->data[sub]);
return 0;
}
/*
* function: 下标修改
* @param [ in] 顺序表 修改下标
* @param [out]
* @return 成功返回0失败返回-1
*/
int charge(seqlist *list,int sub,datatype e){
if(empty_seqlist(list)||sub<0||sub>=list->len){
printf("修改失败\n");
return -1;
}
// 修改重新赋值
list->data[sub]=e;
}
/*
* function: 按下标插入
* @param [ in] 顺序表 插入第下表 插入的值
* @param [out]
* @return 成功返回0失败返回-1
*/
int inser_sub(seqlist *list,int sub,datatype e){
//判断顺序表是否为满
//判断下标是否合法
if(empty_seqlist(list)||sub<0||sub>list->len){
printf("插入失败\n");
return -1;
}
//插入
for(int i=list->len-1;i>=sub;i--){
list->data[i+1]=list->data[i];
}
list->data[sub]=e;
list->len++;
}
//删除
int delete_sub(seqlist *list,int sub){
//判断顺序表是否为满
//判断下标是否合法
if(empty_seqlist(list)||sub<0||sub>=list->len){
printf("删除失败\n");
return -1;
}
for(int i=sub+1;i<list->len;i++){
list->data[i-1]=list->data[i];
}
list->len--;
}
/*
* function: 查找元素
* @param [ in] 顺序表 查找的元素
* @param [out]
* @return 成功返回下标失败返回-1
*/
int find(seqlist *list,datatype key)
{
for(int i=0;i<list->len;i++)
{
if(list->data[i]==key)
{
return i;
}
}
return -1;
}
/*
* function: 按元素修改
* @param [ in] 顺序表 被修改的值 要修改的值
* @param [out]
* @return 成功返回0失败返回-1
*/
int update_data(seqlist *list,datatype key,datatype e)
{
//1,查找key的下表
int sub=find(list,key);//sub表示key的下表
if(sub==-1)
{
printf("修改失败\n");
return -1;
}
//2,调用按下表修改
charge(list,sub,e);
return 0;
}
/*
* function: 按元素删除
* @param [ in] 顺序表 要删的值
* @param [out]
* @return 成功返回0失败返回-1
*/
int delete_key(seqlist *list,datatype key){
int sub=find(list,key);
if(sub==-1)
{
printf("删除失败\n");
return -1;
}
//2,调用按下表删除
delete_sub(list,sub);
return 0;
}
/*
* function: 顺序表排序
* @param [ in] 顺序表
* @param [out]
* @return 成功返回0 失败返回-1
*/
int sort_seqlist(seqlist *list){
if(empty_seqlist(list)||list->len<2){
printf("不需要排序\n");
return -1;
}
for(int i=1;i<list->len;i++){
int count=0;
for(int j=0;j<list->len-i;j++){
if(list->data[j]>list->data[j+1]){
int temp;
temp=list->data[j];
list->data[j]=list->data[j+1];
list->data[j+1]=temp;
count++;
}
}
if(count==0)
break;
}
return 0;
}
/*
* function: 释放
* @param [ in]
* @param [out]
* @return
*/
seqlist *free_space( seqlist *list){
if(list==NULL)
return NULL;
free(list);
list=NULL;
return list;
}
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#define MAXSIZE 7//线性表长度
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int datatype;//把int起别名叫datatype
//定义顺序表
typedef struct{
datatype data[MAXSIZE];//数据元素
int len;//顺序长度
}seqlist;
int full_seqlist(seqlist *list);
int insert_rear(seqlist *list,datatype e);
seqlist *create();
void output(seqlist *list);
int empty_seqlist(seqlist *list);
int delete_rear(seqlist *list);
int search_sub(seqlist *list,int sub);
int charge(seqlist *list,int sub,datatype e);
int inser_sub(seqlist *list,int sub,datatype e);
int delete_sub(seqlist *list,int sub);
int find(seqlist *list,datatype key);
int update_data(seqlist *list,datatype key,datatype e);
int delete_key(seqlist *list,datatype key);
int sort_seqlist(seqlist *list);
seqlist *free_space( seqlist *list);
#endif
ubuntu@u