1.数据结构脑图(未完)
2.顺序表其他操作
3.功能函数封装
4 完整代码
1>头文件test.h
#ifndef __TEST_H__
#define __TEST_H__
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
//宏定义 线性表的最大容量
#define MAX 30
//类型重定义 表示要存放的数据的类型
//typedef int datatype;
//定义顺序表的结构图类型
typedef struct sequence
{
int data[MAX];
int len;
}seqlist,*seqlistPtr;
//创建顺序表
seqlistPtr seq_create();
//判空
int empty(seqlistPtr S);
//判满
int fill(seqlistPtr S);
//尾部插入数据
int seq_add(seqlistPtr S,int e);
//遍历
void show(seqlistPtr S);
//任意位置插入1
int insert(seqlistPtr S,int index,int value);
//任意位置插入2
int index_add(seqlistPtr S,int index,int e);
//任意位置删除
int index_del(seqlistPtr S,int index);
//任意位置修改
void index_change(seqlistPtr S,int index,int e);
//按值查找
int value_index(seqlistPtr S, int e);
//去重
void repeat(seqlistPtr S);
//销毁
void my_free(seqlistPtr *S);
#endif
2.>源文件test.c
#include "test.h"
//1.
// 创建一个顺序表
seqlistPtr seq_create()
{//在堆区申请顺序表的大小空间,返回主程序使用
seqlistPtr S=(seqlistPtr)malloc(sizeof(seqlist));
//判断申请空间是否合法
if (NULL==S)
{
printf("创建失败\n");
return NULL;
}
printf("创建成功\n");
//顺序表长度置零
S->len=0;
//数组清空
memset(S->data,0,sizeof(S->data));
return S;
}
//2
// 判空
int empty(seqlistPtr S)
{
//判断接受的顺序表是否为空
if (NULL==S)
{
printf("判空失败\n");
return -1;
}
//判断顺序表长度是否为0
return S->len==0;
}
//3.
// 判满
int fill(seqlistPtr S)
{
if (NULL==S)
{
printf("判满失败\n");
return -1;
}
//判断顺序表的长度和顺序表长度最大容量是否相等
return S->len==MAX;
}
//4.
// 顺序表的增加
int seq_add(seqlistPtr S,int e)
{
//判断接受的顺序表是否合法
//判满
if (NULL==S ||fill(S))
{
printf("增加失败\n");
return 0;
}
//放入数据
S->data[S->len]=e;
//增加成功 顺序表长度自增
S->len++;
return 1;
}
//5
// 顺序表的遍历
void show(seqlistPtr S)
{
//判断接受的顺序表是否合法
//判空
if (NULL==S ||empty(S))
{
printf("遍历失败\n");
return ;
}
for (int i=0;i<S->len;i++)
{
printf("%d ",S->data [i]);
}
printf("\n");
}
//6
// 在顺序表插入一个数
int insert(seqlistPtr S,int index,int value)
{
if (index <0||index>S->len||S->len>=MAX)
{
printf("插入位置不合法\n");
return 0;
}
for (int i=S->len;i>index;i--)
{
S->data[i]=S->data[i-1];
}
S->data[index]=value;
S->len++;
return 1 ;
}
//7.
//在顺序表插入一个数方法2
int index_add(seqlistPtr S,int index,int e)
{
if (NULL==S||fill(S)||index<=0||index>S->len+1)
{
printf("插入失败\n");
return 0;
}
// 插入位置对应下标
index= index-1;
for(int i=0;i<S->len-index;i++)
{
S->data[S->len-i]=S->data[S->len-1-i];
}
S->data[index]=e;
S->len++;
return 1;
}
//8.
// 任意位置删除
int index_del(seqlistPtr S,int index)
{
if (NULL==S||empty(S)||index<0||index>S->len)
{
printf("删除失败\n");
return 0;
}
// index-=1;
for(int i= index;i<S->len;i++)
{
S->data[i]=S->data[i+1];
}
S->len--;
return 1;
}
//9.
// 通过位置修改
void index_change(seqlistPtr S,int index,int e)
{
if (NULL==S||empty(S)||index<0||index>S->len)
{
printf("修改失败\n");
return ;
}
//修改
// S->data[index-1]=e;
S->data[index]=e;
}
//10
// 根据值查找下标
int value_index(seqlistPtr S, int e)
{
if (NULL==S||empty(S))
{
printf("查找失败");
return -1;
}
for (int i=0;i<S->len;i++)
{
if (S->data[i]==e)
{
printf("%d \n",i);
return i;
}
}
printf("查无此数");
return -1;
}
//11
// 去除重复数据
void repeat(seqlistPtr S)
{
if (NULL==S||S->len<=1)
{ printf("去重失败");
return;
}
for (int i=0;i<S->len;i++)
{
for(int j=i+1;j<S->len;j++)
if (S->data[i]==S->data[j])
{
index_del (S,j);
j--;
}
}
}
// 12
// 释放内存
void my_free(seqlistPtr *S)
{
if(NULL==*S)
{
printf("销毁失败");
return ;
}
free (*S);
S=NULL ;
printf("销毁成功");
}
3>测试文件main.c
#include "test.h"
int main(int argc, const char *argv[])
{
//创建顺序表
seqlistPtr S=seq_create();
//顺序表的增加(尾插)
seq_add(S,10);
seq_add(S,20);
seq_add(S,30);
seq_add(S,40);
seq_add(S,50);
show(S);
//任意位置插入数据1方法
insert(S,0,1);
insert(S,1,2);
insert(S,2,3);
show(S);
//任意位置插入数据2方法
index_add(S,5,666);
show(S);
//删除指定位置的数据
index_del(S,0);
show(S);
//修改指定位置数据
index_change(S,0,99);
show(S);
//按值查找
value_index(S,666);
show(S);
//按值查找并删除
index_del(S,value_index(S,666));
show(S);
//尾部插入多个数据
seq_add(S,10);
seq_add(S,20);
seq_add(S,30);
seq_add(S,10);
seq_add(S,10);
seq_add(S,20);
seq_add(S,20);
seq_add(S,40);
seq_add(S,30);
seq_add(S,50);
show(S);
//去重
repeat(S);
show(S);
return 0;
}