搭建个场景:将学生的信息,以顺序表的方式存储(堆区),并且实现封装函数
1】顺序表的创建,
2】判满、
3】判空、
4】往顺序表里增加学生
5】遍历、
6】任意位置插入学生
7】任意位置删除学生
8】修改、
9】查找(按学生的学号查找)
10】去重、
11】销毁顺序表
头文件:seqStudent.h
#ifndef _SEQSTUDENT_H
#define _SEQSTUDENT_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSTR 20 //最大字符串长度
#define MAX 100 //最大顺序表长度
typedef struct Student //定义存储学生信息的结构体
{
int id; //学号
char name[MAXSTR]; //学生姓名
int age; //年龄
}Student;
typedef Student DateType;
typedef struct seqStudents
{
DateType date[MAX]; //用数组来存放连续的数据
int len; //顺序表的长度
}seqStudents,*seqStudentsPtr; //顺序表的定义
//在堆区创建顺序表函数
seqStudentsPtr create();
//顺序表判满函数
int fill(seqStudentsPtr S);
//顺序表判空函数
int empty(seqStudentsPtr S);
//获取一条学生信息函数
DateType gete();
//往顺序表里面增加学生函数
int add(seqStudentsPtr S,DateType e);
//遍历顺序表函数
void show(seqStudentsPtr S);
//在任意指定下标位置插入学生函数
int insert(seqStudentsPtr S,int n,DateType e);
//删除任意指定下标位置学生函数
int del(seqStudentsPtr S,int n);
//修改指定位置的学生信息函数
int update(seqStudentsPtr S,int n,DateType e);
//按学生的学号查找学生函数,返回下标,失败-1
int find(seqStudentsPtr S,int id);
//顺序表去重函数
void delrepeate(seqStudentsPtr S);
//销毁顺序表函数
void seqfree(seqStudentsPtr *S);
#endif
源文件:seqStudent.c
#include "seqStudent.h"
//在堆区创建顺序表函数
seqStudentsPtr create()
{
seqStudentsPtr S=(seqStudentsPtr)malloc(sizeof(seqStudents));
if(NULL==S)
{
printf("fail create\n");
return NULL;
}
memset(S->date,0,sizeof(S->date)); //清空顺序表元素
S->len=0; //顺序表吃长度置零
printf("seccess create\n");
return S;
}
//顺序表判满函数
int fill(seqStudentsPtr S)
{
if(NULL==S)
{
printf("fail fill\n");
return -1;
}
if(S->len==MAX)
{
return 1;
}else{
return 0;
}
}
//顺序表判空函数
int empty(seqStudentsPtr S)
{
if(NULL==S)
{
printf("fail empty\n");
return -1;
}
if(S->len==0)
{
return 1;
}else
{
return 0;
}
}
//获取一条学生信息函数
DateType gete()
{
DateType e;
printf("请输入学生信息:\n");
printf("学号:");
scanf("%d",&e.id);
printf("姓名:");
scanf("%s",e.name);
printf("年龄:");
scanf("%d",&e.age);
return e;
}
//往顺序表里面增加学生函数
int add(seqStudentsPtr S,DateType e)
{
if(NULL==S||fill(S))
{
printf("fail add\n");
return 0;
}
//添加学生信息
S->date[S->len].id=e.id;
strcpy(S->date[S->len].name,e.name);
S->date[S->len].age=e.age;
S->len++; //顺序表的长度自增
printf("seccess add\n");
return 1;
}
//遍历顺序表函数
void show(seqStudentsPtr S)
{
if(NULL==S||empty(S))
{
printf("fail show\n");
return;
}
for(int i=0;i<S->len;i++)
{
printf("[%d] 学号:%d\t学生姓名:%s\t年龄:%d\n",i,S->date[i].id,S->date[i].name,S->date[i].age);
}
}
//在任意指定下标位置插入学生函数
int insert(seqStudentsPtr S,int n,DateType e)
{
if(NULL==S||fill(S)||n<0||n>S->len)
{
printf("fail insert\n");
return 0;
}
for(int i=S->len;i>n;i--) //腾出指定位置
{
S->date[i].id=S->date[i-1].id;
strcpy(S->date[i].name,S->date[i-1].name);
S->date[i].age=S->date[i-1].age;
}
//插入信息
S->date[n].id=e.id;
strcpy(S->date[n].name,e.name);
S->date[n].age=e.age;
S->len++;
printf("seccess insert\n");
return 1;
}
//删除任意指定下标位置学生函数
int del(seqStudentsPtr S,int n)
{
if(NULL==S||empty(S)||n<0||n>=S->len)
{
printf("fail del\n");
return 0;
}
for(int i=n;i<S->len;i++)
{
S->date[i].id=S->date[i+1].id;
strcpy(S->date[i].name,S->date[i+1].name);
S->date[i].age=S->date[i+1].age;
}
S->len--;
printf("seccess del\n");
return 1;
}
//修改指定位置的学生信息函数
int update(seqStudentsPtr S,int n,DateType e)
{
if(NULL==S||empty(S)||n<0||n>=S->len)
{
printf("fail update\n");
return 0;
}
//修改信息
S->date[n].id=e.id;
strcpy(S->date[n].name,e.name);
S->date[n].age=e.age;
printf("seccess update\n");
return 1;
}
//按学生的学号查找学生函数,返回下标,失败-1
int find(seqStudentsPtr S,int id)
{
if(NULL==S||empty(S))
{
printf("fail find\n");
return -1;
}
for(int i=0;i<S->len;i++)
{
if(S->date[i].id==id)
{
printf("find index:%d\n",i);
return i;
}
}
printf("find no id\n");
return -1;
}
//顺序表去重函数
void delrepeate(seqStudentsPtr S)
{
if(NULL==S||empty(S))
{
printf("fail delrepeate\n");
return;
}
for(int i=0;i<S->len-1;i++)
{
for(int j=i+1;j<S->len;j++)
{
if(S->date[i].id==S->date[j].id && strcmp(S->date[i].name,S->date[j].name)==0 && S->date[i].age==S->date[j].age)
{
del(S,j); //调用删除学生函数
j--; //防止漏删除
}
}
}
printf("seccess delrepeate\n");
}
//销毁顺序表函数
void seqfree(seqStudentsPtr *S)
{
if(NULL==S||NULL==*S)
{
printf("fail seqfree\n");
return;
}
free(*S);
*S=NULL; //防止野指针
printf("seccess seqfree\n");
}
主函数文件:main.c
#include "seqStudent.h"
int main(int argc, const char *argv[])
{
//测试代码
//创建一个学生信息顺序表
seqStudentsPtr S=create();
printf("判满输出:%d\n",fill(S));
printf("判空输出:%d\n",empty(S));
//获取学生信息函数测试,add函数测试,show函数测试
DateType e=gete();
add(S,e);
add(S,e);
add(S,e);
add(S,gete());
add(S,gete());
show(S);
//指定下标位置添加
insert(S,2,gete());
show(S);
//指定下标位置删除
del(S,2);
show(S);
//按学号查找学生
int id=0;
printf("请输入查找学生的学号:");
scanf("%d",&id);
find(S,id);
printf("请输入查找学生的学号:");
scanf("%d",&id);
find(S,id);
//去重
delrepeate(S);
show(S);
//释放顺序表
seqfree(&S); //用二级指针不会有段错误
return 0;
}
编译指令
gcc *.c
./a.out