作业一、顺序表按元素删除
思路:参数【顺序表 删除的值key】
1.根据删除的元素得到下标
2.根据下标实现【按下标删除】
//头文件
//宏定义
#ifndef __HEAD_H__
#define __HEAD_H__
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 7 //表示线性表长度
typedef int datatype;//把int起别名为datatype
//定义顺序表:数据元素、顺序表长度
typedef struct
{
//数据元素
datatype data[MAXSIZE];
//顺序表长度
int len;
}seqlist;
seqlist *create();
int full_seqlist(seqlist *list);
int insert_rear(seqlist *list,datatype e);
void output(seqlist *list);
int empty_seqlist(seqlist *list);
int delete_rear(seqlist *list);
int search_sub(seqlist *list,int sub);
int update_sub(seqlist *list,int sub,datatype e;);
int insert_sub(seqlist *list,int sub,datatype e);
int delete_sub(seqlist *list,int sub);
int search_data(seqlist *list,int key);
int update_data(seqlist *list ,datatype key,datatype e);
int delete_data(seqlist *list,int key);
#endif
//主函数
#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);
update_sub(list,sub,e);
output(list);
//插入
printf("请输入要插入的下表:");
scanf("%d",&sub);
printf("请插入要修改的值");
scanf("%d",&e);
insert_sub(list,sub,e);
output(list);
//删除
printf("请输入要删除的下表:");
scanf("%d",&sub);
delete_sub(list ,sub);
output(list);
//查找元素
datatype key;
printf("请输入你要查找的元素:");
scanf("%d",&key);
int flag=search_data(list, key);
if(flag==-1)
printf("查找失败\n");
else
printf("查找在%d个元素",flag);
//按元素修改
printf("请输入被修改的值:");
scanf("%d",&key);
printf("请输入要修改的值");
scanf("%d",&e);
update_data(list,key,e);
output(list);
//删除元素
printf("请输入要删除的元素:");
scanf("%d",&key);
delete_data(list ,key);
output(list);
return 0;
}
//自定义函数
#include "head.h"
/*
* function: 在堆区申请顺序表
* @param [ in] 申请一个顺序表的空间
* @param [out]
* @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 update_sub(seqlist *list,int sub,datatype e)
{
//判断顺序表是否为空
//判断下标是否合法
if(empty_seqlist(list)||sub<0||sub>=list->len)
{
printf("修改失败\n");
return -1;
}
//修改:重新赋值
list->data[sub]=e;
return 0;
}
/*
* function: 按下表插入
* @param [ in] 顺序表 插入的下表 插入的值
* @param [out]
* @return 成功返回0 失败返回-1
*/
int insert_sub(seqlist *list,int sub,datatype e)
{
//判断顺序表是否为满
//判断下表是否合法
if(full_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];//后移
}
//在sub插入e
list->data[sub]=e;
list->len++;
return 0;
}
/*
* function: 按下表删除
* @param [ in] 顺序表 删除的下表
* @param [out]
* @return 成功返回0 失败返回-1
*/
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 search_data(seqlist *list,int 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)
{
//查找key的下表
int sub =search_data(list,key);//sub是key的下表
if (sub==-1)
{
printf("修改失败\n");
return -1;
}
//调用按下表修改
update_sub(list ,sub,e);
return 0;
}
/*
* function: 按元素删除
* @param [ in] 顺序表 要被删除的元素
* @param [out]
* @return 成功返回0 失败返回-1
*/
int delete_data(seqlist *list,int key)
{
//查找key的下表
int sub =search_data(list,key);//sub是key的下表
if (sub==-1)
{
printf("删除失败\n");
return -1;
}
//调用按下表删除
delete_sub(list ,sub);
return 0;
}
作业二、顺序表排序【类似数组排序】
比较:if(list->data[j] > list->data[j+1])
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX 100 //线性长度
typedef struct
{
int *data; //数据元素
int len; //顺序表长度
int listsize;//最大容量
}seqlist;
//在堆区申请空间
seqlist *create()
{
seqlist *list =(seqlist *)malloc(sizeof(seqlist));
if(list==NULL)
return NULL;
list->len=0;//把顺序表清空
return list;
}
//初始化新的顺序表
int new_seqlist(seqlist *list)
{
list->data =(int *)malloc(MAX*sizeof(int));
if(!list->data)
exit(0);
list->len=0; //初始化长度为0
list->listsize=MAX;//最大容量
return 1; //构造成功返回1
}
//手动输入生成顺序表
void crea_seqlist(seqlist *list)
{
int i,n=0,s;
printf("请输入所输字符串长度:\n");
scanf("%d",&s);
for(i=0;i<s;i++)
{
scanf("%d",&n);
list->data[i]=n;
}
list->len=i;
printf("输入成功!\n");//返回当前长度
}
//冒泡排序对输入表进行排序
void sequence(seqlist *list)
{
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])//生序排列
{
int temp =list->data[j];
list->data[j]=list->data[j+1];
list->data[j+1]=temp;
}
}
for (int z=0;z<list->len;z++)
printf("%d",list->data[z]);
printf("\n");
}
}
int main(int argc, const char *argv[])
{
char ch;
seqlist a,b,c;
seqlist *list=create();
if(new_seqlist(&a))
{
crea_seqlist(&a);
sequence(&a);
}
return 0;
}