分文件编译:通过在主函数(main.c)中调用 test.c 当中的自定义函数实现顺序表的数据操作
顺序表空间申请:
seqlist *create()
{
seqlist *list=(seqlist *)malloc(sizeof(seqlist));
if(list==NULL)
return NULL;
list->len=0;//把顺序表清空
return list;
}
输出函数:
void output(seqlist *list)
{
puts("");
for(int i=0;i<list->len;i++)
printf("%d\t",list->date[i]);
puts("");
}
一、顺序表按元素删除
思路:参数【顺序表 删除的值key】
1.根据删除的元素得到下标
2.根据下标实现【按下标删除】
完整的head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 7
typedef int datetype; //给int起别名datetype
typedef struct
{
//数据元素
datetype date[MAXSIZE];
//顺序表长度
int len;
}seqlist;
seqlist *create();
void output(seqlist *list);
int full_seqlist(seqlist *list);
int insert_rear(seqlist *list,datetype e);
int empty_seqlist(seqlist *list);
int delete_rear(seqlist *list);
int search_sub(seqlist *list,int sub);
int replay_sub(seqlist *list,int sub,datetype e);
int insert_sub(seqlist *list,int sub,datetype e);
int delete_sub(seqlist *list,int sub);
int search_date(seqlist *list , datetype k);
int update_date(seqlist *list,datetype k,datetype e);
void bubble_date(seqlist *list);
int delete_date(seqlist *list,datetype s,datetype e);
#endif
完整的main.c
#include "head.h"
int main(int argc, const char *argv[])
{
seqlist *list=create();
int n;
datetype 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);
replay_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);
datetype k;
printf("输入需要查找的值:");
scanf("%d",&k);
int flag=search_date(list,k);
if(k==-1)
printf("查找失败\n");
else
printf("在下标%d出现\n",k);
printf("输入被修改的值:");
scanf("%d",&k);
printf("输入要修改的值:");
scanf("%d",&e);
update_date(list,k,e);
output(list);
datetype s;
printf("输入要删除的值");
scanf("%d",&s);
int m=search_date(list,s);
if(m==-1)
printf("查找失败\n");
else
printf("在下标%d处被删除\n",s);
printf("顺序表排序的结果为:");
bubble_date(list);
output(list);
return 0;
}
完整的test.c
#include "head.h"
seqlist *create()
{
seqlist *list=(seqlist *)malloc(sizeof(seqlist *));
if(list==NULL)
return NULL;
list->len=0;//顺序表清零
return list;
}
int full_seqlist(seqlist *list)
{
//在尾部插入,成功返回0,失败返回-1
return list->len==MAXSIZE?-1:0;
}
int insert_rear(seqlist *list,datetype e)
{
if(full_seqlist(list))
{
printf("顺序表已满!\n");
return -1;
}
list->date[list->len]=e;//赋值
list->len++;//充当下标计算个数
return 0;
}
void output(seqlist *list)
{
puts("");
for(int i=0;i<list->len;i++)
printf("%d\t",list->date[i]);
puts("");
}
int empty_seqlist(seqlist *list)
{
return list->len==0?-1:0;
}
int delete_rear(seqlist *list)
{
if(empty_seqlist(list))
{
printf("顺数表为空\n");
return -1;
}
list->len--;
return 0;
}
int search_sub(seqlist *list,int sub)
{
if(empty_seqlist(list)||sub<0 ||sub>=list->len)
{
printf("顺序表查询失败!\n");
return -1;
}
printf("查找的元素是:%d\n",list->date[sub]);
return 0;
}
int replay_sub(seqlist *list,int sub,datetype e)
{
if(empty_seqlist(list)||sub<0 ||sub>=list->len)
{
printf("修改失败!\n");
return -1;
}
list->date[sub]=e;
return 0;
}
int insert_sub(seqlist *list,int sub,datetype e)
{
if(empty_seqlist(list)||sub<0 || sub>list->len)
{
printf("插入失败!\n");
return -1;
}
for(int i=list->len-1;i>=sub;i--)
list->date[i+1]=list->date[i];//后移
list->date[sub]=e;
list->len++;
return 0;
}
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->date[i-1]=list->date[i];//前移
list->len--;
return 0;
}
//顺序表按元素查找
int search_date(seqlist *list , datetype k)
{
for(int i=0;i<list->len;i++)
{
if(list->date[i]==k)
return i;
}
return -1;
}
/*
* function: 按元素修改
* @param [ in] 顺序表 被修改的值 要修改的值
* @param [out]
* @return 成功返回0失败返回-1
*/
int update_date(seqlist *list,datetype k,datetype e)
{
//1,查找k的下表
int sub=search_date(list,k);//sub表示k的下标
if(sub==-1)
{
printf("修改失败\n");
return -1;
}
//2,调用按下标修改
replay_sub(list,sub,e);
return 0;
}
//顺序表按元素删除
int delete_date(seqlist *list,datetype s,datetype e)
{
int sub=search_date(list,s);
if(sub==-1)
{
printf("删除失败!\n");
return -1;
}
//调用按下标删除
delete_sub(list,sub);
return 0;
}
//顺序表排序
void bubble_date(seqlist *list)
{
for(int i=0;i<list->len-1;i++)
for(int j=0;j<list->len-1-i;j++)
if(list->date[j]>list->date[j+1])
{
int temp = list->date[j];
list->date[j]=list->date[j+1];
list->date[j+1]=temp;
}
}
整体练习结果
二、顺序表排序【类似数组排序】
比较:if( list->data[j] > list->data[j+1])
head.h
函数声明:
seqlist *create(); //申请顺序表内存空间声明
void output(seqlist *list);//输出函数声明
void bubble_date(seqlist *list);//排序函数声明
main.c
函数调用:
int main()
{
seqlist *list=create();
int n;
printf("输入数据元素的个数:");
scanf("%d",&n);
printf("顺序表排序的结果为:");
bubble_date(list);
output(list);
return 0;
}
test.c
自定义冒泡函数:
//顺序表排序
void bubble_date(seqlist *list)
{
for(int i=0;i<list->len-1;i++)
for(int j=0;j<list->len-1-i;j++)
if(list->date[j]>list->date[j+1])
{
int temp = list->date[j];
list->date[j]=list->date[j+1];
list->date[j+1]=temp;
}
}
排序结果: